Location: lg@xxxxxxxxxxxxxx http://arch.xwem.org/2005/
Revision: xlib--main--2.1--patch-3
Archive: lg@xxxxxxxxxxxxxx
Creator: Zajcev Evgeny <lg@xxxxxxxx>
Date: Wed Feb 2 02:04:15 MSK 2005
Standard-date: 2005-02-01 23:04:15 GMT
Modified-files: lisp/xlib-xr.el
New-patches: lg@xxxxxxxxxxxxxx/xlib--main--2.1--patch-3
Summary: Root of most of the X timeout problems founded at last
Keywords: One line, message, parsing, reentrance, bug
* lisp/xlib-xr.el (X-Dpy-send-read): [BUG fix] Root of most of X timeout
errors founded here. This is response parsing problem. In some
circumstances we can request X server for data, while processing data.
This eventually lead to desyncronization. This is caused by
xwem-misc-xerr-hook, which can be called from inside `X-Dpy-send-read'
and xwem-misc-xerr-hook can also do `X-Dpy-send-read', now we restrict
`X-Dpy-send-read' reentering to avoid desyncronization. This is quite
rarely situation when `X-Dpy-send-read' reenters, but when it happens
xlib hangs forever.
Many thanks to all of you guys for pushing me about this stuff!
* lisp/xlib-xr.el (xxx): [misc] Some tiny cleanups, and more some logs
added. Errors raising clarified, etc.
* added files
{arch}/xlib/xlib--main/xlib--main--2.1/lg@xxxxxxxxxxxxxx/patch-log/patch-3
* modified files
--- orig/lisp/xlib-xr.el
+++ mod/lisp/xlib-xr.el
@@ -767,7 +767,7 @@
;;; Protecting macros
(defmacro X-Dpy-read-excursion (xdpy &rest forms)
"Execute FORMS in reading mode."
- `(let ((gc-cons-threshold most-positive-fixnum)) ; inhibit GC'ing
+ `(let ((gc-cons-threshold most-positive-fixnum)) ; inhibit GC'ing
(incf (X-Dpy-readings ,xdpy))
(prog1
(condition-case err
@@ -779,17 +779,15 @@
(defun X-Dpy-send-read (xdpy s rf)
"Send S to display XDPY and receive answer according to receive fields RF."
- (let (reqid)
- ;; Remember request id
- (setq reqid (X-Dpy-rseq-id xdpy))
-
- ;; Flush output buffer
- (X-Dpy-send xdpy s)
- (X-Dpy-send-flush xdpy)
+ ;; Can't read while already reading! --lg
+ (when (zerop (X-Dpy-readings xdpy))
+ (let ((reqid (X-Dpy-rseq-id xdpy))) ; Remember request id
+ ;; Flush output buffer
+ (X-Dpy-send xdpy s)
+ (X-Dpy-send-flush xdpy)
- (X-Dpy-read-excursion xdpy
- (X-Dpy-parse-message rf reqid xdpy)
- )))
+ (X-Dpy-read-excursion xdpy
+ (X-Dpy-parse-message rf reqid xdpy)))))
;;;###autoload
(defvar X-default-timeout 60
@@ -905,8 +903,10 @@
;; Here is event or error arrived, process
;; errors in time or store event in events
;; queue.
- (catch 'processed
-
+ (let ((need-processing t)
+ pmsg)
+ (X-Dpy-log xdpy 'x-error "!::: %d bytes pending ..
need to process %S request"
+ '(length (X-Dpy-message-buffer xdpy))
'message-s)
(condition-case xerr
(X-Dpy-parse-event xdpy (Xforcenum (aref result
0)))
(X-Error
@@ -915,13 +915,19 @@
;; evaluating.
(X-Dpy-log xdpy 'x-error "Get ERROR seq: %d,
rseq-id: %d"
'(X-Event-seq (cadr xerr)) 'req-id)
+ (X-Dpy-log xdpy 'x-error "%d bytes pending ..
need to process %S request"
+ '(length (X-Dpy-message-buffer xdpy))
'message-s)
(when (= (X-Event-seq (cadr xerr)) (logand req-id
65535))
- (throw 'processed (setq result nil)))))
+ (setq result nil
+ need-processing nil)))
+ (t (apply 'error (car xerr) (cdr xerr))))
;; Repeat processing XXX excluding t or nil
- (let ((pmsg (X-Dpy-parse-message message-s req-id
xdpy arglist)))
- (setq result (car pmsg))
- (cdr pmsg))))
+ (if (not need-processing)
+ (setq result nil)
+ (setq pmsg (X-Dpy-parse-message message-s req-id
xdpy arglist)
+ result (car pmsg))
+ (cdr pmsg))))
)))
(setq rlist (cons result sublst)))
@@ -1018,13 +1024,22 @@
(evetype (Xforcenum (aref result 0))))
(cond ((= evetype 1) ; reply, should not happen
- (X-Dpy-log xdpy 'x-error "Got unknown reply")
- nil)
-
+ (X-Dpy-log xdpy 'x-error "Got unknown reply, while expecting
XEvent! CRITICAL!")
+ (error "Got unknown reply, while expecting XEvent!"))
+ ((>= evetype X-MaxEvent)
+ (X-Dpy-log xdpy 'x-error "Got XEvent id greater than X-MaxEvent!
CRITICAL!")
+ (error (format "Got X Event id(%d) greater than X-MaxEvent!"
evetype)))
(t (X-Dpy-parse-event xdpy evetype))) ; error or event
)))
;; Events/Errors dispatchers
+(defun X-Dpy-run-error-hooks (xdpy xev)
+ "Run XDPY's error hooks."
+ (when (X-Dpy-error-hooks xdpy)
+ (mapcar (lambda (fun)
+ (funcall fun xdpy xev))
+ (X-Dpy-error-hooks xdpy))))
+
(defun X-Dpy-error-dispatch (xev)
"Dispatch error event XEV."
(let ((xdpy (X-Event-dpy xev)))
@@ -1068,14 +1083,10 @@
(X-Dpy-log xdpy 'x-error "Got error event %d!!!"
'(X-Event-xerror-code xev))))
;; Now run hooks if any
- (when (X-Dpy-error-hooks xdpy)
- (mapcar (lambda (fun)
- (funcall fun xdpy xev))
- (X-Dpy-error-hooks xdpy)))
+ (X-Dpy-run-error-hooks xdpy xev)
;; Finnally signal an error.
- (error 'X-Error xev)
- ))
+ (error 'X-Error xev)))
;;; Some usefull macroses (NOT USED)
(defmacro X-Generic-enqueue (obj queue)
@@ -1141,8 +1152,7 @@
(if (= (X-Event-type xev) 0)
;; Dispatch this error
- (X-Dpy-error-dispatch xev)
-
+ (X-Dpy-error-dispatch xev)
(X-Dpy-event-enqueue xdpy xev))
xev)))
@@ -1153,9 +1163,9 @@
(X-Dpy-p xdpy 'X-Dpy-parse-message-guess)
;; If no-one reading now, mean than error or event arrived.
- (when (zerop (X-Dpy-readings xdpy))
- (while (> (length (X-Dpy-message-buffer xdpy)) 0)
- (X-Dpy-eval-error-or-event xdpy))))
+ (while (and (zerop (X-Dpy-readings xdpy))
+ (> (length (X-Dpy-message-buffer xdpy)) 0))
+ (X-Dpy-eval-error-or-event xdpy)))
(provide 'xlib-xr)
|