xwem-devel
[Top] [All Lists]

Summary for xlib--main--2.1--patch-3

From: Zajcev Evgeny <lg@xxxxxxxx>
Subject: Summary for xlib--main--2.1--patch-3
Date: Wed, 2 Feb 2005 02:04:20 +0300 (MSK)
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)




<Prev in Thread] Current Thread [Next in Thread>