annotate Python/condvar.h @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents c6af0b3de726
children
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.
82818
fde60d3f542e Issue #15038 : Fixing the condition broadcast and docs.
Kristján Valur Jónsson <sweskman@gmail.com>
parents: 77518
diff changeset
166 The following read can be give background information to these issues,
fde60d3f542e Issue #15038 : Fixing the condition broadcast and docs.
Kristján Valur Jónsson <sweskman@gmail.com>
parents: 77518
diff changeset
167 but the implementations are all broken in some way.
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
168 http://www.cse.wustl.edu/~schmidt/win32-cv-1.html
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
169 */
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 typedef CRITICAL_SECTION PyMUTEX_T;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
172
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
173 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
174 PyMUTEX_INIT(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
175 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
176 InitializeCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
177 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
178 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
181 PyMUTEX_FINI(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
182 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
183 DeleteCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
184 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
185 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
188 PyMUTEX_LOCK(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
189 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
190 EnterCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
191 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
192 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
195 PyMUTEX_UNLOCK(PyMUTEX_T *cs)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
196 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
197 LeaveCriticalSection(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
198 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
199 }
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 /* 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
202 * a Semaphore
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
203 */
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 typedef struct _PyCOND_T
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
206 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
207 HANDLE sem;
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
208 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
209 } PyCOND_T;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
210
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
211 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
212 PyCOND_INIT(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
213 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
214 /* 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
215 * 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
216 * 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
217 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
218 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
219 if (cv->sem==NULL)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
220 return -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
221 cv->waiting = 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
222 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
223 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
226 PyCOND_FINI(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
227 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
228 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
229 }
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 /* 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
232 * 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
233 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
234 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
235 _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
236 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
237 DWORD wait;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
238 cv->waiting++;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
239 PyMUTEX_UNLOCK(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
240 /* "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
241 * 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
242 * count.
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
243 */
81712
b71b6517af63 Replace WaitForSingleObject with WaitForSingleObjectEx,
Martin v. Löwis <martin@v.loewis.de>
parents: 77518
diff changeset
244 wait = WaitForSingleObjectEx(cv->sem, ms, FALSE);
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
245 PyMUTEX_LOCK(cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
246 if (wait != WAIT_OBJECT_0)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
247 --cv->waiting;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
248 /* 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
249 * 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
250 * 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
251 * 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
252 * just means an extra spurious wakeup for a waiting thread.
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
253 * ('waiting' corresponds to the semaphore's "negative" count and
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
254 * 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
255 * a new thread comes along, it will pass right throuhgh, having
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
256 * 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
257 */
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 if (wait == WAIT_FAILED)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
260 return -1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
261 /* 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
262 return wait != WAIT_OBJECT_0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
263 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
266 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
267 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
268 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
269 return result >= 0 ? 0 : result;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
270 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
273 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
274 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
275 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
276 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
279 PyCOND_SIGNAL(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
280 {
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
281 /* 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
282 * to wake someone up, thus preventing an unbounded increase of
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
283 * the semaphore's internal counter.
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
284 */
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
285 if (cv->waiting > 0) {
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
286 /* notifying thread decreases the cv->waiting count so that
77515
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
287 * a delay between notify and actual wakeup of the target thread
110b38c36a31 Issue #15038:
Kristjan Valur Jonsson <sweskman@gmail.com>
parents: 77513
diff changeset
288 * 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
289 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
290 cv->waiting--;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
291 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
292 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
293 return 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
294 }
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 Py_LOCAL_INLINE(int)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
297 PyCOND_BROADCAST(PyCOND_T *cv)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
diff changeset
298 {
82818
fde60d3f542e Issue #15038 : Fixing the condition broadcast and docs.
Kristján Valur Jónsson <sweskman@gmail.com>
parents: 77518
diff changeset
299 int waiting = cv->waiting;
fde60d3f542e Issue #15038 : Fixing the condition broadcast and docs.
Kristján Valur Jónsson <sweskman@gmail.com>
parents: 77518
diff changeset
300 if (waiting > 0) {
fde60d3f542e Issue #15038 : Fixing the condition broadcast and docs.
Kristján Valur Jónsson <sweskman@gmail.com>
parents: 77518
diff changeset
301 cv->waiting = 0;
fde60d3f542e Issue #15038 : Fixing the condition broadcast and docs.
Kristján Valur Jónsson <sweskman@gmail.com>
parents: 77518
diff changeset
302 return ReleaseSemaphore(cv->sem, waiting, NULL) ? 0 : -1;
77513
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_ */