[M3devel] elminating pthread_attr_t from cloned headers

Jay jay.krell at cornell.edu
Wed Feb 4 11:14:12 CET 2009


The following eliminates the only use of pthread_attr_t from the cloned headers, slightly reducing the work to port to new platforms. It introduces a "small" "portable" C wrapper to encompass the files lines of Modula-3 that use pthread_attr_t. ok?
 
 
Index: ThreadPThread.m3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/thread/PTHREAD/ThreadPThread.m3,v
retrieving revision 1.89
diff -u -r1.89 ThreadPThread.m3
--- ThreadPThread.m3 21 Jan 2009 15:25:03 -0000 1.89
+++ ThreadPThread.m3 4 Feb 2009 10:07:59 -0000
@@ -11,11 +11,10 @@
        Unix, Utime, Word, Upthread, Usched,
        Uerror, ThreadPThreadC, Uexec;
 FROM Upthread
-IMPORT pthread_t, pthread_cond_t, pthread_key_t, pthread_attr_t, pthread_mutex_t,
+IMPORT pthread_t, pthread_cond_t, pthread_key_t, pthread_mutex_t,
        PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER;
 FROM Compiler IMPORT ThisFile, ThisLine;
 FROM Ctypes IMPORT int;
-FROM Utypes IMPORT size_t;
 FROM ThreadPThreadC IMPORT SIG_SUSPEND;
 
 (*----------------------------------------------------- types and globals ---*)
@@ -561,9 +560,7 @@
   VAR
     act := NEW(Activation);
     t := CreateT(act);
-    attr: pthread_attr_t;
     size := defaultStackSize;
-    bytes: size_t;
   BEGIN
     (* determine the initial size of the stack for this thread *)
     TYPECASE closure OF
@@ -576,17 +573,12 @@
       t.id := nextId;  INC(nextId);
       IF perfOn THEN PerfChanged(t.id, State.alive) END;
 
-      WITH r = Upthread.attr_init(attr) DO  END;
-      WITH r = Upthread.attr_getstacksize(attr, bytes)  DO  END;
-      bytes := MAX(bytes, size * ADRSIZE(Word.T));
-      EVAL Upthread.attr_setstacksize(attr, bytes);
       act.next := allThreads;
       act.prev := allThreads.prev;
       act.size := size;
       allThreads.prev.next := act;
       allThreads.prev := act;
-      WITH r = Upthread.create(act.handle, attr, ThreadBase, act) DO
-        EVAL Upthread.attr_destroy(attr);
+      WITH r = ThreadPThreadC.thread_create(act.handle, size * ADRSIZE(Word.T), ThreadBase, act) DO
         IF r # 0 THEN
           RTError.MsgI(ThisFile(), ThisLine(),
                        "Thread client error: Fork failed with error: ", r);
Index: ThreadPThreadC.c
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/thread/PTHREAD/ThreadPThreadC.c,v
retrieving revision 1.8
diff -u -r1.8 ThreadPThreadC.c
--- ThreadPThreadC.c 21 Jan 2009 15:25:03 -0000 1.8
+++ ThreadPThreadC.c 4 Feb 2009 10:07:59 -0000
@@ -14,6 +14,7 @@
 #include 
 #include 
 #endif
+#include 
 
 #ifdef __cplusplus
 extern "C" {
@@ -145,6 +146,32 @@
 #endif
 }
 
+#define VAR(t) t*
+#define MAX(x, y) (((x)> (y)) ? (x) : (y))
+typedef void* (*start_routine_t)(void*);
+
+int ThreadPThreadC_thread_create(VAR(pthread_t) pthread, size_t stackSize, start_routine_t start_routine, void* arg)
+{
+    int r;
+    size_t bytes;
+    pthread_attr_t attr;
+
+    r = pthread_attr_init(&attr);
+    assert(r == 0);
+    
+    r = pthread_attr_getstacksize(&attr, &bytes);
+    assert(r == 0);
+
+    bytes = MAX(bytes, stackSize);
+    pthread_attr_setstacksize(&attr, bytes);
+
+    r = pthread_create(pthread, &attr, start_routine, arg);
+
+    pthread_attr_destroy(&attr);
+
+    return r;
+}
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
Index: ThreadPThreadC.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/thread/PTHREAD/ThreadPThreadC.i3,v
retrieving revision 1.5
diff -u -r1.5 ThreadPThreadC.i3
--- ThreadPThreadC.i3 21 Jan 2009 15:25:03 -0000 1.5
+++ ThreadPThreadC.i3 4 Feb 2009 10:07:59 -0000
@@ -7,6 +7,8 @@
  UNSAFE INTERFACE ThreadPThreadC;
 
 FROM Ctypes IMPORT int;
