annotate Mac/Modules/autoGIL.c @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents 6df0394abbf1
children fd25030223b0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28939
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
1 #include "Python.h"
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
2 #include <CoreFoundation/CFRunLoop.h>
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
3
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
4 /* These macros are defined in Python 2.3 but not 2.2 */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
5 #ifndef PyMODINIT_FUNC
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
6 #define PyMODINIT_FUNC void
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
7 #endif
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
8 #ifndef PyDoc_STRVAR
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
9 #define PyDoc_STRVAR(Var,Str) static char Var[] = Str
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
10 #endif
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
11
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
12
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
13 #undef AUTOGIL_DEBUG
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
14
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
15 static PyObject *AutoGILError;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
16
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
17
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
18 static void autoGILCallback(CFRunLoopObserverRef observer,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
19 CFRunLoopActivity activity,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
20 void *info) {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
21 PyThreadState **p_tstate = (PyThreadState **)info;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
22
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
23 switch (activity) {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
24 case kCFRunLoopBeforeWaiting:
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
25 /* going to sleep, release GIL */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
26 #ifdef AUTOGIL_DEBUG
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
27 fprintf(stderr, "going to sleep, release GIL\n");
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
28 #endif
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
29 *p_tstate = PyEval_SaveThread();
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
30 break;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
31 case kCFRunLoopAfterWaiting:
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
32 /* waking up, acquire GIL */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
33 #ifdef AUTOGIL_DEBUG
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
34 fprintf(stderr, "waking up, acquire GIL\n");
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
35 #endif
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
36 PyEval_RestoreThread(*p_tstate);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
37 *p_tstate = NULL;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
38 break;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
39 default:
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
40 break;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
41 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
42 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
43
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
44 static void infoRelease(const void *info) {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
45 /* XXX This should get called when the run loop is deallocated,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
46 but this doesn't seem to happen. So for now: leak. */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
47 PyMem_Free((void *)info);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
48 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
49
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
50 static PyObject *
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
51 autoGIL_installAutoGIL(PyObject *self)
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
52 {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
53 PyObject *tstate_dict = PyThreadState_GetDict();
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
54 PyObject *v;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
55 CFRunLoopRef rl;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
56 PyThreadState **p_tstate; /* for use in the info field */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
57 CFRunLoopObserverContext context = {0, NULL, NULL, NULL, NULL};
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
58 CFRunLoopObserverRef observer;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
59
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
60 if (tstate_dict == NULL)
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
61 return NULL;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
62 v = PyDict_GetItemString(tstate_dict, "autoGIL.InstalledAutoGIL");
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
63 if (v != NULL) {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
64 /* we've already installed a callback for this thread */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
65 Py_INCREF(Py_None);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
66 return Py_None;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
67 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
68
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
69 rl = CFRunLoopGetCurrent();
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
70 if (rl == NULL) {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
71 PyErr_SetString(AutoGILError,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
72 "can't get run loop for current thread");
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
73 return NULL;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
74 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
75
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
76 p_tstate = PyMem_Malloc(sizeof(PyThreadState *));
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
77 if (p_tstate == NULL) {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
78 PyErr_SetString(PyExc_MemoryError,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
79 "not enough memory to allocate "
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
80 "tstate pointer");
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
81 return NULL;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
82 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
83 *p_tstate = NULL;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
84 context.info = (void *)p_tstate;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
85 context.release = infoRelease;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
86
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
87 observer = CFRunLoopObserverCreate(
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
88 NULL,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
89 kCFRunLoopBeforeWaiting | kCFRunLoopAfterWaiting,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
90 1, 0, autoGILCallback, &context);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
91 if (observer == NULL) {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
92 PyErr_SetString(AutoGILError,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
93 "can't create event loop observer");
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
94 return NULL;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
95 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
96 CFRunLoopAddObserver(rl, observer, kCFRunLoopDefaultMode);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
97 /* XXX how to check for errors? */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
98
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
99 /* register that we have installed a callback for this thread */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
100 if (PyDict_SetItemString(tstate_dict, "autoGIL.InstalledAutoGIL",
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
101 Py_None) < 0)
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
102 return NULL;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
103
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
104 Py_INCREF(Py_None);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
105 return Py_None;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
106 }
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
107
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
108 PyDoc_STRVAR(autoGIL_installAutoGIL_doc,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
109 "installAutoGIL() -> None\n\
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
110 Install an observer callback in the event loop (CFRunLoop) for the\n\
28942
393429a6fa16 fixed typo
Just van Rossum <just@letterror.com>
parents: 28939
diff changeset
111 current thread, that will lock and unlock the Global Interpreter Lock\n\
28939
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
112 (GIL) at appropriate times, allowing other Python threads to run while\n\
28942
393429a6fa16 fixed typo
Just van Rossum <just@letterror.com>
parents: 28939
diff changeset
113 the event loop is idle."
28939
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
114 );
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
115
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
116 static PyMethodDef autoGIL_methods[] = {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
117 {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
118 "installAutoGIL",
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
119 (PyCFunction)autoGIL_installAutoGIL,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
120 METH_NOARGS,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
121 autoGIL_installAutoGIL_doc
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
122 },
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
123 { 0, 0, 0, 0 } /* sentinel */
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
124 };
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
125
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
126 PyDoc_STRVAR(autoGIL_docs,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
127 "The autoGIL module provides a function (installAutoGIL) that\n\
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
128 automatically locks and unlocks Python's Global Interpreter Lock\n\
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
129 when running an event loop."
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
130 );
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
131
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
132 PyMODINIT_FUNC
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
133 initautoGIL(void)
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
134 {
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
135 PyObject *mod;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
136
46967
6df0394abbf1 Add warnings to and deprecated all those Mac modules
Benjamin Peterson <benjamin@python.org>
parents: 28942
diff changeset
137 if (PyErr_WarnPy3k("In 3.x, the autoGIL module is removed.", 1) < 0)
6df0394abbf1 Add warnings to and deprecated all those Mac modules
Benjamin Peterson <benjamin@python.org>
parents: 28942
diff changeset
138 return;
6df0394abbf1 Add warnings to and deprecated all those Mac modules
Benjamin Peterson <benjamin@python.org>
parents: 28942
diff changeset
139
28939
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
140 mod = Py_InitModule4("autoGIL", autoGIL_methods, autoGIL_docs,
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
141 NULL, PYTHON_API_VERSION);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
142 if (mod == NULL)
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
143 return;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
144 AutoGILError = PyErr_NewException("autoGIL.AutoGILError",
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
145 PyExc_Exception, NULL);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
146 if (AutoGILError == NULL)
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
147 return;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
148 Py_INCREF(AutoGILError);
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
149 if (PyModule_AddObject(mod, "AutoGILError",
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
150 AutoGILError) < 0)
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
151 return;
4756fa538560 Short and sweet module doing something very useful: for event loop
Just van Rossum <just@letterror.com>
parents:
diff changeset
152 }