summaryrefslogtreecommitdiff
path: root/numpy/f2py/rules.py
diff options
context:
space:
mode:
authorPauli Virtanen <pav@iki.fi>2020-06-07 15:37:21 +0300
committerPauli Virtanen <pav@iki.fi>2020-06-07 21:27:50 +0300
commitc3491aa1a6458e6cc1fce72dd9e0ec6e05e7c911 (patch)
treeea31542fec06e0b5f675e32d2c641939ff538a7e /numpy/f2py/rules.py
parent267621f07a902eceffc179fa01f984f3e2d4bdcd (diff)
downloadnumpy-c3491aa1a6458e6cc1fce72dd9e0ec6e05e7c911.tar.gz
BUG: numpy/f2py: put callback globals to thread-local storage
Diffstat (limited to 'numpy/f2py/rules.py')
-rwxr-xr-xnumpy/f2py/rules.py45
1 files changed, 19 insertions, 26 deletions
diff --git a/numpy/f2py/rules.py b/numpy/f2py/rules.py
index ad49f4590..7b25b545a 100755
--- a/numpy/f2py/rules.py
+++ b/numpy/f2py/rules.py
@@ -749,10 +749,9 @@ arg_rules = [
'docstrcbs': '#cbdocstr#',
'latexdocstrcbs': '\\item[] #cblatexdocstr#',
'latexdocstropt': {isintent_nothide: '\\item[]{{}\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\verb@#varname#@{}}.'},
- 'decl': [' PyObject *#varname#_capi = Py_None;',
+ 'decl': [' #cbname#_t #varname#_cb = { Py_None, NULL, 0 };',
+ ' #cbname#_t *#varname#_cb_ptr = &#varname#_cb;',
' PyTupleObject *#varname#_xa_capi = NULL;',
- ' PyTupleObject *#varname#_args_capi = NULL;',
- ' int #varname#_nofargs_capi = 0;',
{l_not(isintent_callback):
' #cbname#_typedef #varname#_cptr;'}
],
@@ -760,25 +759,25 @@ arg_rules = [
'argformat': {isrequired: 'O'},
'keyformat': {isoptional: 'O'},
'xaformat': {isintent_nothide: 'O!'},
- 'args_capi': {isrequired: ',&#varname#_capi'},
- 'keys_capi': {isoptional: ',&#varname#_capi'},
+ 'args_capi': {isrequired: ',&#varname#_cb.capi'},
+ 'keys_capi': {isoptional: ',&#varname#_cb.capi'},
'keys_xa': ',&PyTuple_Type,&#varname#_xa_capi',
- 'setjmpbuf': '(setjmp(#cbname#_jmpbuf))',
+ 'setjmpbuf': '(setjmp(#varname#_cb.jmpbuf))',
'callfortran': {l_not(isintent_callback): '#varname#_cptr,'},
'need': ['#cbname#', 'setjmp.h'],
'_check':isexternal
},
{
'frompyobj': [{l_not(isintent_callback): """\
-if(F2PyCapsule_Check(#varname#_capi)) {
- #varname#_cptr = F2PyCapsule_AsVoidPtr(#varname#_capi);
+if(F2PyCapsule_Check(#varname#_cb.capi)) {
+ #varname#_cptr = F2PyCapsule_AsVoidPtr(#varname#_cb.capi);
} else {
#varname#_cptr = #cbname#;
}
"""}, {isintent_callback: """\
-if (#varname#_capi==Py_None) {
- #varname#_capi = PyObject_GetAttrString(#modulename#_module,\"#varname#\");
- if (#varname#_capi) {
+if (#varname#_cb.capi==Py_None) {
+ #varname#_cb.capi = PyObject_GetAttrString(#modulename#_module,\"#varname#\");
+ if (#varname#_cb.capi) {
if (#varname#_xa_capi==NULL) {
if (PyObject_HasAttrString(#modulename#_module,\"#varname#_extra_args\")) {
PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\"#varname#_extra_args\");
@@ -796,34 +795,28 @@ if (#varname#_capi==Py_None) {
}
}
}
- if (#varname#_capi==NULL) {
+ if (#varname#_cb.capi==NULL) {
PyErr_SetString(#modulename#_error,\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\n\");
return NULL;
}
}
"""},
"""\
- #varname#_nofargs_capi = #cbname#_nofargs;
- if (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\"failed in processing argument list for call-back #varname#.\")) {
- jmp_buf #varname#_jmpbuf;""",
+ if (create_cb_arglist(#varname#_cb.capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#varname#_cb.nofargs,&#varname#_cb.args_capi,\"failed in processing argument list for call-back #varname#.\")) {
+""",
{debugcapi: ["""\
- fprintf(stderr,\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\n\",#cbname#_nofargs);
+ fprintf(stderr,\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\n\",#varname#_cb.nofargs);
CFUNCSMESSPY(\"for #varname#=\",#cbname#_capi);""",
{l_not(isintent_callback): """ fprintf(stderr,\"#vardebugshowvalue# (call-back in C).\\n\",#cbname#);"""}]},
"""\
- CFUNCSMESS(\"Saving jmpbuf for `#varname#`.\\n\");
- SWAP(#varname#_capi,#cbname#_capi,PyObject);
- SWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);
- memcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));""",
+ CFUNCSMESS(\"Saving callback variables for `#varname#`.\\n\");
+ #varname#_cb_ptr = swap_active_#cbname#(#varname#_cb_ptr);""",
],
'cleanupfrompyobj':
"""\
- CFUNCSMESS(\"Restoring jmpbuf for `#varname#`.\\n\");
- #cbname#_capi = #varname#_capi;
- Py_DECREF(#cbname#_args_capi);
- #cbname#_args_capi = #varname#_args_capi;
- #cbname#_nofargs = #varname#_nofargs_capi;
- memcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));
+ CFUNCSMESS(\"Restoring callback variables for `#varname#`.\\n\");
+ #varname#_cb_ptr = swap_active_#cbname#(#varname#_cb_ptr);
+ Py_DECREF(#varname#_cb.args_capi);
}""",
'need': ['SWAP', 'create_cb_arglist'],
'_check':isexternal,