annotate Python/thread_beos.h @ 33940:dfd07b7be407 legacy-trunk

SF bug 1061968: threads: segfault or Py_FatalError at exit PyGILState_Ensure(): The fix in 2.4a3 for bug 1010677 reintroduced thread shutdown race bug 225673. Repaired by (once again) ensuring the GIL is held whenever deleting a thread state. Alas, there's no useful test case for this shy bug. Four years ago, only Guido could provoke it, on his box, and today only Armin can provoke it on his box. I've never been able to provoke it (but not for lack of trying!). This is a critical fix for 2.3.5 too, since the fix for 1010677 got backported there already and so also reintroduced 225673. I don't intend to backport this fix. For whoever (if anyone) does, there are other thread fixes in 2.4 that need backporting too, and I bet they need to happen first for this patch to apply cleanly.
author Tim Peters <tim.peters@gmail.com>
date Mon, 08 Nov 2004 04:30:21 +0000
parents 8b116a8449bd
children e38335d4df91 df5719c298db
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 #include <kernel/OS.h>
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #include <support/SupportDefs.h>
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 #include <errno.h>
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 /* ----------------------------------------------------------------------
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 * Fast locking mechanism described by Benoit Schillings (benoit@be.com)
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 * in the Be Developer's Newsletter, Issue #26 (http://www.be.com/).
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 typedef struct benaphore {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 sem_id _sem;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 int32 _atom;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 } benaphore_t;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 static status_t benaphore_create( const char *name, benaphore_t *ben );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 static status_t benaphore_destroy( benaphore_t *ben );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 static status_t benaphore_lock( benaphore_t *ben );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 static status_t benaphore_timedlock( benaphore_t *ben, bigtime_t micros );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 static status_t benaphore_unlock( benaphore_t *ben );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 static status_t benaphore_create( const char *name, benaphore_t *ben )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 if( ben != NULL ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 ben->_atom = 0;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 ben->_sem = create_sem( 0, name );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 if( ben->_sem < B_NO_ERROR ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 return B_BAD_SEM_ID;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 } else {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 return EFAULT;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 return EOK;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 static status_t benaphore_destroy( benaphore_t *ben )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 if( ben->_sem >= B_NO_ERROR ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 status_t retval = benaphore_timedlock( ben, 0 );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 if( retval == EOK || retval == EWOULDBLOCK ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 status_t del_retval = delete_sem( ben->_sem );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 return del_retval;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 return B_BAD_SEM_ID;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 static status_t benaphore_lock( benaphore_t *ben )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 int32 prev = atomic_add( &(ben->_atom), 1 );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 if( prev > 0 ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 return acquire_sem( ben->_sem );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 return EOK;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 static status_t benaphore_timedlock( benaphore_t *ben, bigtime_t micros )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 int32 prev = atomic_add( &(ben->_atom), 1 );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
65
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 if( prev > 0 ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 status_t retval = acquire_sem_etc( ben->_sem, 1, B_TIMEOUT, micros );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 switch( retval ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 case B_WOULD_BLOCK: /* Fall through... */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 case B_TIMED_OUT:
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 return EWOULDBLOCK;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 break;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 case B_OK:
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 return EOK;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 break;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 default:
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 return retval;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 break;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 return EOK;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
85
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 static status_t benaphore_unlock( benaphore_t *ben )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 int32 prev = atomic_add( &(ben->_atom), -1 );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 if( prev > 1 ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 return release_sem( ben->_sem );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 return EOK;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
96
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 /* ----------------------------------------------------------------------
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 * Initialization.
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 */
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
100 static void PyThread__init_thread( void )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 /* Do nothing. */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 return;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 /* ----------------------------------------------------------------------
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 * Thread support.
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 *
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 * Only ANSI C, renamed functions here; you can't use K&R on BeOS,
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 * and there's no legacy thread module to support.
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
112
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 static int32 thread_count = 0;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
115 long PyThread_start_new_thread( void (*func)(void *), void *arg )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 status_t success = 0;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 thread_id tid;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 char name[B_OS_NAME_LENGTH];
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 int32 this_thread;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
122 dprintf(("PyThread_start_new_thread called\n"));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 /* We are so very thread-safe... */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 this_thread = atomic_add( &thread_count, 1 );
21094
c2150313d9d1 More sprintf -> PyOS_snprintf.
Tim Peters <tim.peters@gmail.com>
parents: 20468
diff changeset
126 PyOS_snprintf(name, sizeof(name),
c2150313d9d1 More sprintf -> PyOS_snprintf.
Tim Peters <tim.peters@gmail.com>
parents: 20468
diff changeset
127 "python thread (%d)", this_thread );
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 tid = spawn_thread( (thread_func)func, name,
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 B_NORMAL_PRIORITY, arg );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 if( tid > B_NO_ERROR ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 success = resume_thread( tid );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
135 return ( success == B_NO_ERROR ? tid : -1 );
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
137
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 long PyThread_get_thread_ident( void )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 /* Presumed to return the current thread's ID... */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 thread_id tid;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 tid = find_thread( NULL );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
143
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 return ( tid != B_NAME_NOT_FOUND ? tid : -1 );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
146
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
147 static void do_PyThread_exit_thread( int no_cleanup )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 int32 threads;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
150
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
151 dprintf(("PyThread_exit_thread called\n"));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 /* Thread-safe way to read a variable without a mutex: */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 threads = atomic_add( &thread_count, 0 );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
155
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 if( threads == 0 ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 /* No threads around, so exit main(). */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 if( no_cleanup ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 _exit(0);
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 } else {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 exit(0);
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 } else {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 /* Oh, we're a thread, let's try to exit gracefully... */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 exit_thread( B_NO_ERROR );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
168
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 void PyThread_exit_thread( void )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
171 do_PyThread_exit_thread(0);
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
173
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 void PyThread__exit_thread( void )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
176 do_PyThread_exit_thread(1);
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
178
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 #ifndef NO_EXIT_PROG
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
180 static void do_PyThread_exit_prog( int status, int no_cleanup )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
182 dprintf(("PyThread_exit_prog(%d) called\n", status));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
183
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 /* No need to do anything, the threads get torn down if main() exits. */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
185
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 if (no_cleanup) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 _exit(status);
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 } else {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 exit(status);
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 void PyThread_exit_prog( int status )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
195 do_PyThread_exit_prog(status, 0);
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
197
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 void PyThread__exit_prog( int status )
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
200 do_PyThread_exit_prog(status, 1);
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 #endif /* NO_EXIT_PROG */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
203
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 /* ----------------------------------------------------------------------
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 * Lock support.
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
207
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 static int32 lock_count = 0;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
209
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
210 PyThread_type_lock PyThread_allocate_lock( void )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 benaphore_t *lock;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 status_t retval;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 char name[B_OS_NAME_LENGTH];
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 int32 this_lock;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
216
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
217 dprintf(("PyThread_allocate_lock called\n"));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
218
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 lock = (benaphore_t *)malloc( sizeof( benaphore_t ) );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 if( lock == NULL ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 /* TODO: that's bad, raise MemoryError */
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
222 return (PyThread_type_lock)NULL;
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 this_lock = atomic_add( &lock_count, 1 );
21094
c2150313d9d1 More sprintf -> PyOS_snprintf.
Tim Peters <tim.peters@gmail.com>
parents: 20468
diff changeset
226 PyOS_snprintf(name, sizeof(name), "python lock (%d)", this_lock);
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
227
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 retval = benaphore_create( name, lock );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 if( retval != EOK ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 /* TODO: that's bad, raise an exception */
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
231 return (PyThread_type_lock)NULL;
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
233
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 9679
diff changeset
234 dprintf(("PyThread_allocate_lock() -> %p\n", lock));
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
235 return (PyThread_type_lock) lock;
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
237
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
238 void PyThread_free_lock( PyThread_type_lock lock )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 status_t retval;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
241
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 9679
diff changeset
242 dprintf(("PyThread_free_lock(%p) called\n", lock));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
243
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 retval = benaphore_destroy( (benaphore_t *)lock );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 if( retval != EOK ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 /* TODO: that's bad, raise an exception */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 return;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
250
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
251 int PyThread_acquire_lock( PyThread_type_lock lock, int waitflag )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 int success;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 status_t retval;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
255
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 9679
diff changeset
256 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
257
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 if( waitflag ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 retval = benaphore_lock( (benaphore_t *)lock );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 } else {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 retval = benaphore_timedlock( (benaphore_t *)lock, 0 );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
263
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 if( retval == EOK ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 success = 1;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 } else {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 success = 0;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
268
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 /* TODO: that's bad, raise an exception */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
271
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 9679
diff changeset
272 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 return success;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
275
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9603
diff changeset
276 void PyThread_release_lock( PyThread_type_lock lock )
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 status_t retval;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
279
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 9679
diff changeset
280 dprintf(("PyThread_release_lock(%p) called\n", lock));
9603
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
281
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 retval = benaphore_unlock( (benaphore_t *)lock );
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 if( retval != EOK ) {
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 /* TODO: that's bad, raise an exception */
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 return;
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 }
c4e2da477949 Adding thread support for BeOS by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 }