xquartz dereferencing a NULL pointer (patch 2)

Jeremy Huddleston jeremyhu at freedesktop.org
Wed Nov 5 12:16:57 PST 2008


On Nov 5, 2008, at 11:37, George Peter Staplin wrote:

>
> On Nov 5, 2008, at 10:35 AM, Jeremy Huddleston wrote:
>> I see two possibilities for handling this:
>>
>> 1) Lock inside mieqProcessInputEvents
>
> I think the pthread locking is actually safe in xquartz.  I can't  
> find any places calling mieqEnqueue from a signal handler, so that  
> comment I made earlier about signals and deadlocks probably doesn't  
> apply to XQuartz.
>
>>
>> 2) Disable this optimization when we have multiple threads playing  
>> with mieqEventQueue and just push a second MotionNotify event.
>
> Hmm, I don't fully understand that.  Can you explain more?

1) Lock inside mieqProcessInputEvents (this is based off of xorg- 
server-1.4-apple... but the concept applies to master after Peter  
pushes the changes discussed over the past couple days)

diff --git a/mi/mieq.c b/mi/mieq.c
index e93d24f..a634bf8 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -235,6 +236,10 @@ mieqProcessInputEvents(void)
      int x = 0, y = 0;
      DeviceIntPtr dev = NULL;

+#ifdef INPUT_THREAD
+    pthread_mutex_lock(&miEventQueueMutex);
+#endif
+
      while (miEventQueue.head != miEventQueue.tail) {
          if (screenIsSaved == SCREEN_SAVER_ON)
              SaveScreens (SCREEN_SAVER_OFF, ScreenSaverReset);
@@ -249,6 +254,10 @@ mieqProcessInputEvents(void)
          memcpy(&e, &miEventQueue.events[miEventQueue.head],  
sizeof(EventRec));
          miEventQueue.head = (miEventQueue.head + 1) % QUEUE_SIZE;

+#ifdef INPUT_THREAD
+        pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+
          if (miEventQueue.handlers[e.event[0].u.u.type]) {
              /* If someone's registered a custom event handler, let  
them
               * steal it. */
@@ -283,5 +292,14 @@ mieqProcessInputEvents(void)

              dev->public.processInputProc(e.event, dev, e.nevents);
          }
+
+#ifdef INPUT_THREAD
+        pthread_mutex_lock(&miEventQueueMutex);
+#endif
      }
+
+#ifdef INPUT_THREAD
+    pthread_mutex_unlock(&miEventQueueMutex);
+#endif
+
  }



2) Avoid the "replace the last motion-event with this one"  
optimization while using an input thread.  I think this is ugly, but  
I'm mentioning it for completeness.

diff --git a/mi/mieq.c b/mi/mieq.c
index 062dede..25136b2 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -122,7 +122,8 @@ mieqResizeEvents(int min_size)
  void
  mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
  {
-    unsigned int           oldtail = miEventQueue.tail, newtail;
+    unsigned int           oldtail = miEventQueue.tail;
+    unsigned int           newtail = oldtail;
      EventListPtr           evt;
      int                    isMotion = 0;
      int                    evlen;
@@ -164,11 +165,16 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
          return;
      }

+#ifndef INPUT_THREAD
      if (isMotion && isMotion == miEventQueue.lastMotion &&
          oldtail != miEventQueue.head) {
  	oldtail = (oldtail - 1) % QUEUE_SIZE;
+
+	miEventQueue.tail = oldtail;
      }
-    else {
+    else
+#endif
+    {
  	static int stuck = 0;
  	newtail = (oldtail + 1) % QUEUE_SIZE;
  	/* Toss events which come in late.  Usually this means your server's
@@ -184,7 +190,6 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
  	    return;
          }
  	stuck = 0;
-	miEventQueue.tail = newtail;
      }

      evlen = sizeof(xEvent);
@@ -218,6 +223,7 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
      miEventQueue.events[oldtail].pDev = pDev;

      miEventQueue.lastMotion = isMotion;
+    miEventQueue.tail = newtail;
  }

  void

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3040 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg/attachments/20081105/2ef7f08c/attachment.bin>


More information about the xorg mailing list