Mercurial > cpython-lru_cache-weakref
annotate Python/thread_nt.h @ 68730:fe1d421ca3fa
Issue #3080: Rename some path variables to path_list
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Mon, 14 Mar 2011 13:22:54 -0400 |
| parents | 3c9232a684ae |
| children | 9b12af6e9ea9 |
| rev | line source |
|---|---|
| 2152 | 1 |
| 2 /* This code implemented by Dag.Gruneau@elsa.preseco.comm.se */ | |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
3 /* Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru */ |
|
22092
7a3e03b541ff
SF patch 522961: Leak in Python/thread_nt.h, from Gerald S. Williams.
Tim Peters <tim.peters@gmail.com>
parents:
21766
diff
changeset
|
4 /* Eliminated some memory leaks, gsw@agere.com */ |
| 2152 | 5 |
|
6029
68f2d7704180
Use _beginthread() and _endthread() in favor of CreateThread() and
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
6 #include <windows.h> |
|
68f2d7704180
Use _beginthread() and _endthread() in favor of CreateThread() and
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
7 #include <limits.h> |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
8 #ifdef HAVE_PROCESS_H |
|
6029
68f2d7704180
Use _beginthread() and _endthread() in favor of CreateThread() and
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
9 #include <process.h> |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
10 #endif |
| 2152 | 11 |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
12 typedef struct NRMUTEX { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
13 LONG owned ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
14 DWORD thread_id ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
15 HANDLE hevent ; |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
16 } NRMUTEX, *PNRMUTEX ; |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
17 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
18 |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
19 BOOL |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
20 InitializeNonRecursiveMutex(PNRMUTEX mutex) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
21 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
22 mutex->owned = -1 ; /* No threads have entered NonRecursiveMutex */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
23 mutex->thread_id = 0 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
24 mutex->hevent = CreateEvent(NULL, FALSE, FALSE, NULL) ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
25 return mutex->hevent != NULL ; /* TRUE if the mutex is created */ |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
26 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
27 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
28 VOID |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
29 DeleteNonRecursiveMutex(PNRMUTEX mutex) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
30 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
31 /* No in-use check */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
32 CloseHandle(mutex->hevent) ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
33 mutex->hevent = NULL ; /* Just in case */ |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
34 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
35 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
36 DWORD |
|
60598
01d1fd775d16
Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents:
59089
diff
changeset
|
37 EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
38 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
39 /* Assume that the thread waits successfully */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
40 DWORD ret ; |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
41 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
42 /* InterlockedIncrement(&mutex->owned) == 0 means that no thread currently owns the mutex */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
43 if (milliseconds == 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
44 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
45 if (InterlockedCompareExchange(&mutex->owned, 0, -1) != -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
46 return WAIT_TIMEOUT ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
47 ret = WAIT_OBJECT_0 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
48 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
49 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
50 ret = InterlockedIncrement(&mutex->owned) ? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
51 /* Some thread owns the mutex, let's wait... */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
52 WaitForSingleObject(mutex->hevent, milliseconds) : WAIT_OBJECT_0 ; |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
53 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
54 mutex->thread_id = GetCurrentThreadId() ; /* We own it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
55 return ret ; |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
56 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
57 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
58 BOOL |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
59 LeaveNonRecursiveMutex(PNRMUTEX mutex) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
60 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
61 /* We don't own the mutex */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
62 mutex->thread_id = 0 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
63 return |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
64 InterlockedDecrement(&mutex->owned) < 0 || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
65 SetEvent(mutex->hevent) ; /* Other threads are waiting, wake one on them up */ |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
66 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
67 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
68 PNRMUTEX |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
69 AllocNonRecursiveMutex(void) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
70 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
71 PNRMUTEX mutex = (PNRMUTEX)malloc(sizeof(NRMUTEX)) ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
72 if (mutex && !InitializeNonRecursiveMutex(mutex)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
73 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
74 free(mutex) ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
75 mutex = NULL ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
76 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
77 return mutex ; |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
78 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
79 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
80 void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
81 FreeNonRecursiveMutex(PNRMUTEX mutex) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
82 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
83 if (mutex) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
84 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
85 DeleteNonRecursiveMutex(mutex) ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
86 free(mutex) ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
87 } |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
88 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
89 |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
6029
diff
changeset
|
90 long PyThread_get_thread_ident(void); |
| 2152 | 91 |
| 92 /* | |
| 93 * Initialization of the C package, should not be needed. | |
| 94 */ | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
95 static void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
96 PyThread__init_thread(void) |
| 2152 | 97 { |
| 98 } | |
| 99 | |
| 100 /* | |
| 101 * Thread support. | |
| 102 */ | |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
103 |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
104 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
105 void (*func)(void*); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
106 void *arg; |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
107 } callobj; |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
108 |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
109 /* thunker to call adapt between the function type used by the system's |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
110 thread start function and the internally used one. */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
111 #if defined(MS_WINCE) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
112 static DWORD WINAPI |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
113 #else |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
114 static unsigned __stdcall |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
115 #endif |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
116 bootstrap(void *call) |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
117 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
118 callobj *obj = (callobj*)call; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
119 void (*func)(void*) = obj->func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
120 void *arg = obj->arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
121 HeapFree(GetProcessHeap(), 0, obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
122 func(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
123 return 0; |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
124 } |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
125 |
|
29755
59da5b57c61b
An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents:
22092
diff
changeset
|
126 long |
|
59da5b57c61b
An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents:
22092
diff
changeset
|
127 PyThread_start_new_thread(void (*func)(void *), void *arg) |
| 2152 | 128 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
129 HANDLE hThread; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
130 unsigned threadID; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
131 callobj *obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
132 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
133 dprintf(("%ld: PyThread_start_new_thread called\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
134 PyThread_get_thread_ident())); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
135 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
136 PyThread_init_thread(); |
| 2152 | 137 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
138 obj = (callobj*)HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
139 if (!obj) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
140 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
141 obj->func = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
142 obj->arg = arg; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
143 #if defined(MS_WINCE) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
144 hThread = CreateThread(NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
145 Py_SAFE_DOWNCAST(_pythread_stacksize, Py_ssize_t, SIZE_T), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
146 bootstrap, obj, 0, &threadID); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
147 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
148 hThread = (HANDLE)_beginthreadex(0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
149 Py_SAFE_DOWNCAST(_pythread_stacksize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
150 Py_ssize_t, unsigned int), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
151 bootstrap, obj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
152 0, &threadID); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
153 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
154 if (hThread == 0) { |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
155 #if defined(MS_WINCE) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
156 /* Save error in variable, to prevent PyThread_get_thread_ident |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
157 from clobbering it. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
158 unsigned e = GetLastError(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
159 dprintf(("%ld: PyThread_start_new_thread failed, win32 error code %u\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
160 PyThread_get_thread_ident(), e)); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
161 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
162 /* I've seen errno == EAGAIN here, which means "there are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
163 * too many threads". |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
164 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
165 int e = errno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
166 dprintf(("%ld: PyThread_start_new_thread failed, errno %d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
167 PyThread_get_thread_ident(), e)); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
168 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
169 threadID = (unsigned)-1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
170 HeapFree(GetProcessHeap(), 0, obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
171 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
172 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
173 dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
174 PyThread_get_thread_ident(), (void*)hThread)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
175 CloseHandle(hThread); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
176 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
177 return (long) threadID; |
| 2152 | 178 } |
| 179 | |
| 180 /* | |
| 181 * Return the thread Id instead of an handle. The Id is said to uniquely identify the | |
| 182 * thread in the system | |
| 183 */ | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
184 long |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
185 PyThread_get_thread_ident(void) |
| 2152 | 186 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
187 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
188 PyThread_init_thread(); |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
189 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
190 return GetCurrentThreadId(); |
| 2152 | 191 } |
| 192 | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
193 void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
194 PyThread_exit_thread(void) |
| 2152 | 195 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
196 dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident())); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
197 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
198 exit(0); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
199 #if defined(MS_WINCE) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
200 ExitThread(0); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
201 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
202 _endthreadex(0); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
203 #endif |
| 2152 | 204 } |
| 205 | |
| 206 /* | |
| 207 * Lock support. It has too be implemented as semaphores. | |
| 208 * I [Dag] tried to implement it with mutex but I could find a way to | |
| 209 * tell whether a thread already own the lock or not. | |
| 210 */ | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
211 PyThread_type_lock |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
212 PyThread_allocate_lock(void) |
| 2152 | 213 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
214 PNRMUTEX aLock; |
| 2152 | 215 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
216 dprintf(("PyThread_allocate_lock called\n")); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
217 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
218 PyThread_init_thread(); |
| 2152 | 219 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
220 aLock = AllocNonRecursiveMutex() ; |
| 2152 | 221 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
222 dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock)); |
| 2152 | 223 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
224 return (PyThread_type_lock) aLock; |
| 2152 | 225 } |
| 226 | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
227 void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
228 PyThread_free_lock(PyThread_type_lock aLock) |
| 2152 | 229 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
230 dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); |
| 2152 | 231 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
232 FreeNonRecursiveMutex(aLock) ; |
| 2152 | 233 } |
| 234 | |
| 235 /* | |
| 236 * Return 1 on success if the lock was acquired | |
| 237 * | |
| 238 * and 0 if the lock was not acquired. This means a 0 is returned | |
| 239 * if the lock has already been acquired by this thread! | |
| 240 */ | |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
241 PyLockStatus |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
242 PyThread_acquire_lock_timed(PyThread_type_lock aLock, |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
243 PY_TIMEOUT_T microseconds, int intr_flag) |
| 2152 | 244 { |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
245 /* Fow now, intr_flag does nothing on Windows, and lock acquires are |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
246 * uninterruptible. */ |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
247 PyLockStatus success; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
248 PY_TIMEOUT_T milliseconds; |
| 2152 | 249 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
250 if (microseconds >= 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
251 milliseconds = microseconds / 1000; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
252 if (microseconds % 1000 > 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
253 ++milliseconds; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
254 if ((DWORD) milliseconds != milliseconds) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
255 Py_FatalError("Timeout too large for a DWORD, " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
256 "please check PY_TIMEOUT_MAX"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
257 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
258 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
259 milliseconds = INFINITE; |
| 2152 | 260 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
261 dprintf(("%ld: PyThread_acquire_lock_timed(%p, %lld) called\n", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
262 PyThread_get_thread_ident(), aLock, microseconds)); |
|
60598
01d1fd775d16
Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents:
59089
diff
changeset
|
263 |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
264 if (aLock && EnterNonRecursiveMutex((PNRMUTEX)aLock, |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
265 (DWORD)milliseconds) == WAIT_OBJECT_0) { |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
266 success = PY_LOCK_ACQUIRED; |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
267 } |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
268 else { |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
269 success = PY_LOCK_FAILURE; |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
270 } |
|
60598
01d1fd775d16
Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents:
59089
diff
changeset
|
271 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
272 dprintf(("%ld: PyThread_acquire_lock(%p, %lld) -> %d\n", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
273 PyThread_get_thread_ident(), aLock, microseconds, success)); |
| 2152 | 274 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
275 return success; |
| 2152 | 276 } |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
277 int |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
278 PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag) |
| 2152 | 279 { |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
280 return PyThread_acquire_lock_timed(aLock, waitflag ? -1 : 0, 0); |
| 2152 | 281 } |
| 282 | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
283 void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
284 PyThread_release_lock(PyThread_type_lock aLock) |
| 2152 | 285 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
286 dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); |
| 2152 | 287 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
288 if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
289 dprintf(("%ld: Could not PyThread_release_lock(%p) error: %ld\n", PyThread_get_thread_ident(), aLock, GetLastError())); |
| 2152 | 290 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
291 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
292 /* minimum/maximum thread stack sizes supported */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
293 #define THREAD_MIN_STACKSIZE 0x8000 /* 32kB */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
294 #define THREAD_MAX_STACKSIZE 0x10000000 /* 256MB */ |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
295 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
296 /* set the thread stack size. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
297 * Return 0 if size is valid, -1 otherwise. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
298 */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
299 static int |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
300 _pythread_nt_set_stacksize(size_t size) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
301 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
302 /* set to default */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
303 if (size == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
304 _pythread_stacksize = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
305 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
306 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
307 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
308 /* valid range? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
309 if (size >= THREAD_MIN_STACKSIZE && size < THREAD_MAX_STACKSIZE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
310 _pythread_stacksize = size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
311 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
312 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
313 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
314 return -1; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
315 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
316 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
317 #define THREAD_SET_STACKSIZE(x) _pythread_nt_set_stacksize(x) |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
318 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
319 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
320 /* use native Windows TLS functions */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
321 #define Py_HAVE_NATIVE_TLS |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
322 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
323 #ifdef Py_HAVE_NATIVE_TLS |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
324 int |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
325 PyThread_create_key(void) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
326 { |
|
64844
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
327 DWORD result= TlsAlloc(); |
|
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
328 if (result == TLS_OUT_OF_INDEXES) |
|
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
329 return -1; |
|
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
330 return (int)result; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
331 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
332 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
333 void |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
334 PyThread_delete_key(int key) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
335 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
336 TlsFree(key); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
337 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
338 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
339 /* We must be careful to emulate the strange semantics implemented in thread.c, |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
340 * where the value is only set if it hasn't been set before. |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
341 */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
342 int |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
343 PyThread_set_key_value(int key, void *value) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
344 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
345 BOOL ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
346 void *oldvalue; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
347 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
348 assert(value != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
349 oldvalue = TlsGetValue(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
350 if (oldvalue != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
351 /* ignore value if already set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
352 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
353 ok = TlsSetValue(key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
354 if (!ok) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
355 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
356 return 0; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
357 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
358 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
359 void * |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
360 PyThread_get_key_value(int key) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
361 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
362 /* because TLS is used in the Py_END_ALLOW_THREAD macro, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
363 * it is necessary to preserve the windows error state, because |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
364 * it is assumed to be preserved across the call to the macro. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
365 * Ideally, the macro should be fixed, but it is simpler to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
366 * do it here. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
367 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
368 DWORD error = GetLastError(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
369 void *result = TlsGetValue(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
370 SetLastError(error); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
371 return result; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
372 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
373 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
374 void |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
375 PyThread_delete_key_value(int key) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
376 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
377 /* NULL is used as "key missing", and it is also the default |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
378 * given by TlsGetValue() if nothing has been set yet. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
379 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
380 TlsSetValue(key, NULL); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
381 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
382 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
383 /* reinitialization of TLS is not necessary after fork when using |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
384 * the native TLS functions. And forking isn't supported on Windows either. |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
385 */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
386 void |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
387 PyThread_ReInitTLS(void) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
388 {} |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
389 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
390 #endif |
