more threads cleaning

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@7944 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2005-12-07 22:25:05 +00:00
commit 5aada71816
5 changed files with 27 additions and 41 deletions

View file

@ -273,9 +273,7 @@ namespace swig
{
%ignore stop_iteration;
%typemap(throws) stop_iteration {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
PyErr_SetObject(PyExc_StopIteration, SWIG_Py_Void());
SWIG_PYTHON_THREAD_END_BLOCK;
SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
SWIG_fail;
}
}
@ -494,7 +492,6 @@ namespace swig
try {
return swig::as<T>(item, true);
} catch (std::exception& e) {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
char msg[1024];
snprintf(msg, sizeof(msg), "in sequence element %d ", _index);
if (!PyErr_Occurred()) {
@ -502,7 +499,6 @@ namespace swig
}
SWIG_Python_AddErrorMsg(msg);
SWIG_Python_AddErrorMsg(e.what());
SWIG_PYTHON_THREAD_END_BLOCK;
throw;
}
}
@ -913,11 +909,9 @@ namespace swig
}
} catch (std::exception& e) {
if (seq) {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
if (!PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, e.what());
}
SWIG_PYTHON_THREAD_END_BLOCK;
}
return 0;
}
@ -955,10 +949,8 @@ namespace swig
}
return obj;
} else {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
PyErr_SetString(PyExc_OverflowError,
"sequence size not valid in python");
SWIG_PYTHON_THREAD_END_BLOCK;
return NULL;
}
}

View file

@ -61,36 +61,36 @@ swig_varlink_dealloc(swig_varlinkobject *v) {
SWIGINTERN PyObject *
swig_varlink_getattr(swig_varlinkobject *v, char *n) {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
PyObject *res = NULL;
swig_globalvar *var = v->vars;
while (var) {
if (strcmp(var->name,n) == 0) {
PyObject *obj = (*var->get_attr)();
SWIG_PYTHON_THREAD_END_BLOCK;
return obj;
res = (*var->get_attr)();
break;
}
var = var->next;
}
PyErr_SetString(PyExc_NameError,"Unknown C global variable");
SWIG_PYTHON_THREAD_END_BLOCK;
return NULL;
if (res == NULL && !PyErr_Occurred()) {
PyErr_SetString(PyExc_NameError,"Unknown C global variable");
}
return res;
}
SWIGINTERN int
swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
int res = 1;
swig_globalvar *var = v->vars;
while (var) {
if (strcmp(var->name,n) == 0) {
int res = (*var->set_attr)(p);
SWIG_PYTHON_THREAD_END_BLOCK;
return res;
res = (*var->set_attr)(p);
break;
}
var = var->next;
}
PyErr_SetString(PyExc_NameError,"Unknown C global variable");
SWIG_PYTHON_THREAD_END_BLOCK;
return 1;
if (res == 1 && !PyErr_Occurred()) {
PyErr_SetString(PyExc_NameError,"Unknown C global variable");
}
return res;
}
SWIGINTERN PyTypeObject*

View file

@ -44,6 +44,10 @@
#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code)
#define SWIG_Error(code, msg) {SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(SWIG_Python_ErrorType(code), msg); SWIG_PYTHON_THREAD_END_BLOCK; }
#define SWIG_SetErrorObj(type, obj) {SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(type, obj); SWIG_PYTHON_THREAD_END_BLOCK; }
#define SWIG_SetErrorMsg(type, msg) {SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(type, msg); SWIG_PYTHON_THREAD_END_BLOCK; }
#define SWIG_fail goto fail
/*

View file

@ -10,24 +10,24 @@
# endif
# endif
# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads()
# ifndef SWIG_PYTHON_INITIALIZE_THREADS
# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads()
# endif
# ifdef __cplusplus /* C++ code */
class SWIG_Python_Thread_Block {
bool status;
PyGILState_STATE state;
void begin() { if (!status) { state = PyGILState_Ensure(); status = true;} }
public:
void end() { if (status) { PyGILState_Release(state); status = false;} }
SWIG_Python_Thread_Block() : status(false) { begin(); }
SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
~SWIG_Python_Thread_Block() { end(); }
};
class SWIG_Python_Thread_Allow {
bool status;
PyThreadState *save;
void begin() { if (!status) { status = true; save = PyEval_SaveThread(); } }
public:
void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
SWIG_Python_Thread_Allow() : status(false) { begin(); }
SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
~SWIG_Python_Thread_Allow() { end(); }
};
# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block

View file

@ -102,10 +102,7 @@ public:
"if ( $comparison ) { /* subclassed */\n",
" $director_new \n",
"} else {\n",
" SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n",
" PyErr_SetString(PyExc_RuntimeError,",
" \"accessing abstract class or protected constructor\"); \n",
" SWIG_PYTHON_THREAD_END_BLOCK;\n",
" SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing abstract class or protected constructor\"); \n",
" SWIG_fail;\n",
"}\n", NIL);
director_multiple_inheritance = 1;
@ -1214,9 +1211,7 @@ public:
Printf(f->code,"Py_INCREF(Py_NotImplemented);\n");
Printf(f->code,"return Py_NotImplemented;\n");
} else {
Printf(f->code,"SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n");
Printf(f->code,"PyErr_SetString(PyExc_NotImplementedError,\"No matching function for overloaded '%s'\");\n", symname);
Printf(f->code,"SWIG_PYTHON_THREAD_END_BLOCK;\n");
Printf(f->code,"SWIG_SetErrorMsg(PyExc_NotImplementedError,\"No matching function for overloaded '%s'\");\n", symname);
Printf(f->code,"return NULL;\n");
}
Printv(f->code,"}\n",NIL);
@ -1517,9 +1512,7 @@ public:
Printf(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n");
if (dirprot_mode() && !is_public(n)) {
Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name);
Printf(f->code,"SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n");
Printf(f->code, "PyErr_SetString(PyExc_RuntimeError,\"accessing protected member %s\");\n", name);
Printf(f->code,"SWIG_PYTHON_THREAD_END_BLOCK;\n");
Printf(f->code, "SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing protected member %s\");\n", name);
Printf(f->code, "SWIG_fail;\n");
Printf(f->code, "}\n");
}
@ -1541,7 +1534,6 @@ public:
/* Emit the function call */
if (director_method) {
if (allow_thread) thread_end_block(n, f);
Printf(f->code, "try {\n");
Printf(f->code, " Swig::UnknownExceptionHandler dh;\n");
} else {
@ -1563,8 +1555,6 @@ public:
Printf(f->code, "}\n");
}
}
/* This part below still needs cleanup */