Mercurial > cpython-lru_cache-weakref
view Python/thread_lwp.h @ 41642:a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
........
r55077 | guido.van.rossum | 2007-05-02 11:54:37 -0700 (Wed, 02 May 2007) | 2 lines
Use the new print syntax, at least.
........
r55142 | fred.drake | 2007-05-04 21:27:30 -0700 (Fri, 04 May 2007) | 1 line
remove old cruftiness
........
r55143 | fred.drake | 2007-05-04 21:52:16 -0700 (Fri, 04 May 2007) | 1 line
make this work with the new Python
........
r55162 | neal.norwitz | 2007-05-06 22:29:18 -0700 (Sun, 06 May 2007) | 1 line
Get asdl code gen working with Python 2.3. Should continue to work with 3.0
........
r55164 | neal.norwitz | 2007-05-07 00:00:38 -0700 (Mon, 07 May 2007) | 1 line
Verify checkins to p3yk (sic) branch go to 3000 list.
........
r55166 | neal.norwitz | 2007-05-07 00:12:35 -0700 (Mon, 07 May 2007) | 1 line
Fix this test so it runs again by importing warnings_test properly.
........
r55167 | neal.norwitz | 2007-05-07 01:03:22 -0700 (Mon, 07 May 2007) | 8 lines
So long xrange. range() now supports values that are outside
-sys.maxint to sys.maxint. floats raise a TypeError.
This has been sitting for a long time. It probably has some problems and
needs cleanup. Objects/rangeobject.c now uses 4-space indents since
it is almost completely new.
........
r55171 | guido.van.rossum | 2007-05-07 10:21:26 -0700 (Mon, 07 May 2007) | 4 lines
Fix two tests that were previously depending on significant spaces
at the end of a line (and before that on Python 2.x print behavior
that has no exact equivalent in 3.0).
........
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 07 May 2007 22:24:25 +0000 |
| parents | 8b116a8449bd |
| children | e38335d4df91 df5719c298db |
line wrap: on
line source
#include <stdlib.h> #include <lwp/lwp.h> #include <lwp/stackdep.h> #define STACKSIZE 1000 /* stacksize for a thread */ #define NSTACKS 2 /* # stacks to be put in cache initially */ struct lock { int lock_locked; cv_t lock_condvar; mon_t lock_monitor; }; /* * Initialization. */ static void PyThread__init_thread(void) { lwp_setstkcache(STACKSIZE, NSTACKS); } /* * Thread support. */ long PyThread_start_new_thread(void (*func)(void *), void *arg) { thread_t tid; int success; dprintf(("PyThread_start_new_thread called\n")); if (!initialized) PyThread_init_thread(); success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg); return success < 0 ? -1 : 0; } long PyThread_get_thread_ident(void) { thread_t tid; if (!initialized) PyThread_init_thread(); if (lwp_self(&tid) < 0) return -1; return tid.thread_id; } static void do_PyThread_exit_thread(int no_cleanup) { dprintf(("PyThread_exit_thread called\n")); if (!initialized) if (no_cleanup) _exit(0); else exit(0); lwp_destroy(SELF); } void PyThread_exit_thread(void) { do_PyThread_exit_thread(0); } void PyThread__exit_thread(void) { do_PyThread_exit_thread(1); } #ifndef NO_EXIT_PROG static void do_PyThread_exit_prog(int status, int no_cleanup) { dprintf(("PyThread_exit_prog(%d) called\n", status)); if (!initialized) if (no_cleanup) _exit(status); else exit(status); pod_exit(status); } void PyThread_exit_prog(int status) { do_PyThread_exit_prog(status, 0); } void PyThread__exit_prog(int status) { do_PyThread_exit_prog(status, 1); } #endif /* NO_EXIT_PROG */ /* * Lock support. */ PyThread_type_lock PyThread_allocate_lock(void) { struct lock *lock; extern char *malloc(size_t); dprintf(("PyThread_allocate_lock called\n")); if (!initialized) PyThread_init_thread(); lock = (struct lock *) malloc(sizeof(struct lock)); lock->lock_locked = 0; (void) mon_create(&lock->lock_monitor); (void) cv_create(&lock->lock_condvar, lock->lock_monitor); dprintf(("PyThread_allocate_lock() -> %p\n", lock)); return (PyThread_type_lock) lock; } void PyThread_free_lock(PyThread_type_lock lock) { dprintf(("PyThread_free_lock(%p) called\n", lock)); mon_destroy(((struct lock *) lock)->lock_monitor); free((char *) lock); } int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) { int success; dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); success = 0; (void) mon_enter(((struct lock *) lock)->lock_monitor); if (waitflag) while (((struct lock *) lock)->lock_locked) cv_wait(((struct lock *) lock)->lock_condvar); if (!((struct lock *) lock)->lock_locked) { success = 1; ((struct lock *) lock)->lock_locked = 1; } cv_broadcast(((struct lock *) lock)->lock_condvar); mon_exit(((struct lock *) lock)->lock_monitor); dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); return success; } void PyThread_release_lock(PyThread_type_lock lock) { dprintf(("PyThread_release_lock(%p) called\n", lock)); (void) mon_enter(((struct lock *) lock)->lock_monitor); ((struct lock *) lock)->lock_locked = 0; cv_broadcast(((struct lock *) lock)->lock_condvar); mon_exit(((struct lock *) lock)->lock_monitor); }
