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 2013/07/05 19:17:45 UTC

svn commit: r1500073 - in /qpid/trunk/qpid/extras/dispatch: include/qpid/dispatch/python_embedded.h src/config.c src/dispatch.c src/py/config/parser.py src/python_embedded.c src/python_embedded.h

Author: tross
Date: Fri Jul  5 17:17:45 2013
New Revision: 1500073

URL: http://svn.apache.org/r1500073
Log:
QPID-4968 - Added an adapter module for Python-to-Dispatch calls.
Implemented LogAdapter within the "dispatch" module to allow Python modules to
emit logs in Dispatch.

Added:
    qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/python_embedded.h
      - copied, changed from r1500023, qpid/trunk/qpid/extras/dispatch/src/python_embedded.h
Removed:
    qpid/trunk/qpid/extras/dispatch/src/python_embedded.h
Modified:
    qpid/trunk/qpid/extras/dispatch/src/config.c
    qpid/trunk/qpid/extras/dispatch/src/dispatch.c
    qpid/trunk/qpid/extras/dispatch/src/py/config/parser.py
    qpid/trunk/qpid/extras/dispatch/src/python_embedded.c

Copied: qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/python_embedded.h (from r1500023, qpid/trunk/qpid/extras/dispatch/src/python_embedded.h)
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/python_embedded.h?p2=qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/python_embedded.h&p1=qpid/trunk/qpid/extras/dispatch/src/python_embedded.h&r1=1500023&r2=1500073&rev=1500073&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/python_embedded.h (original)
+++ qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/python_embedded.h Fri Jul  5 17:17:45 2013
@@ -24,12 +24,45 @@
 #include <qpid/dispatch/parse.h>
 #include <qpid/dispatch/iterator.h>
 
+/**
+ * Initialize the embedded-python subsystem.  This must be called before
+ * any other call into this module is invoked.
+ */
 void dx_python_initialize();
+
+/**
+ * Finalize the embedded-python subsystem.  After this is called, there
+ * must be no further invocation of dx_python methods.
+ */
 void dx_python_finalize();
+
+/**
+ * Start using embedded python.  This is called once by each module that plans
+ * to use embedded python capabilities.  It must call dx_python_start before
+ * using any python components.
+ */
 void dx_python_start();
+
+/**
+ * Stop using embedded python.  This is called once by each module after it is
+ * finished using embedded python capabilities.
+ */
 void dx_python_stop();
 
+/**
+ * Convert a Python object to AMQP format and append to a composed_field.
+ *
+ * @param value A Python Object
+ * @param field A composed field
+ */
 void dx_py_to_composed(PyObject *value, dx_composed_field_t *field);
+
+/**
+ * Convert a parsed field to a Python object
+ *
+ * @param field A parsed field
+ * @return A generated Python object
+ */
 PyObject *dx_field_to_py(dx_parsed_field_t *field);
 
 #endif

Modified: qpid/trunk/qpid/extras/dispatch/src/config.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/config.c?rev=1500073&r1=1500072&r2=1500073&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/config.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/config.c Fri Jul  5 17:17:45 2013
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-#include "python_embedded.h"
+#include <qpid/dispatch/python_embedded.h>
 #include "config_private.h"
 #include <qpid/dispatch/alloc.h>
 #include <qpid/dispatch/log.h>

Modified: qpid/trunk/qpid/extras/dispatch/src/dispatch.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/dispatch.c?rev=1500073&r1=1500072&r2=1500073&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/dispatch.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/dispatch.c Fri Jul  5 17:17:45 2013
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-#include "python_embedded.h"
+#include <qpid/dispatch/python_embedded.h>
 #include <qpid/dispatch.h>
 #include <qpid/dispatch/server.h>
 #include <qpid/dispatch/ctools.h>

Modified: qpid/trunk/qpid/extras/dispatch/src/py/config/parser.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/py/config/parser.py?rev=1500073&r1=1500072&r2=1500073&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/py/config/parser.py (original)
+++ qpid/trunk/qpid/extras/dispatch/src/py/config/parser.py Fri Jul  5 17:17:45 2013
@@ -18,7 +18,8 @@
 ##
 
 import json
