[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