annotate Python/condvar.h @ 78950:29abedd4f4bb

Added missing va_end in error branch of PyArg_UnpackTuple(). CID 486641
author Christian Heimes <christian@cheimes.de>
date Mon, 10 Sep 2012 13:17:23 +0200
parents d7a72fdcc168
children fde60d3f542e b71b6517af63
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
1 /*
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
2 * Portable condition variable support for windows and pthreads.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
3 * Everything is inline, this header can be included where needed.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
4 *
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
5 * APIs generally return 0 on success and non-zero on error,
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
6 * and the caller needs to use its platform's error mechanism to
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
7 * discover the error (errno, or GetLastError())
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
8 *
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
9 * Note that some implementations cannot distinguish between a
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
10 * condition variable wait time-out and successful wait. Most often
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
11 * the difference is moot anyway since the wait condition must be
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
12 * re-checked.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
13 * PyCOND_TIMEDWAIT, in addition to returning negative on error,
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
14 * thus returns 0 on regular success, 1 on timeout
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
15 * or 2 if it can't tell.
77518
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
16 *
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
17 * There are at least two caveats with using these condition variables,
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
18 * due to the fact that they may be emulated with Semaphores on
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
19 * Windows:
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
20 * 1) While PyCOND_SIGNAL() will wake up at least one thread, we
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
21 * cannot currently guarantee that it will be one of the threads
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
22 * already waiting in a PyCOND_WAIT() call. It _could_ cause
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
23 * the wakeup of a subsequent thread to try a PyCOND_WAIT(),
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
24 * including the thread doing the PyCOND_SIGNAL() itself.
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
25 * The same applies to PyCOND_BROADCAST(), if N threads are waiting
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
26 * then at least N threads will be woken up, but not necessarily
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
27 * those already waiting.
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
28 * For this reason, don't make the scheduling assumption that a
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
29 * specific other thread will get the wakeup signal
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
30 * 2) The _mutex_ must be held when calling PyCOND_SIGNAL() and
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
31 * PyCOND_BROADCAST().
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
32 * While e.g. the posix standard strongly recommends that the mutex
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
33 * associated with the condition variable is held when a
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
34 * pthread_cond_signal() call is made, this is not a hard requirement,
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
35 * although scheduling will not be "reliable" if it isn't. Here
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
36 * the mutex is used for internal synchronization of the emulated
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
37 * Condition Variable.
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
38 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
39
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
40 #ifndef _CONDVAR_H_
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
41 #define _CONDVAR_H_
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
42
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
43 #include "Python.h"
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
44
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
45 #ifndef _POSIX_THREADS
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
46 /* This means pthreads are not implemented in libc headers, hence the macro
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
47 not present in unistd.h. But they still can be implemented as an external
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
48 library (e.g. gnu pth in pthread emulation) */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
49 # ifdef HAVE_PTHREAD_H
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
50 # include <pthread.h> /* _POSIX_THREADS */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
51 # endif
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
52 #endif
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
53
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
54 #ifdef _POSIX_THREADS
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
55 /*
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
56 * POSIX support
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
57 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
58 #define Py_HAVE_CONDVAR
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
59
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
60 #include <pthread.h>
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
61
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
62 #define PyCOND_ADD_MICROSECONDS(tv, interval) \
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
63 do { \
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
64 tv.tv_usec += (long) interval; \
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
65 tv.tv_sec += tv.tv_usec / 1000000; \
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
66 tv.tv_usec %= 1000000; \
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
67 } while (0)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
68
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
69 /* We assume all modern POSIX systems have gettimeofday() */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
70 #ifdef GETTIMEOFDAY_NO_TZ
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
71 #define PyCOND_GETTIMEOFDAY(ptv) gettimeofday(ptv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
72 #else
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
73 #define PyCOND_GETTIMEOFDAY(ptv) gettimeofday(ptv, (struct timezone *)NULL)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
74 #endif
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
75
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
76 /* The following functions return 0 on success, nonzero on error */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
77 #define PyMUTEX_T pthread_mutex_t
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
78 #define PyMUTEX_INIT(mut) pthread_mutex_init((mut), NULL)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
79 #define PyMUTEX_FINI(mut) pthread_mutex_destroy(mut)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
80 #define PyMUTEX_LOCK(mut) pthread_mutex_lock(mut)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
81 #define PyMUTEX_UNLOCK(mut) pthread_mutex_unlock(mut)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
82
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
83 #define PyCOND_T pthread_cond_t
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
84 #define PyCOND_INIT(cond) pthread_cond_init((cond), NULL)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
85 #define PyCOND_FINI(cond) pthread_cond_destroy(cond)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
86 #define PyCOND_SIGNAL(cond) pthread_cond_signal(cond)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
87 #define PyCOND_BROADCAST(cond) pthread_cond_broadcast(cond)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
88 #define PyCOND_WAIT(cond, mut) pthread_cond_wait((cond), (mut))
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
89
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
90 /* return 0 for success, 1 on timeout, -1 on error */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
91 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
92 PyCOND_TIMEDWAIT(PyCOND_T *cond, PyMUTEX_T *mut, long us)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
93 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
94 int r;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
95 struct timespec ts;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
96 struct timeval deadline;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
97
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
98 PyCOND_GETTIMEOFDAY(&deadline);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
99 PyCOND_ADD_MICROSECONDS(deadline, us);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
100 ts.tv_sec = deadline.tv_sec;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
101 ts.tv_nsec = deadline.tv_usec * 1000;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
102
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
103 r = pthread_cond_timedwait((cond), (mut), &ts);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
104 if (r == ETIMEDOUT)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
105 return 1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
106 else if (r)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
107 return -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
108 else
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
109 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
110 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
111
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
112 #elif defined(NT_THREADS)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
113 /*
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
114 * Windows (XP, 2003 server and later, as well as (hopefully) CE) support
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
115 *
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
116 * Emulated condition variables ones that work with XP and later, plus
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
117 * example native support on VISTA and onwards.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
118 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
119 #define Py_HAVE_CONDVAR
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
120
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
121
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
122 /* include windows if it hasn't been done before */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
123 #define WIN32_LEAN_AND_MEAN
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
124 #include <windows.h>
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
125
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
126 /* options */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
127 /* non-emulated condition variables are provided for those that want
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
128 * to target Windows Vista. Modify this macro to enable them.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
129 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
130 #ifndef _PY_EMULATED_WIN_CV
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
131 #define _PY_EMULATED_WIN_CV 1 /* use emulated condition variables */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
132 #endif
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
133
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
134 /* fall back to emulation if not targeting Vista */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
135 #if !defined NTDDI_VISTA || NTDDI_VERSION < NTDDI_VISTA
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
136 #undef _PY_EMULATED_WIN_CV
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
137 #define _PY_EMULATED_WIN_CV 1
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
138 #endif
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
139
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
140
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
141 #if _PY_EMULATED_WIN_CV
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
142
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
143 /* The mutex is a CriticalSection object and
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
144 The condition variables is emulated with the help of a semaphore.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
145 Semaphores are available on Windows XP (2003 server) and later.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
146 We use a Semaphore rather than an auto-reset event, because although
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
147 an auto-resent event might appear to solve the lost-wakeup bug (race
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
148 condition between releasing the outer lock and waiting) because it
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
149 maintains state even though a wait hasn't happened, there is still
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
150 a lost wakeup problem if more than one thread are interrupted in the
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
151 critical place. A semaphore solves that, because its state is counted,
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
152 not Boolean.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
153 Because it is ok to signal a condition variable with no one
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
154 waiting, we need to keep track of the number of
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
155 waiting threads. Otherwise, the semaphore's state could rise
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
156 without bound. This also helps reduce the number of "spurious wakeups"
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
157 that would otherwise happen.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
158
77518
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
159 This implementation still has the problem that the threads woken
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
160 with a "signal" aren't necessarily those that are already
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
161 waiting. It corresponds to listing 2 in:
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
162 http://birrell.org/andrew/papers/ImplementingCVs.pdf
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
163
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
164 Generic emulations of the pthread_cond_* API using
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
165 earlier Win32 functions can be found on the Web.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
166 The following read can be edificating (or not):
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
167 http://www.cse.wustl.edu/~schmidt/win32-cv-1.html
77518
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
168
d7a72fdcc168 Issue #15038: Document caveats with the emulated condition variables.
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77515
diff changeset
169 See also
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
170 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
171
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
172 typedef CRITICAL_SECTION PyMUTEX_T;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
173
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
174 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
175 PyMUTEX_INIT(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
176 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
177 InitializeCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
178 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
179 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
180
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
181 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
182 PyMUTEX_FINI(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
183 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
184 DeleteCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
185 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
186 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
187
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
188 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
189 PyMUTEX_LOCK(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
190 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
191 EnterCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
192 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
193 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
194
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
195 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
196 PyMUTEX_UNLOCK(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
197 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
198 LeaveCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
199 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
200 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
201
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
202 /* The ConditionVariable object. From XP onwards it is easily emulated with
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
203 * a Semaphore
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
204 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
205
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
206 typedef struct _PyCOND_T
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
207 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
208 HANDLE sem;
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
209 int waiting; /* to allow PyCOND_SIGNAL to be a no-op */
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
210 } PyCOND_T;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
211
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
212 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
213 PyCOND_INIT(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
214 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
215 /* A semaphore with a "large" max value, The positive value
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
216 * is only needed to catch those "lost wakeup" events and
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
217 * race conditions when a timed wait elapses.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
218 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
219 cv->sem = CreateSemaphore(NULL, 0, 100000, NULL);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
220 if (cv->sem==NULL)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
221 return -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
222 cv->waiting = 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
223 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
224 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
225
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
226 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
227 PyCOND_FINI(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
228 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
229 return CloseHandle(cv->sem) ? 0 : -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
230 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
231
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
232 /* this implementation can detect a timeout. Returns 1 on timeout,
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
233 * 0 otherwise (and -1 on error)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
234 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
235 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
236 _PyCOND_WAIT_MS(PyCOND_T *cv, PyMUTEX_T *cs, DWORD ms)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
237 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
238 DWORD wait;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
239 cv->waiting++;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
240 PyMUTEX_UNLOCK(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
241 /* "lost wakeup bug" would occur if the caller were interrupted here,
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
242 * but we are safe because we are using a semaphore wich has an internal
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
243 * count.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
244 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
245 wait = WaitForSingleObject(cv->sem, ms);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
246 PyMUTEX_LOCK(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
247 if (wait != WAIT_OBJECT_0)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
248 --cv->waiting;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
249 /* Here we have a benign race condition with PyCOND_SIGNAL.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
250 * When failure occurs or timeout, it is possible that
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
251 * PyCOND_SIGNAL also decrements this value
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
252 * and signals releases the mutex. This is benign because it
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
253 * just means an extra spurious wakeup for a waiting thread.
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
254 * ('waiting' corresponds to the semaphore's "negative" count and
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
255 * we may end up with e.g. (waiting == -1 && sem.count == 1). When
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
256 * a new thread comes along, it will pass right throuhgh, having
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
257 * adjusted it to (waiting == 0 && sem.count == 0).
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
258 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
259
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
260 if (wait == WAIT_FAILED)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
261 return -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
262 /* return 0 on success, 1 on timeout */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
263 return wait != WAIT_OBJECT_0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
264 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
265
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
266 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
267 PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
268 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
269 int result = _PyCOND_WAIT_MS(cv, cs, INFINITE);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
270 return result >= 0 ? 0 : result;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
271 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
272
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
273 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
274 PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
275 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
276 return _PyCOND_WAIT_MS(cv, cs, us/1000);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
277 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
278
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
279 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
280 PyCOND_SIGNAL(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
281 {
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
282 /* this test allows PyCOND_SIGNAL to be a no-op unless required
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
283 * to wake someone up, thus preventing an unbounded increase of
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
284 * the semaphore's internal counter.
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
285 */
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
286 if (cv->waiting > 0) {
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
287 /* notifying thread decreases the cv->waiting count so that
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
288 * a delay between notify and actual wakeup of the target thread
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
289 * doesn't cause a number of extra ReleaseSemaphore calls.
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
290 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
291 cv->waiting--;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
292 return ReleaseSemaphore(cv->sem, 1, NULL) ? 0 : -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
293 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
294 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
295 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
296
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
297 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
298 PyCOND_BROADCAST(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
299 {
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
300 if (cv->waiting > 0) {
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
301 return ReleaseSemaphore(cv->sem, cv->waiting, NULL) ? 0 : -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
302 cv->waiting = 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
303 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
304 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
305 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
306
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
307 #else
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
308
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
309 /* Use native Win7 primitives if build target is Win7 or higher */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
310
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
311 /* SRWLOCK is faster and better than CriticalSection */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
312 typedef SRWLOCK PyMUTEX_T;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
313
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
314 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
315 PyMUTEX_INIT(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
316 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
317 InitializeSRWLock(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
318 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
319 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
320
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
321 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
322 PyMUTEX_FINI(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
323 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
324 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
325 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
326
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
327 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
328 PyMUTEX_LOCK(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
329 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
330 AcquireSRWLockExclusive(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
331 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
332 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
333
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
334 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
335 PyMUTEX_UNLOCK(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
336 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
337 ReleaseSRWLockExclusive(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
338 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
339 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
340
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
341
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
342 typedef CONDITION_VARIABLE PyCOND_T;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
343
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
344 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
345 PyCOND_INIT(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
346 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
347 InitializeConditionVariable(cv);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
348 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
349 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
350 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
351 PyCOND_FINI(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
352 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
353 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
354 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
355
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
356 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
357 PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
358 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
359 return SleepConditionVariableSRW(cv, cs, INFINITE, 0) ? 0 : -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
360 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
361
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
362 /* This implementation makes no distinction about timeouts. Signal
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
363 * 2 to indicate that we don't know.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
364 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
365 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
366 PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
367 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
368 return SleepConditionVariableSRW(cv, cs, us/1000, 0) ? 2 : -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
369 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
370
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
371 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
372 PyCOND_SIGNAL(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
373 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
374 WakeConditionVariable(cv);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
375 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
376 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
377
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
378 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
379 PyCOND_BROADCAST(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
380 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
381 WakeAllConditionVariable(cv);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
382 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
383 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
384
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
385
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
386 #endif /* _PY_EMULATED_WIN_CV */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
387
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
388 #endif /* _POSIX_THREADS, NT_THREADS */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
389
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
390 #endif /* _CONDVAR_H_ */