-from schema import config_schema
+from schema   import config_schema
+from dispatch import LogAdapter, LOG_TRACE, LOG_ERROR, LOG_INFO
 
 class Section:
   """
@@ -198,10 +199,12 @@ class DXConfig:
     self.raw_config = None
     self.config     = None
     self.schema     = Schema()
+    self.log        = LogAdapter('config.parser')
 
 
   def read_file(self):
     try:
+      self.log.log(LOG_INFO, "Reading Configuration File: %s" % self.path)
       cfile = open(self.path)
       text = cfile.read()
       cfile.close()

Modified: qpid/trunk/qpid/extras/dispatch/src/python_embedded.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/python_embedded.c?rev=1500073&r1=1500072&r2=1500073&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/python_embedded.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/python_embedded.c Fri Jul  5 17:17:45 2013
@@ -17,15 +17,65 @@
  * under the License.
  */
 
-#include "python_embedded.h"
+#include <qpid/dispatch/python_embedded.h>
 #include <qpid/dispatch/threading.h>
 #include <qpid/dispatch/log.h>
 #include <qpid/dispatch/amqp.h>
+#include <qpid/dispatch/alloc.h>
+
+
+//===============================================================================
+// Control Functions
+//===============================================================================
 
 static uint32_t     ref_count  = 0;
 static sys_mutex_t *lock       = 0;
 static char        *log_module = "PYTHON";
 
+static void dx_python_setup();
+
+
+void dx_python_initialize()
+{
+    lock = sys_mutex();
+}
+
+
+void dx_python_finalize()
+{
+    assert(ref_count == 0);
+    sys_mutex_free(lock);
+}
+
+
+void dx_python_start()
+{
+    sys_mutex_lock(lock);
+    if (ref_count == 0) {
+        Py_Initialize();
+        dx_python_setup();
+        dx_log(log_module, LOG_TRACE, "Embedded Python Interpreter Initialized");
+    }
+    ref_count++;
+    sys_mutex_unlock(lock);
+}
+
+
+void dx_python_stop()
+{
+    sys_mutex_lock(lock);
+    ref_count--;
+    if (ref_count == 0) {
+        Py_Finalize();
+        dx_log(log_module, LOG_TRACE, "Embedded Python Interpreter Shut Down");
+    }
+    sys_mutex_unlock(lock);
+}
+
+
+//===============================================================================
+// Data Conversion Functions
+//===============================================================================
 
 static PyObject *parsed_to_py_string(dx_parsed_field_t *field)
 {
@@ -67,43 +117,6 @@ static PyObject *parsed_to_py_string(dx_
 }
 
 
-void dx_python_initialize()
-{
-    lock = sys_mutex();
-}
-
-
-void dx_python_finalize()
-{
-    assert(ref_count == 0);
-    sys_mutex_free(lock);
-}
-
-
-void dx_python_start()
-{
-    sys_mutex_lock(lock);
-    if (ref_count == 0) {
-        Py_Initialize();
-        dx_log(log_module, LOG_TRACE, "Embedded Python Interpreter Initialized");
-    }
-    ref_count++;
-    sys_mutex_unlock(lock);
-}
-
-
-void dx_python_stop()
-{
-    sys_mutex_lock(lock);
-    ref_count--;
-    if (ref_count == 0) {
-        Py_Finalize();
-        dx_log(log_module, LOG_TRACE, "Embedded Python Interpreter Shut Down");
-    }
-    sys_mutex_unlock(lock);
-}
-
-
 void dx_py_to_composed(PyObject *value, dx_composed_field_t *field)
 {
     if      (PyBool_Check(value))
@@ -255,3 +268,161 @@ PyObject *dx_field_to_py(dx_parsed_field
     return result;
 }
 
+
+//===============================================================================
+// Logging Object
+//===============================================================================
+
+typedef struct {
+    PyObject_HEAD
+    PyObject *module_name;
+} LogAdapter;
+
+
+static int LogAdapter_init(LogAdapter *self, PyObject *args, PyObject *kwds)
+{
+    const char *text;
+    if (!PyArg_ParseTuple(args, "s", &text))
+        return -1;
+
+    self->module_name = PyString_FromString(text);
+    return 0;
+}
+
+
+static void LogAdapter_dealloc(LogAdapter* self)
+{
+    Py_XDECREF(self->module_name);
+    self->ob_type->tp_free((PyObject*)self);
+}
+
+
+static PyObject* dx_python_log(PyObject *self, PyObject *args)
+{
+    int level;
+    const char* text;
+
+    if (!PyArg_ParseTuple(args, "is", &level, &text))
+        return 0;
+
+    LogAdapter *self_ptr = (LogAdapter*) self;
+    char       *logmod   = PyString_AS_STRING(self_ptr->module_name);
+
+    dx_log(logmod, level, text);
+
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+
+static PyMethodDef LogAdapter_methods[] = {
+    {"log", dx_python_log, METH_VARARGS, "Emit a Log Line"},
+    {0, 0, 0, 0}
+};
+
+static PyMethodDef empty_methods[] = {
+  {0, 0, 0, 0}
+};
+
+static PyTypeObject LogAdapterType = {
+    PyObject_HEAD_INIT(0)
+    0,                         /* ob_size*/
+    "dispatch.LogAdapter",     /* tp_name*/
+    sizeof(LogAdapter),        /* tp_basicsize*/
+    0,                         /* tp_itemsize*/
+    (destructor)LogAdapter_dealloc, /* tp_dealloc*/
+    0,                         /* tp_print*/
+    0,                         /* tp_getattr*/
+    0,                         /* tp_setattr*/
+    0,                         /* tp_compare*/
+    0,                         /* tp_repr*/
+    0,                         /* tp_as_number*/
+    0,                         /* tp_as_sequence*/
+    0,                         /* tp_as_mapping*/
+    0,                         /* tp_hash */
+    0,                         /* tp_call*/
+    0,                         /* tp_str*/
+    0,                         /* tp_getattro*/
+    0,                         /* tp_setattro*/
+    0,                         /* tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT,        /* tp_flags*/
+    "Dispatch Log Adapter",    /* tp_doc */
+    0,                         /* tp_traverse */
+    0,                         /* tp_clear */
+    0,                         /* tp_richcompare */
+    0,                         /* tp_weaklistoffset */
+    0,                         /* tp_iter */
+    0,                         /* tp_iternext */
+    LogAdapter_methods,        /* tp_methods */
+    0,                         /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    (initproc)LogAdapter_init, /* tp_init */
+    0,                         /* tp_alloc */
+    0,                         /* tp_new */
+    0,                         /* tp_free */
+    0,                         /* tp_is_gc */
+    0,                         /* tp_bases */
+    0,                         /* tp_mro */
+    0,                         /* tp_cache */
+    0,                         /* tp_subclasses */
+    0,                         /* tp_weaklist */
+    0,                         /* tp_del */
+    0                          /* tp_version_tag */
+};
+
+
+//===============================================================================
+// Message IO Object
+//===============================================================================
+
+typedef struct dx_python_io_adapter {
+    int x;
+} dx_python_io_adapter;
+
+ALLOC_DECLARE(dx_python_io_adapter);
+ALLOC_DEFINE(dx_python_io_adapter);
+
+//static PyObject* dx_python_send(PyObject *self, PyObject *args)
+//{
+//    return 0;
+//}
+
+
+//===============================================================================
+// Initialization of Modules and Types
+//===============================================================================
+
+static void dx_python_setup()
+{
+    //
+    // Add LogAdapter
+    //
+    LogAdapterType.tp_new = PyType_GenericNew;
+    if (PyType_Ready(&LogAdapterType) < 0) {
+        PyErr_Print();
+        dx_log(log_module, LOG_ERROR, "Unable to initialize LogAdapter");
+        assert(0);
+    } else {
+        PyObject *m = Py_InitModule3("dispatch", empty_methods, "Dispatch Adapter Module");
+
+        Py_INCREF(&LogAdapterType);
+        PyModule_AddObject(m, "LogAdapter", (PyObject*) &LogAdapterType);
+
+        PyObject *LogTrace = PyInt_FromLong((long) LOG_TRACE);
+        Py_INCREF(LogTrace);
+        PyModule_AddObject(m, "LOG_TRACE", LogTrace);
+
+        PyObject *LogError = PyInt_FromLong((long) LOG_ERROR);
+        Py_INCREF(LogError);
+        PyModule_AddObject(m, "LOG_ERROR", LogError);
+
+        PyObject *LogInfo = PyInt_FromLong((long) LOG_INFO);
+        Py_INCREF(LogInfo);
+        PyModule_AddObject(m, "LOG_INFO", LogInfo);
+    }
+}



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