From 024627dba131598b3e59620fbf688a67dbd75d4d Mon Sep 17 00:00:00 2001
From: "Mirar (Pontus Hagland)" <pike@sort.mirar.org>
Date: Fri, 27 Feb 1998 03:23:44 +0100
Subject: [PATCH] sequence number bugfix

Rev: lib/modules/Protocols.pmod/X.pmod/Xlib.pmod:1.28
---
 lib/modules/Protocols.pmod/X.pmod/Xlib.pmod | 80 +++++++++++++--------
 1 file changed, 49 insertions(+), 31 deletions(-)

diff --git a/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod b/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod
index bed9647994..57480801d8 100644
--- a/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod
+++ b/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod
@@ -175,6 +175,7 @@ class Display
 
 #ifdef DEBUG
   mapping debug_requests = ([ ]);
+  #define DEBUGREQ(X) ((X)&0xfff)
 #endif
   
   void create()
@@ -226,6 +227,8 @@ class Display
   /* This function leaves the socket in blocking mode */
   int flush()
   { /* FIXME: Not thread-safe */
+    werror("flush\n");
+    
     set_blocking();
     int written = write(buffer);
     if (written < strlen(buffer))
@@ -423,7 +426,7 @@ class Display
 		       m->minorCode, m->majorCode);
 		m->errorCode = _Xlib.error_codes[errorCode];
 #ifdef DEBUG
-		m->failed_request = debug_requests[m->sequenceNumber];
+		m->failed_request = debug_requests[DEBUGEQ(m->sequenceNumber)];
 #endif
 #if 0
 		if (m->errorCode == "Success")
@@ -690,6 +693,7 @@ class Display
     array a;
     while(a = pending_actions->get())
       handle_action(a);
+    werror("process_pending_actions: nonblock\n");
     set_nonblocking(read_callback, write_callback, close_callback);
   }
 	  
@@ -745,6 +749,7 @@ class Display
       {
 	if (!is_local)
 	  open_socket();
+        werror("open: block\n");
 	set_nonblocking(0, 0, close_callback);
       }
     if(!is_local)
@@ -752,7 +757,11 @@ class Display
 	int port =  XPORT + (int)fields[1];
 	werror(sprintf("Xlib: Connecting to %s:%d\n", host, port));
 	if (!connect(host, port))
+	{
+  	  werror(sprintf("Xlib: Connecting to %s:%d failed\n", host, port));
 	  return 0;
+	}
+	werror(sprintf("Xlib: Connected to %s:%d\n", host, port));
       }
 
     set_buffer( 65536 );
@@ -779,6 +788,7 @@ class Display
     send(msg);
     if (async)
       {
+	 werror("open: nonblock\n");
 	set_nonblocking(read_callback, write_callback, close_callback);
 	return 1;
       }
@@ -800,6 +810,7 @@ class Display
 	    {
 	    case ACTION_CONNECT:
 	      get_keyboard_mapping();
+	      werror("connect: nonblock\n");
 	      set_nonblocking(read_callback, write_callback, close_callback);
 	      return 1;
 	    case ACTION_CONNECT_FAILED:
@@ -817,9 +828,9 @@ class Display
     string data = req->to_string();
     send(data);
 #ifdef DEBUG
-    debug_requests[sequence_number & 0x7fff] = data;
+    debug_requests[DEBUGREQ(sequence_number)] = data;
 #endif
-    return sequence_number++ & 0x7fff;
+    return sequence_number++;
   }
 
   array blocking_request(object req)
@@ -828,45 +839,52 @@ class Display
     mixed result = 0;
     int done = 0;
 
+    werror("br: %O\n",mkmapping(indices(req),values(req)));
+
     int n = send_request(req);
     flush();
-    
+
     while(!done)
-      {
-	string data = read(0x7fffffff, 1);
-	if (!data)
+    {
+werror("waiting for reply on "+n+"...\n");
+       string data = read(0x7fffffff, 1);
+       if (!data)
+       {
+	  call_out(close_callback, 0);
+	  return ({ 0, 0 });
+       }
+       received->add_data(data);
+       array a;
+       while (a = process())
+       {
+werror("got reply "+a[0]+": "+a[1]->sequenceNumber+"...\n");
+	  if ((a[0] == ACTION_REPLY)
+	      && (a[1]->sequenceNumber == n))
 	  {
-	    call_out(close_callback, 0);
-	    return ({ 0, 0 });
+	     result = req->handle_reply(a[1]);
+	     done = 1;
+	     success = 1;
+	     break;
 	  }
-	received->add_data(data);
-	array a;
-	while (a = process())
+	  else if ((a[0] == ACTION_ERROR)
+		   && (a[1]->sequenceNumber == n))
 	  {
-	    if ((a[0] == ACTION_REPLY)
-		&& (a[1]->sequenceNumber == n))
-	      {
-		result = req->handle_reply(a[1]);
-		done = 1;
-		success = 1;
-		break;
-	      }
-	    else if ((a[0] == ACTION_ERROR)
-		     && (a[1]->sequenceNumber == n))
-	      {
-		result = req->handle_error(a[1]);
-		done = 1;
-		break;
-	      }
-	    /* Enqueue all other actions */
-	    pending_actions->put(a);
+	     result = req->handle_error(a[1]);
+	     done = 1;
+	     break;
 	  }
-      }
+	  /* Enqueue all other actions */
+	  pending_actions->put(a);
+       }
+    }
 
     if (!pending_actions->is_empty())
       call_out(process_pending_actions, 0);
     else
-      set_nonblocking(read_callback,write_callback,close_callback);
+    {
+       werror("blocking_request: nonblock\n");
+       set_nonblocking(read_callback,write_callback,close_callback);
+    }
 
     return ({ success, result });
   }
-- 
GitLab