[M3devel] pthread_self == null?

Jay K jay.krell at cornell.edu
Mon Jul 26 13:18:26 CEST 2010


I don't see that the standard prohibits NULL from being a valid pthread_t.
?
I happened upon this only due to a problem though: OpenBSD x86 4.6 -lX11 -static gives a broken pthreads.


We should add an extra boolean to this code, like, before:


VAR
  holder: pthread_t;
  inCritical := 0;

PROCEDURE LockHeap () =
  VAR self := pthread_self();
  BEGIN
    IF pthread_equal(holder, self) = 0 THEN
      WITH r = pthread_mutex_lock(heapMu) DO <*ASSERT r=0*> END;
      holder := self;
    END;
    INC(inCritical);
  END LockHeap;

PROCEDURE UnlockHeap () =
  BEGIN
    <*ASSERT pthread_equal(holder, pthread_self()) # 0*>
    DEC(inCritical);
    IF inCritical = 0 THEN
      holder := NIL;
      WITH r = pthread_mutex_unlock(heapMu) DO <*ASSERT r=0*> END;
    END;
  END UnlockHeap;



after:

VAR
  holder: pthread_t;
+  holder_valid: BOOLEAN;
  inCritical := 0;

PROCEDURE LockHeap () =
  VAR self := pthread_self();
  BEGIN
*    IF NOT holder_valid OR pthread_equal(holder, self) = 0 THEN
      WITH r = pthread_mutex_lock(heapMu) DO <*ASSERT r=0*> END;
      holder := self;
+     holder_valid := TRUE;  
    END;
    INC(inCritical);
  END LockHeap;

PROCEDURE UnlockHeap () =
  BEGIN
*    <*ASSERT holder_valid AND pthread_equal(holder, pthread_self()) # 0*>
    DEC(inCritical);
    IF inCritical = 0 THEN
      holder := NIL;
+     holder_valid := FALSE  

      WITH r = pthread_mutex_unlock(heapMu) DO <*ASSERT r=0*> END;
    END;
  END UnlockHeap;


I think so.


 - Jay

 		 	   		  


More information about the M3devel mailing list