You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2014/12/17 17:45:30 UTC

svn commit: r1646292 - in /qpid/dispatch/trunk: include/qpid/dispatch/python_embedded.h src/error.c src/python_embedded.c src/router_pynode.c

Author: tross
Date: Wed Dec 17 16:45:30 2014
New Revision: 1646292

URL: http://svn.apache.org/r1646292
Log:
DISPATCH-88 - Added asserts to check the python lock.  Fixed instance of python calls with the lock not held.

Modified:
    qpid/dispatch/trunk/include/qpid/dispatch/python_embedded.h
    qpid/dispatch/trunk/src/error.c
    qpid/dispatch/trunk/src/python_embedded.c
    qpid/dispatch/trunk/src/router_pynode.c

Modified: qpid/dispatch/trunk/include/qpid/dispatch/python_embedded.h
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/include/qpid/dispatch/python_embedded.h?rev=1646292&r1=1646291&r2=1646292&view=diff
==============================================================================
--- qpid/dispatch/trunk/include/qpid/dispatch/python_embedded.h (original)
+++ qpid/dispatch/trunk/include/qpid/dispatch/python_embedded.h Wed Dec 17 16:45:30 2014
@@ -79,5 +79,6 @@ PyObject *qd_field_to_py(qd_parsed_field
 typedef PyGILState_STATE qd_python_lock_state_t;
 qd_python_lock_state_t qd_python_lock(void);
 void qd_python_unlock(qd_python_lock_state_t state);
+void qd_python_check_lock(void);
 
 #endif

Modified: qpid/dispatch/trunk/src/error.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/error.c?rev=1646292&r1=1646291&r2=1646292&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/error.c (original)
+++ qpid/dispatch/trunk/src/error.c Wed Dec 17 16:45:30 2014
@@ -21,6 +21,7 @@
 #include <qpid/dispatch/error.h>
 #include <qpid/dispatch/enum.h>
 #include <qpid/dispatch/log.h>
+#include <qpid/dispatch/python_embedded.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <errno.h>
@@ -144,6 +145,7 @@ static void log_trace_py(PyObject *type,
 }
 
 qd_error_t qd_error_py_impl(const char *file, int line) {
+    qd_python_check_lock();
     if (PyErr_Occurred()) {
         PyObject *type, *value, *trace;
         PyErr_Fetch(&type, &value, &trace); /* Note clears the python error indicator */

Modified: qpid/dispatch/trunk/src/python_embedded.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/python_embedded.c?rev=1646292&r1=1646291&r2=1646292&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/python_embedded.c (original)
+++ qpid/dispatch/trunk/src/python_embedded.c Wed Dec 17 16:45:30 2014
@@ -34,6 +34,7 @@
 
 static qd_dispatch_t   *dispatch   = 0;
 static sys_mutex_t     *ilock      = 0;
+static bool             lock_held  = false;
 static qd_log_source_t *log_source = 0;
 static PyObject        *dispatch_module = 0;
 static PyObject        *message_type = 0;
@@ -74,6 +75,12 @@ PyObject *qd_python_module(void)
 }
 
 
+void qd_python_check_lock(void)
+{
+    assert(lock_held);
+}
+
+
 //===============================================================================
 // Data Conversion Functions
 //===============================================================================
@@ -120,6 +127,7 @@ static PyObject *parsed_to_py_string(qd_
 
 qd_error_t qd_py_to_composed(PyObject *value, qd_composed_field_t *field)
 {
+    qd_python_check_lock();
     qd_error_clear();
     if (value == Py_None) {
         qd_compose_insert_null(field);
@@ -195,6 +203,7 @@ qd_error_t qd_py_to_composed(PyObject *v
 
 void qd_py_attr_to_composed(PyObject *object, const char *attr, qd_composed_field_t *field)
 {
+    qd_python_check_lock();
     PyObject *value = PyObject_GetAttrString(object, attr);
     if (value) {
         qd_py_to_composed(value, field);
@@ -207,6 +216,7 @@ void qd_py_attr_to_composed(PyObject *ob
 
 PyObject *qd_field_to_py(qd_parsed_field_t *field)
 {
+    qd_python_check_lock();
     PyObject *result = 0;
     uint8_t   tag    = qd_parse_tag(field);
     switch (tag) {
@@ -734,10 +744,12 @@ static void qd_python_setup(void)
 qd_python_lock_state_t qd_python_lock(void)
 {
     sys_mutex_lock(ilock);
+    lock_held = true;
     return 0;
 }
 
 void qd_python_unlock(qd_python_lock_state_t lock_state)
 {
+    lock_held = false;
     sys_mutex_unlock(ilock);
 }

Modified: qpid/dispatch/trunk/src/router_pynode.c
URL: http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_pynode.c?rev=1646292&r1=1646291&r2=1646292&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_pynode.c (original)
+++ qpid/dispatch/trunk/src/router_pynode.c Wed Dec 17 16:45:30 2014
@@ -626,6 +626,7 @@ void qd_router_python_free(qd_router_t *
 qd_error_t qd_pyrouter_tick(qd_router_t *router)
 {
     qd_error_clear();
+    qd_error_t err = QD_ERROR_NONE;
 
     PyObject *pArgs;
     PyObject *pValue;
@@ -636,9 +637,10 @@ qd_error_t qd_pyrouter_tick(qd_router_t
         pValue = PyObject_CallObject(pyTick, pArgs);
         Py_DECREF(pArgs);
         Py_XDECREF(pValue);
+        err = qd_error_py();
         qd_python_unlock(lock_state);
     }
-    return qd_error_py();
+    return err;
 }
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org