Permalink
Please
sign in to comment.
Browse files
Split thread.c into a number of system-specific files.
Added Tim Peters' pthread version.
- Loading branch information
Showing
with
1,409 additions
and 0 deletions.
- +158 −0 Python/thread_cthread.h
- +148 −0 Python/thread_foobar.h
- +198 −0 Python/thread_lwp.h
- +272 −0 Python/thread_pthread.h
- +414 −0 Python/thread_sgi.h
- +219 −0 Python/thread_solaris.h
| @@ -0,0 +1,158 @@ | ||
| /*********************************************************** | ||
| Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, | ||
| Amsterdam, The Netherlands. | ||
| All Rights Reserved | ||
| Permission to use, copy, modify, and distribute this software and its | ||
| documentation for any purpose and without fee is hereby granted, | ||
| provided that the above copyright notice appear in all copies and that | ||
| both that copyright notice and this permission notice appear in | ||
| supporting documentation, and that the names of Stichting Mathematisch | ||
| Centrum or CWI not be used in advertising or publicity pertaining to | ||
| distribution of the software without specific, written prior permission. | ||
| STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | ||
| THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||
| FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE | ||
| FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||
| OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
| ******************************************************************/ | ||
|
|
||
| #include <cthreads.h> | ||
|
|
||
|
|
||
| /* | ||
| * Initialization. | ||
| */ | ||
| static void _init_thread _P0() | ||
| { | ||
| cthread_init(); | ||
| } | ||
|
|
||
| /* | ||
| * Thread support. | ||
| */ | ||
| int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg) | ||
| { | ||
| #if defined(SGI_THREADS) && defined(USE_DL) | ||
| long addr, size; | ||
| static int local_initialized = 0; | ||
| #endif /* SGI_THREADS and USE_DL */ | ||
| int success = 0; /* init not needed when SOLARIS_THREADS and */ | ||
| /* C_THREADS implemented properly */ | ||
|
|
||
| dprintf(("start_new_thread called\n")); | ||
| if (!initialized) | ||
| init_thread(); | ||
| (void) cthread_fork(func, arg); | ||
| return success < 0 ? 0 : 1; | ||
| } | ||
|
|
||
| static void do_exit_thread _P1(no_cleanup, int no_cleanup) | ||
| { | ||
| dprintf(("exit_thread called\n")); | ||
| if (!initialized) | ||
| if (no_cleanup) | ||
| _exit(0); | ||
| else | ||
| exit(0); | ||
| cthread_exit(0); | ||
| } | ||
|
|
||
| void exit_thread _P0() | ||
| { | ||
| do_exit_thread(0); | ||
| } | ||
|
|
||
| void _exit_thread _P0() | ||
| { | ||
| do_exit_thread(1); | ||
| } | ||
|
|
||
| #ifndef NO_EXIT_PROG | ||
| static void do_exit_prog _P2(status, int status, no_cleanup, int no_cleanup) | ||
| { | ||
| dprintf(("exit_prog(%d) called\n", status)); | ||
| if (!initialized) | ||
| if (no_cleanup) | ||
| _exit(status); | ||
| else | ||
| exit(status); | ||
| } | ||
|
|
||
| void exit_prog _P1(status, int status) | ||
| { | ||
| do_exit_prog(status, 0); | ||
| } | ||
|
|
||
| void _exit_prog _P1(status, int status) | ||
| { | ||
| do_exit_prog(status, 1); | ||
| } | ||
| #endif /* NO_EXIT_PROG */ | ||
|
|
||
| /* | ||
| * Lock support. | ||
| */ | ||
| type_lock allocate_lock _P0() | ||
| { | ||
|
|
||
| dprintf(("allocate_lock called\n")); | ||
| if (!initialized) | ||
| init_thread(); | ||
|
|
||
| dprintf(("allocate_lock() -> %lx\n", (long)lock)); | ||
| return (type_lock) lock; | ||
| } | ||
|
|
||
| void free_lock _P1(lock, type_lock lock) | ||
| { | ||
| dprintf(("free_lock(%lx) called\n", (long)lock)); | ||
| } | ||
|
|
||
| int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag) | ||
| { | ||
| int success; | ||
|
|
||
| dprintf(("acquire_lock(%lx, %d) called\n", (long)lock, waitflag)); | ||
| dprintf(("acquire_lock(%lx, %d) -> %d\n", (long)lock, waitflag, success)); | ||
| return success; | ||
| } | ||
|
|
||
| void release_lock _P1(lock, type_lock lock) | ||
| { | ||
| dprintf(("release_lock(%lx) called\n", (long)lock)); | ||
| } | ||
|
|
||
| /* | ||
| * Semaphore support. | ||
| */ | ||
| type_sema allocate_sema _P1(value, int value) | ||
| { | ||
| dprintf(("allocate_sema called\n")); | ||
| if (!initialized) | ||
| init_thread(); | ||
|
|
||
| dprintf(("allocate_sema() -> %lx\n", (long) sema)); | ||
| return (type_sema) sema; | ||
| } | ||
|
|
||
| void free_sema _P1(sema, type_sema sema) | ||
| { | ||
| dprintf(("free_sema(%lx) called\n", (long) sema)); | ||
| } | ||
|
|
||
| void down_sema _P1(sema, type_sema sema) | ||
| { | ||
| dprintf(("down_sema(%lx) called\n", (long) sema)); | ||
| dprintf(("down_sema(%lx) return\n", (long) sema)); | ||
| } | ||
|
|
||
| void up_sema _P1(sema, type_sema sema) | ||
| { | ||
| dprintf(("up_sema(%lx)\n", (long) sema)); | ||
| } |
| @@ -0,0 +1,148 @@ | ||
| /*********************************************************** | ||
| Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, | ||
| Amsterdam, The Netherlands. | ||
| All Rights Reserved | ||
| Permission to use, copy, modify, and distribute this software and its | ||
| documentation for any purpose and without fee is hereby granted, | ||
| provided that the above copyright notice appear in all copies and that | ||
| both that copyright notice and this permission notice appear in | ||
| supporting documentation, and that the names of Stichting Mathematisch | ||
| Centrum or CWI not be used in advertising or publicity pertaining to | ||
| distribution of the software without specific, written prior permission. | ||
| STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | ||
| THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||
| FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE | ||
| FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||
| OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
| ******************************************************************/ | ||
|
|
||
| /* | ||
| * Initialization. | ||
| */ | ||
| static void _init_thread _P0() | ||
| { | ||
| } | ||
|
|
||
| /* | ||
| * Thread support. | ||
| */ | ||
| int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg) | ||
| { | ||
| int success = 0; /* init not needed when SOLARIS_THREADS and */ | ||
| /* C_THREADS implemented properly */ | ||
|
|
||
| dprintf(("start_new_thread called\n")); | ||
| if (!initialized) | ||
| init_thread(); | ||
| return success < 0 ? 0 : 1; | ||
| } | ||
|
|
||
| static void do_exit_thread _P1(no_cleanup, int no_cleanup) | ||
| { | ||
| dprintf(("exit_thread called\n")); | ||
| if (!initialized) | ||
| if (no_cleanup) | ||
| _exit(0); | ||
| else | ||
| exit(0); | ||
| } | ||
|
|
||
| void exit_thread _P0() | ||
| { | ||
| do_exit_thread(0); | ||
| } | ||
|
|
||
| void _exit_thread _P0() | ||
| { | ||
| do_exit_thread(1); | ||
| } | ||
|
|
||
| #ifndef NO_EXIT_PROG | ||
| static void do_exit_prog _P2(status, int status, no_cleanup, int no_cleanup) | ||
| { | ||
| dprintf(("exit_prog(%d) called\n", status)); | ||
| if (!initialized) | ||
| if (no_cleanup) | ||
| _exit(status); | ||
| else | ||
| exit(status); | ||
| } | ||
|
|
||
| void exit_prog _P1(status, int status) | ||
| { | ||
| do_exit_prog(status, 0); | ||
| } | ||
|
|
||
| void _exit_prog _P1(status, int status) | ||
| { | ||
| do_exit_prog(status, 1); | ||
| } | ||
| #endif /* NO_EXIT_PROG */ | ||
|
|
||
| /* | ||
| * Lock support. | ||
| */ | ||
| type_lock allocate_lock _P0() | ||
| { | ||
|
|
||
| dprintf(("allocate_lock called\n")); | ||
| if (!initialized) | ||
| init_thread(); | ||
|
|
||
| dprintf(("allocate_lock() -> %lx\n", (long)lock)); | ||
| return (type_lock) lock; | ||
| } | ||
|
|
||
| void free_lock _P1(lock, type_lock lock) | ||
| { | ||
| dprintf(("free_lock(%lx) called\n", (long)lock)); | ||
| } | ||
|
|
||
| int acquire_lock _P2(lock, type_lock lock, waitflag, int waitflag) | ||
| { | ||
| int success; | ||
|
|
||
| dprintf(("acquire_lock(%lx, %d) called\n", (long)lock, waitflag)); | ||
| dprintf(("acquire_lock(%lx, %d) -> %d\n", (long)lock, waitflag, success)); | ||
| return success; | ||
| } | ||
|
|
||
| void release_lock _P1(lock, type_lock lock) | ||
| { | ||
| dprintf(("release_lock(%lx) called\n", (long)lock)); | ||
| } | ||
|
|
||
| /* | ||
| * Semaphore support. | ||
| */ | ||
| type_sema allocate_sema _P1(value, int value) | ||
| { | ||
| dprintf(("allocate_sema called\n")); | ||
| if (!initialized) | ||
| init_thread(); | ||
|
|
||
| dprintf(("allocate_sema() -> %lx\n", (long) sema)); | ||
| return (type_sema) sema; | ||
| } | ||
|
|
||
| void free_sema _P1(sema, type_sema sema) | ||
| { | ||
| dprintf(("free_sema(%lx) called\n", (long) sema)); | ||
| } | ||
|
|
||
| void down_sema _P1(sema, type_sema sema) | ||
| { | ||
| dprintf(("down_sema(%lx) called\n", (long) sema)); | ||
| dprintf(("down_sema(%lx) return\n", (long) sema)); | ||
| } | ||
|
|
||
| void up_sema _P1(sema, type_sema sema) | ||
| { | ||
| dprintf(("up_sema(%lx)\n", (long) sema)); | ||
| } |
Oops, something went wrong.
0 comments on commit
2c8cb9f