annotate Python/thread_nt.h @ 64085:4df0d2a13aa1 3.1

Merged revisions 81214,82302,82465,83090-83091,84097,84099 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r81214 | brett.cannon | 2010-05-16 00:20:16 +0200 (dim., 16 mai 2010) | 2 lines A test was not guaranteeing cleanup in the face of an exception. ................ r82302 | benjamin.peterson | 2010-06-28 00:37:28 +0200 (lun., 28 juin 2010) | 15 lines Merged revisions 81380 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r81380 | brett.cannon | 2010-05-20 13:37:55 -0500 (Thu, 20 May 2010) | 8 lines Turned out that if you used explicit relative import syntax (e.g. from .os import sep) and it failed, import would still try the implicit relative import semantics of an absolute import (from os import sep). That's not right, so when level is negative, only do explicit relative import semantics. Fixes issue #7902. Thanks to Meador Inge for the patch. ........ ................ r82465 | brett.cannon | 2010-07-03 03:32:48 +0200 (sam., 03 juil. 2010) | 3 lines Make test_import a little bit more robust for cleaning up after itself in the face of a failure. ................ r83090 | brett.cannon | 2010-07-23 16:03:16 +0200 (ven., 23 juil. 2010) | 4 lines Explicitly test relative imports by reusing importlib tests. Closes issue 8392. Thanks Virgil Dupras for the initial patch. ................ r83091 | brett.cannon | 2010-07-23 16:45:19 +0200 (ven., 23 juil. 2010) | 1 line Stop shadowing a test class. ................ r84097 | florent.xicluna | 2010-08-16 20:41:19 +0200 (lun., 16 août 2010) | 1 line Use test.support and unittest features. Fix duplicated test (bad merge in r79033). Fix comment for issue #7902. ................ r84099 | florent.xicluna | 2010-08-16 21:03:05 +0200 (lun., 16 août 2010) | 1 line I get it wrong in r84097: s/relative/absolute/ ................
author Florent Xicluna <florent.xicluna@gmail.com>
date Mon, 16 Aug 2010 22:40:45 +0000
parents f197407bdba2
children 3c9232a684ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
37 EnterNonRecursiveMutex(PNRMUTEX mutex, BOOL wait)
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 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
43 if (!wait)
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... */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
52 WaitForSingleObject(mutex->hevent, INFINITE) : 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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
91
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 * Initialization of the C package, should not be needed.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 {
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
99
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 * Thread support.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
179
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 * Return the thread Id instead of an handle. The Id is said to uniquely identify the
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 * thread in the system
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
205
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 #ifndef NO_EXIT_PROG
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
207 void
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
208 PyThread_exit_prog(int status)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
210 dprintf(("PyThread_exit_prog(%d) called\n", status));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
211 if (!initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
212 exit(status);
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 #endif /* NO_EXIT_PROG */
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
215
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 * Lock support. It has too be implemented as semaphores.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 * I [Dag] tried to implement it with mutex but I could find a way to
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 * tell whether a thread already own the lock or not.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
221 PyThread_type_lock
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
222 PyThread_allocate_lock(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
224 PNRMUTEX aLock;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
225
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
226 dprintf(("PyThread_allocate_lock called\n"));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
227 if (!initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
228 PyThread_init_thread();
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
229
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
230 aLock = AllocNonRecursiveMutex() ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
231
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
232 dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
233
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
234 return (PyThread_type_lock) aLock;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
236
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
237 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
238 PyThread_free_lock(PyThread_type_lock aLock)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
240 dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
241
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
242 FreeNonRecursiveMutex(aLock) ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
244
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 * Return 1 on success if the lock was acquired
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 *
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 * and 0 if the lock was not acquired. This means a 0 is returned
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 * if the lock has already been acquired by this thread!
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
251 int
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
252 PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
254 int success ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
255
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
256 dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),aLock, waitflag));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
257
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
258 success = aLock && EnterNonRecursiveMutex((PNRMUTEX) aLock, (waitflag ? INFINITE : 0)) == WAIT_OBJECT_0 ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
259
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
260 dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n", PyThread_get_thread_ident(),aLock, waitflag, success));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
261
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
262 return success;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
264
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
265 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
266 PyThread_release_lock(PyThread_type_lock aLock)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
268 dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
269
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
270 if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
271 dprintf(("%ld: Could not PyThread_release_lock(%p) error: %ld\n", PyThread_get_thread_ident(), aLock, GetLastError()));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
273
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
274 /* 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
275 #define THREAD_MIN_STACKSIZE 0x8000 /* 32kB */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
276 #define THREAD_MAX_STACKSIZE 0x10000000 /* 256MB */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
277
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
278 /* set the thread stack size.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
279 * 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
280 */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
281 static int
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
282 _pythread_nt_set_stacksize(size_t size)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
283 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
284 /* set to default */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
285 if (size == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
286 _pythread_stacksize = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
287 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
288 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
289
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
290 /* valid range? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
291 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
292 _pythread_stacksize = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
293 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
294 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
295
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
296 return -1;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
297 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
298
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
299 #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
300
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
301
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
302 /* 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
303 #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
304
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
305 #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
306 int
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
307 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
308 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
309 return (int) TlsAlloc();
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
310 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
311
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
312 void
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
313 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
314 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
315 TlsFree(key);
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
316 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
317
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
318 /* 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
319 * 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
320 */
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
321 int
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
322 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
323 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
324 BOOL ok;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
325 void *oldvalue;
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
326
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
327 assert(value != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
328 oldvalue = TlsGetValue(key);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
329 if (oldvalue != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
330 /* ignore value if already set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
331 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
332 ok = TlsSetValue(key, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
333 if (!ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
334 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
335 return 0;
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
336 }
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 void *
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
339 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
340 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
341 /* 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
342 * 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
343 * 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
344 * 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
345 * do it here.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
346 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
347 DWORD error = GetLastError();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
348 void *result = TlsGetValue(key);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
349 SetLastError(error);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
350 return result;
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
351 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
352
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
353 void
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
354 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
355 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
356 /* 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
357 * 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
358 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
359 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
360 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
361
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
362 /* 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
363 * 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
364 */
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
365 void
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
366 PyThread_ReInitTLS(void)
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
367 {}
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
368
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
369 #endif