+FROM Cstddef IMPORT size_t;
+FROM Upthread IMPORT pthread_t, start_routine_t;
 
 (*---------------------------------------------------------------------------*)
 
@@ -38,4 +40,11 @@
 
 (*---------------------------------------------------------------------------*)
 
+(* pthread_create but replace attr with stackSize so that attr need not be known to Modula-3 *)
+
+
+PROCEDURE thread_create(VAR pthread: pthread_t; stackSize: size_t; start_routine: start_routine_t; arg: ADDRESS): int;
+
+(*---------------------------------------------------------------------------*)
+
 END ThreadPThreadC.





The corrolary then, ignoring the "cloned headers" that I leave alone, is:
 
 
Index: Common/Upthread.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/Common/Upthread.i3,v
retrieving revision 1.3
diff -u -r1.3 Upthread.i3
--- Common/Upthread.i3 19 Jan 2009 15:57:20 -0000 1.3
+++ Common/Upthread.i3 4 Feb 2009 10:12:18 -0000
@@ -10,7 +10,6 @@
 
 TYPE
   pthread_t = Usysdep.pthread_t;
-  pthread_attr_t = Usysdep.pthread_attr_t;
   pthread_mutex_t = Usysdep.pthread_mutex_t;
   pthread_cond_t = Usysdep.pthread_cond_t;
   pthread_key_t = Usysdep.pthread_key_t;
@@ -21,14 +20,9 @@
  VAR PTHREAD_MUTEX_INITIALIZER : pthread_mutex_t;
  VAR PTHREAD_COND_INITIALIZER : pthread_cond_t;
 
- PROCEDURE create (VAR pthread: pthread_t; READONLY attr: pthread_attr_t; start_routine: start_routine_t; arg: ADDRESS): int;
  PROCEDURE detach (thread: pthread_t): int;
  PROCEDURE self (): pthread_t;
  PROCEDURE equal (t1, t2: pthread_t): int;
- PROCEDURE attr_init (VAR attr: pthread_attr_t): int;
- PROCEDURE attr_destroy (VAR attr: pthread_attr_t): int;
- PROCEDURE attr_getstacksize (READONLY attr: pthread_attr_t; VAR stacksize: size_t): int;
- PROCEDURE attr_setstacksize (VAR attr: pthread_attr_t; stacksize: size_t): int;
  PROCEDURE yield (): int;
  PROCEDURE mutex_init (VAR mutex: pthread_mutex_t; attr: ADDRESS := NIL): int;
  PROCEDURE mutex_destroy (VAR mutex: pthread_mutex_t): int;
Index: cygwin/Usysdep.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/cygwin/Usysdep.i3,v
retrieving revision 1.12
diff -u -r1.12 Usysdep.i3
--- cygwin/Usysdep.i3 21 Jan 2009 15:25:09 -0000 1.12
+++ cygwin/Usysdep.i3 4 Feb 2009 10:12:18 -0000
@@ -28,7 +28,6 @@
 (* INTERFACE Upthread; *)
 
   pthread_t = ADDRESS; (* opaque *)
-  pthread_attr_t = ADDRESS; (* opaque *)
   pthread_mutex_t = ADDRESS; (* opaque *)
   pthread_cond_t = ADDRESS; (* opaque *)
   pthread_key_t = ADDRESS; (* opaque *)
