[M3devel] elminating pthread_attr_t from cloned headers

Tony Hosking hosking at cs.purdue.edu
Wed Feb 4 11:24:19 CET 2009


ok

On 4 Feb 2009, at 21:14, Jay wrote:

>
> 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