Changeset 391 for python/trunk/Python/thread_lwp.h
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Python/thread_lwp.h
r2 r391 4 4 #include <lwp/stackdep.h> 5 5 6 #define STACKSIZE 1000/* stacksize for a thread */7 #define NSTACKS 2/* # stacks to be put in cache initially */6 #define STACKSIZE 1000 /* stacksize for a thread */ 7 #define NSTACKS 2 /* # stacks to be put in cache initially */ 8 8 9 9 struct lock { 10 11 12 10 int lock_locked; 11 cv_t lock_condvar; 12 mon_t lock_monitor; 13 13 }; 14 14 … … 19 19 static void PyThread__init_thread(void) 20 20 { 21 21 lwp_setstkcache(STACKSIZE, NSTACKS); 22 22 } 23 23 … … 29 29 long PyThread_start_new_thread(void (*func)(void *), void *arg) 30 30 { 31 32 33 34 35 36 37 31 thread_t tid; 32 int success; 33 dprintf(("PyThread_start_new_thread called\n")); 34 if (!initialized) 35 PyThread_init_thread(); 36 success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg); 37 return success < 0 ? -1 : 0; 38 38 } 39 39 40 40 long PyThread_get_thread_ident(void) 41 41 { 42 thread_t tid; 43 if (!initialized) 44 PyThread_init_thread(); 45 if (lwp_self(&tid) < 0) 46 return -1; 47 return tid.thread_id; 48 } 49 50 static void do_PyThread_exit_thread(int no_cleanup) 51 { 52 dprintf(("PyThread_exit_thread called\n")); 53 if (!initialized) 54 if (no_cleanup) 55 _exit(0); 56 else 57 exit(0); 58 lwp_destroy(SELF); 42 thread_t tid; 43 if (!initialized) 44 PyThread_init_thread(); 45 if (lwp_self(&tid) < 0) 46 return -1; 47 return tid.thread_id; 59 48 } 60 49 61 50 void PyThread_exit_thread(void) 62 51 { 63 do_PyThread_exit_thread(0); 52 dprintf(("PyThread_exit_thread called\n")); 53 if (!initialized) 54 exit(0); 55 lwp_destroy(SELF); 64 56 } 65 66 void PyThread__exit_thread(void)67 {68 do_PyThread_exit_thread(1);69 }70 71 #ifndef NO_EXIT_PROG72 static void do_PyThread_exit_prog(int status, int no_cleanup)73 {74 dprintf(("PyThread_exit_prog(%d) called\n", status));75 if (!initialized)76 if (no_cleanup)77 _exit(status);78 else79 exit(status);80 pod_exit(status);81 }82 83 void PyThread_exit_prog(int status)84 {85 do_PyThread_exit_prog(status, 0);86 }87 88 void PyThread__exit_prog(int status)89 {90 do_PyThread_exit_prog(status, 1);91 }92 #endif /* NO_EXIT_PROG */93 57 94 58 /* … … 97 61 PyThread_type_lock PyThread_allocate_lock(void) 98 62 { 99 100 63 struct lock *lock; 64 extern char *malloc(size_t); 101 65 102 103 104 66 dprintf(("PyThread_allocate_lock called\n")); 67 if (!initialized) 68 PyThread_init_thread(); 105 69 106 107 108 109 110 111 70 lock = (struct lock *) malloc(sizeof(struct lock)); 71 lock->lock_locked = 0; 72 (void) mon_create(&lock->lock_monitor); 73 (void) cv_create(&lock->lock_condvar, lock->lock_monitor); 74 dprintf(("PyThread_allocate_lock() -> %p\n", lock)); 75 return (PyThread_type_lock) lock; 112 76 } 113 77 114 78 void PyThread_free_lock(PyThread_type_lock lock) 115 79 { 116 117 118 80 dprintf(("PyThread_free_lock(%p) called\n", lock)); 81 mon_destroy(((struct lock *) lock)->lock_monitor); 82 free((char *) lock); 119 83 } 120 84 121 85 int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) 122 86 { 123 87 int success; 124 88 125 126 89 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); 90 success = 0; 127 91 128 129 130 131 132 133 134 135 136 137 138 139 92 (void) mon_enter(((struct lock *) lock)->lock_monitor); 93 if (waitflag) 94 while (((struct lock *) lock)->lock_locked) 95 cv_wait(((struct lock *) lock)->lock_condvar); 96 if (!((struct lock *) lock)->lock_locked) { 97 success = 1; 98 ((struct lock *) lock)->lock_locked = 1; 99 } 100 cv_broadcast(((struct lock *) lock)->lock_condvar); 101 mon_exit(((struct lock *) lock)->lock_monitor); 102 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); 103 return success; 140 104 } 141 105 142 106 void PyThread_release_lock(PyThread_type_lock lock) 143 107 { 144 145 146 147 148 108 dprintf(("PyThread_release_lock(%p) called\n", lock)); 109 (void) mon_enter(((struct lock *) lock)->lock_monitor); 110 ((struct lock *) lock)->lock_locked = 0; 111 cv_broadcast(((struct lock *) lock)->lock_condvar); 112 mon_exit(((struct lock *) lock)->lock_monitor); 149 113 }
Note:
See TracChangeset
for help on using the changeset viewer.