]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
python lock deadlock on MacOSX.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 23 Apr 2009 14:59:44 +0000 (14:59 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Thu, 23 Apr 2009 14:59:44 +0000 (14:59 +0000)
git-svn-id: file:///svn/unbound/trunk@1615 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
pythonmod/pythonmod.c
testdata/pymod.tpkg

index c68a21937a27dc3d4b4d524581cfd1215d649aa7..f57f97443f8a53283602dc8558e2781beb228215 100644 (file)
@@ -2,6 +2,7 @@
        - fix for threadsafety in solaris thr_key_create() in tests.
        - iana portlist updated.
        - fix pylib test for Darwin.
+       - fix pymod test for Darwin and a python threading bug in pymod init.
 
 21 April 2009: Wouter
        - fix for build outside sourcedir.
index 67e07b2b046408b876d5d899622b0d995ead66a8..fe19bfa25142529712de179919c0d99b24dc4e96 100644 (file)
@@ -87,6 +87,8 @@ int pythonmod_init(struct module_env* env, int id)
       SWIG_init();
    }
 
+   PyEval_AcquireLock();
+
    /* Initialize Python */
    PyRun_SimpleString("import sys \n");
    PyRun_SimpleString("sys.path.append('.') \n");
@@ -101,6 +103,7 @@ int pythonmod_init(struct module_env* env, int id)
    if (PyRun_SimpleString("from unboundmodule import *\n") < 0)
    {
       log_err("pythonmod: cannot initialize core module: unboundmodule.py"); 
+      PyEval_ReleaseLock();
       return 0;
    }
 
@@ -108,6 +111,7 @@ int pythonmod_init(struct module_env* env, int id)
    if ((script_py = fopen(pe->fname, "r")) == NULL) 
    {
       log_err("pythonmod: can't open file %s for reading", pe->fname);
+      PyEval_ReleaseLock();
       return 0;
    }
 
@@ -123,6 +127,7 @@ int pythonmod_init(struct module_env* env, int id)
    if (PyRun_SimpleFile(script_py, pe->fname) < 0) 
    {
       log_err("pythonmod: can't parse Python script %s", pe->fname);
+      PyEval_ReleaseLock();
       return 0;
    }
 
@@ -131,25 +136,28 @@ int pythonmod_init(struct module_env* env, int id)
    if ((pe->func_init = PyDict_GetItemString(pe->dict, "init")) == NULL) 
    {
       log_err("pythonmod: function init is missing in %s", pe->fname);
+      PyEval_ReleaseLock();
       return 0;
    }
    if ((pe->func_deinit = PyDict_GetItemString(pe->dict, "deinit")) == NULL) 
    {
       log_err("pythonmod: function deinit is missing in %s", pe->fname);
+      PyEval_ReleaseLock();
       return 0;
    }
    if ((pe->func_operate = PyDict_GetItemString(pe->dict, "operate")) == NULL) 
    {
       log_err("pythonmod: function operate is missing in %s", pe->fname);
+      PyEval_ReleaseLock();
       return 0;
    }
    if ((pe->func_inform = PyDict_GetItemString(pe->dict, "inform_super")) == NULL) 
    {
       log_err("pythonmod: function inform_super is missing in %s", pe->fname);
+      PyEval_ReleaseLock();
       return 0;
    }
 
-   PyEval_AcquireLock();
    py_cfg = SWIG_NewPointerObj((void*) env->cfg, SWIGTYPE_p_config_file, 0);
    res = PyObject_CallFunction(pe->func_init, "iO", id, py_cfg);
    if (PyErr_Occurred()) 
index 7361ffe1c23df4d377ca05479dd334ee5a200269..afce9a6db03e7f74955a8404c6523671190e62d2 100644 (file)
Binary files a/testdata/pymod.tpkg and b/testdata/pymod.tpkg differ