Index: darwin-common/Usysdep.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/darwin-common/Usysdep.i3,v
retrieving revision 1.2
diff -u -r1.2 Usysdep.i3
--- darwin-common/Usysdep.i3 29 Jan 2009 07:43:23 -0000 1.2
+++ darwin-common/Usysdep.i3 4 Feb 2009 10:12:18 -0000
@@ -20,7 +20,6 @@
 (* INTERFACE Upthread; *)
 
   pthread_t = INTEGER; (* opaque *)
-  pthread_attr_t = RECORD opaque: ARRAY [1..10] OF INTEGER; END;
   pthread_mutex_t = RECORD opaque: ARRAY [1..11] OF INTEGER; END;
   pthread_cond_t = RECORD opaque: ARRAY [1..7] OF INTEGER; END;
   pthread_key_t = INTEGER; (* opaque *)
Index: freebsd-common/Usysdep.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/freebsd-common/Usysdep.i3,v
retrieving revision 1.5
diff -u -r1.5 Usysdep.i3
--- freebsd-common/Usysdep.i3 21 Jan 2009 15:25:09 -0000 1.5
+++ freebsd-common/Usysdep.i3 4 Feb 2009 10:12:18 -0000
@@ -22,7 +22,6 @@
 (* INTERFACE Upthread; *)
 
   pthread_t = ADDRESS;
-  pthread_attr_t = ADDRESS;
   pthread_mutex_t = ADDRESS;
   pthread_cond_t = ADDRESS;
   pthread_key_t = int;
Index: hpux-common/Usysdep.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/hpux-common/Usysdep.i3,v
retrieving revision 1.4
diff -u -r1.4 Usysdep.i3
--- hpux-common/Usysdep.i3 21 Jan 2009 15:25:11 -0000 1.4
+++ hpux-common/Usysdep.i3 4 Feb 2009 10:12:18 -0000
@@ -25,7 +25,6 @@
 (* INTERFACE Upthread; *)
 
     pthread_t = int32_t; (* opaque *)
-    pthread_attr_t = int32_t; (* opaque *)
     pthread_mutex_t = RECORD opaque: ARRAY [1..11 * X64 + 22 * X32] OF INTEGER; END;  (* 88 opaque bytes with size_t alignment *)
     pthread_cond_t = RECORD opaque: ARRAY [1..7 * X64 + 14 * X32] OF INTEGER; END;  (* 56 opaque bytes with size_t alignment *)
     pthread_key_t = int32_t; (* opaque *)
Index: linux-common/Usysdep.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/linux-common/Usysdep.i3,v
retrieving revision 1.10
diff -u -r1.10 Usysdep.i3
--- linux-common/Usysdep.i3 21 Jan 2009 15:25:12 -0000 1.10
+++ linux-common/Usysdep.i3 4 Feb 2009 10:12:18 -0000
@@ -21,7 +21,6 @@
 (* INTERFACE Upthread; *)
 
   pthread_t = ADDRESS;
-  pthread_attr_t = Upthreadtypes.pthread_attr_t;
   pthread_mutex_t = Upthreadtypes.pthread_mutex_t;
   pthread_cond_t = RECORD data: ARRAY[1..6] OF LONGINT; END;
   pthread_key_t = uint32_t;
Index: solaris-common/Usysdep.i3
===================================================================
RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/solaris-common/Usysdep.i3,v
retrieving revision 1.3
diff -u -r1.3 Usysdep.i3
--- solaris-common/Usysdep.i3 21 Jan 2009 15:25:13 -0000 1.3
+++ solaris-common/Usysdep.i3 4 Feb 2009 10:12:18 -0000
@@ -24,7 +24,6 @@
 (* INTERFACE Upthread; *)
 
     pthread_t = int32_t; (* opaque *)
-    pthread_attr_t = int32_t; (* opaque *)
     pthread_mutex_t = RECORD opaque: ARRAY [1..4] OF LONGINT; END; (* 32 bytes with 64 bit alignment *)
     pthread_cond_t = RECORD opaque: ARRAY [1..2] OF LONGINT; END; (* 16 bytes with 64 bit alignment *)
     pthread_key_t = int32_t; (* opaque *)


More information about the M3devel mailing list