diff --git a/ChangeLog b/ChangeLog index f5cc3c9414762fe73e03f70752cbe1e0270c6de2..b80f87b83ea69189d076bcac197584b7021bf6e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Mon Nov 17 10:23:00 GMT 2008 Daniel Berrange + + * docs/libvirt-api.xml: Re-generate + * include/libvirt/libvirt.h.in: Set explicit values for + domain events enums to avoid API generator bug + * python/libvir.c: Add missing python thread safety calls + to domain events APIs + Mon Nov 17 09:55:00 GMT 2008 Daniel Berrange * src/openvz_conf.c: Fix updating of config file params diff --git a/docs/devhelp/libvirt-libvirt.html b/docs/devhelp/libvirt-libvirt.html index 592127a437fac86ca0277225441696b10c803998..78b2fdf08e8f0140408a66a6ab734fb020dfd5db 100644 --- a/docs/devhelp/libvirt-libvirt.html +++ b/docs/devhelp/libvirt-libvirt.html @@ -370,14 +370,14 @@ The content of this structure is not made public by the API.
diff --git a/docs/html/libvirt-libvirt.html b/docs/html/libvirt-libvirt.html index 2b2a1ec17c9cba32e432042656509201a3a7d0f2..67deef92f8d8f36d8f2073de9e3b8456b7d3cb4d 100644 --- a/docs/html/libvirt-libvirt.html +++ b/docs/html/libvirt-libvirt.html @@ -240,7 +240,7 @@ char * virStorageVolGetXMLDesc (

virDomainCreateFlags

enum virDomainCreateFlags {
 
VIR_DOMAIN_NONE = 0
}
 

virDomainEventType

virDomainInfo

struct virDomainInfo{
 
unsigned charstate : the running state, one of virDomainState
unsigned longmaxMem : the maximum memory in KBytes allowed
unsigned longmemory : the memory in KBytes used by the domain
unsigned shortnrVirtCpu : the number of virtual CPUs for the domain
unsigned long longcpuTime : the CPU time used in nanoseconds
 }
diff --git a/docs/libvirt-api.xml b/docs/libvirt-api.xml
index de33b9b7ce694d8d48e3fac59e6889ea19759c35..b27e5674ca503774b8fe08a097cb8f8faf290b52 100644
--- a/docs/libvirt-api.xml
+++ b/docs/libvirt-api.xml
@@ -429,14 +429,14 @@
     
     
     
-    
-    
-    
-    
-    
-    
-    
-    
+    
+    
+    
+    
+    
+    
+    
+    
     
     
     
diff --git a/include/libvirt/libvirt.h b/include/libvirt/libvirt.h
index bd5b7a6250dac8d66a95c4b0ddaf48b78be64782..077b9f3b67b1dd1befefecf292c8d0b61d57f376 100644
--- a/include/libvirt/libvirt.h
+++ b/include/libvirt/libvirt.h
@@ -1004,14 +1004,14 @@ virDomainPtr            virDomainCreateLinux    (virConnectPtr conn,
  * a virDomainEventType is emitted during domain lifecycle events
  */
 typedef enum {
-      VIR_DOMAIN_EVENT_ADDED,
-      VIR_DOMAIN_EVENT_REMOVED,
-      VIR_DOMAIN_EVENT_STARTED,
-      VIR_DOMAIN_EVENT_SUSPENDED,
-      VIR_DOMAIN_EVENT_RESUMED,
-      VIR_DOMAIN_EVENT_STOPPED,
-      VIR_DOMAIN_EVENT_SAVED,
-      VIR_DOMAIN_EVENT_RESTORED,
+      VIR_DOMAIN_EVENT_ADDED = 0,
+      VIR_DOMAIN_EVENT_REMOVED = 1,
+      VIR_DOMAIN_EVENT_STARTED = 2,
+      VIR_DOMAIN_EVENT_SUSPENDED = 3,
+      VIR_DOMAIN_EVENT_RESUMED = 4,
+      VIR_DOMAIN_EVENT_STOPPED = 5,
+      VIR_DOMAIN_EVENT_SAVED = 6,
+      VIR_DOMAIN_EVENT_RESTORED = 7,
 } virDomainEventType;
 
 /**
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 52b7cdb2121139225d673345a4d954a534ed2f74..fafc1443dbd69241e748039900616384e6cc3876 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -1004,14 +1004,14 @@ virDomainPtr            virDomainCreateLinux    (virConnectPtr conn,
  * a virDomainEventType is emitted during domain lifecycle events
  */
 typedef enum {
-      VIR_DOMAIN_EVENT_ADDED,
-      VIR_DOMAIN_EVENT_REMOVED,
-      VIR_DOMAIN_EVENT_STARTED,
-      VIR_DOMAIN_EVENT_SUSPENDED,
-      VIR_DOMAIN_EVENT_RESUMED,
-      VIR_DOMAIN_EVENT_STOPPED,
-      VIR_DOMAIN_EVENT_SAVED,
-      VIR_DOMAIN_EVENT_RESTORED,
+      VIR_DOMAIN_EVENT_ADDED = 0,
+      VIR_DOMAIN_EVENT_REMOVED = 1,
+      VIR_DOMAIN_EVENT_STARTED = 2,
+      VIR_DOMAIN_EVENT_SUSPENDED = 3,
+      VIR_DOMAIN_EVENT_RESUMED = 4,
+      VIR_DOMAIN_EVENT_STOPPED = 5,
+      VIR_DOMAIN_EVENT_SAVED = 6,
+      VIR_DOMAIN_EVENT_RESTORED = 7,
 } virDomainEventType;
 
 /**
diff --git a/python/libvir.c b/python/libvir.c
index a2e4c79542e8144968c261558c90ae630c3c0478..7da3d2c7ce18be4f9477512694f0f2fe7c59f61c 100644
--- a/python/libvir.c
+++ b/python/libvir.c
@@ -1482,7 +1482,9 @@ getLibvirtModuleObject (void) {
     // PyImport_ImportModule returns a new reference
     libvirt_module = PyImport_ImportModule("libvirt");
     if(!libvirt_module) {
+#if DEBUG_ERROR
         printf("%s Error importing libvirt module\n", __FUNCTION__);
+#endif
         PyErr_Print();
         return NULL;
     }
@@ -1498,7 +1500,9 @@ getLibvirtDictObject (void) {
     // PyModule_GetDict returns a borrowed reference
     libvirt_dict = PyModule_GetDict(getLibvirtModuleObject());
     if(!libvirt_dict) {
+#if DEBUG_ERROR
         printf("%s Error importing libvirt dictionary\n", __FUNCTION__);
+#endif
         PyErr_Print();
         return NULL;
     }
@@ -1516,7 +1520,9 @@ getLibvirtDomainClassObject (void) {
     libvirt_dom_class = PyDict_GetItemString(getLibvirtDictObject(),
                                              "virDomain");
     if(!libvirt_dom_class) {
+#if DEBUG_ERROR
         printf("%s Error importing virDomain class\n", __FUNCTION__);
+#endif
         PyErr_Print();
         return NULL;
     }
@@ -1537,29 +1543,39 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
     PyObject *pyobj_ret;
 
     PyObject *pyobj_conn_inst = (PyObject*)opaque;
-    PyObject *pyobj_dom = libvirt_virDomainPtrWrap(dom);
+    PyObject *pyobj_dom;
 
     PyObject *pyobj_dom_args;
     PyObject *pyobj_dom_inst;
 
     PyObject *dom_class;
+    int ret = -1;
+
+    LIBVIRT_ENSURE_THREAD_STATE;
 
     /* Create a python instance of this virDomainPtr */
+    pyobj_dom = libvirt_virDomainPtrWrap(dom);
     pyobj_dom_args = PyTuple_New(2);
     if(PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) {
+#if DEBUG_ERROR
         printf("%s error creating tuple",__FUNCTION__);
-        return -1;
+#endif
+        goto cleanup;
     }
     if(PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom)!=0) {
+#if DEBUG_ERROR
         printf("%s error creating tuple",__FUNCTION__);
-        return -1;
+#endif
+        goto cleanup;
     }
     Py_INCREF(pyobj_conn_inst);
 
     dom_class = getLibvirtDomainClassObject();
     if(!PyClass_Check(dom_class)) {
+#if DEBUG_ERROR
         printf("%s dom_class is not a class!\n", __FUNCTION__);
-        return -1;
+#endif
+        goto cleanup;
     }
 
     pyobj_dom_inst = PyInstance_New(dom_class,
@@ -1569,9 +1585,11 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
     Py_DECREF(pyobj_dom_args);
 
     if(!pyobj_dom_inst) {
+#if DEBUG_ERROR
         printf("%s Error creating a python instance of virDomain\n", __FUNCTION__);
+#endif
         PyErr_Print();
-        return -1;
+        goto cleanup;
     }
 
     /* Call the Callback Dispatcher */
@@ -1584,14 +1602,19 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
     Py_DECREF(pyobj_dom_inst);
 
     if(!pyobj_ret) {
+#if DEBUG_ERROR
         printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
+#endif
         PyErr_Print();
-        return -1;
     } else {
         Py_DECREF(pyobj_ret);
-        return 0;
+        ret = 0;
     }
 
+
+cleanup:
+    LIBVIRT_RELEASE_THREAD_STATE;
+    return -1;
 }
 
 static PyObject *
@@ -1608,9 +1631,11 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
     if (!PyArg_ParseTuple
         (args, (char *) "OO:virConnectDomainEventRegister",
                         &pyobj_conn, &pyobj_conn_inst)) {
+#if DEBUG_ERROR
         printf("%s failed parsing tuple\n", __FUNCTION__);
+#endif
         return VIR_PY_INT_FAIL;
-        }
+    }
 
 #ifdef DEBUG_ERROR
     printf("libvirt_virConnectDomainEventRegister(%p %p) called\n",
@@ -1620,10 +1645,14 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
 
     Py_INCREF(pyobj_conn_inst);
 
+    LIBVIRT_BEGIN_ALLOW_THREADS;
+
     ret = virConnectDomainEventRegister(conn,
                                         libvirt_virConnectDomainEventCallback,
                                         (void *)pyobj_conn_inst);
 
+    LIBVIRT_END_ALLOW_THREADS;
+
     py_retval = libvirt_intWrap(ret);
     return (py_retval);
 }
@@ -1650,8 +1679,12 @@ libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject * self,
 
     conn   = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
 
+    LIBVIRT_BEGIN_ALLOW_THREADS;
+
     ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback);
 
+    LIBVIRT_END_ALLOW_THREADS;
+
     Py_DECREF(pyobj_conn_inst);
     py_retval = libvirt_intWrap(ret);
     return (py_retval);
@@ -1679,13 +1712,17 @@ libvirt_virEventAddHandleFunc  (int fd ATTRIBUTE_UNUSED, int event ATTRIBUTE_UNU
     PyObject *cb_args;
     PyObject *pyobj_args;
 
+    LIBVIRT_ENSURE_THREAD_STATE;
+
     /* Lookup the python callback */
     python_cb = PyDict_GetItemString(getLibvirtDictObject(),
                                      "eventInvokeHandleCallback");
     if(!python_cb) {
+#if DEBUG_ERROR
         printf("%s Error finding eventInvokeHandleCallback\n", __FUNCTION__);
+#endif
         PyErr_Print();
-        return -1;
+        goto cleanup;
     }
     Py_INCREF(python_cb);
 
@@ -1708,6 +1745,10 @@ libvirt_virEventAddHandleFunc  (int fd ATTRIBUTE_UNUSED, int event ATTRIBUTE_UNU
 
     Py_XDECREF(result);
     Py_DECREF(pyobj_args);
+
+cleanup:
+    LIBVIRT_RELEASE_THREAD_STATE;
+
     return 0;
 }
 
@@ -1715,7 +1756,11 @@ static void
 libvirt_virEventUpdateHandleFunc(int fd, int event)
 {
     PyObject *result = NULL;
-    PyObject *pyobj_args = PyTuple_New(2);
+    PyObject *pyobj_args;
+
+    LIBVIRT_ENSURE_THREAD_STATE;
+
+    pyobj_args = PyTuple_New(2);
     PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
     PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
 
@@ -1724,13 +1769,20 @@ libvirt_virEventUpdateHandleFunc(int fd, int event)
 
     Py_XDECREF(result);
     Py_DECREF(pyobj_args);
+
+    LIBVIRT_RELEASE_THREAD_STATE;
 }
 
+
 static int
 libvirt_virEventRemoveHandleFunc(int fd)
 {
     PyObject *result = NULL;
-    PyObject *pyobj_args = PyTuple_New(1);
+    PyObject *pyobj_args;
+
+    LIBVIRT_ENSURE_THREAD_STATE;
+
+    pyobj_args = PyTuple_New(1);
     PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
 
     if(removeHandleObj && PyCallable_Check(removeHandleObj))
@@ -1738,6 +1790,9 @@ libvirt_virEventRemoveHandleFunc(int fd)
 
     Py_XDECREF(result);
     Py_DECREF(pyobj_args);
+
+    LIBVIRT_RELEASE_THREAD_STATE;
+
     return 0;
 }
 
@@ -1754,13 +1809,17 @@ libvirt_virEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb,
     PyObject *cb_args;
     PyObject *pyobj_args;
 
+    LIBVIRT_ENSURE_THREAD_STATE;
+
     /* Lookup the python callback */
     python_cb = PyDict_GetItemString(getLibvirtDictObject(),
                                      "eventInvokeTimeoutCallback");
     if(!python_cb) {
+#if DEBUG_ERROR
         printf("%s Error finding eventInvokeTimeoutCallback\n", __FUNCTION__);
+#endif
         PyErr_Print();
-        return -1;
+        goto cleanup;
     }
     Py_INCREF(python_cb);
 
@@ -1783,6 +1842,9 @@ libvirt_virEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb,
 
     Py_XDECREF(result);
     Py_DECREF(pyobj_args);
+
+cleanup:
+    LIBVIRT_RELEASE_THREAD_STATE;
     return 0;
 }
 
@@ -1790,7 +1852,11 @@ static void
 libvirt_virEventUpdateTimeoutFunc(int timer, int timeout)
 {
     PyObject *result = NULL;
-    PyObject *pyobj_args = PyTuple_New(2);
+    PyObject *pyobj_args;
+
+    LIBVIRT_ENSURE_THREAD_STATE;
+
+    pyobj_args = PyTuple_New(2);
     PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
     PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout));
 
@@ -1799,13 +1865,19 @@ libvirt_virEventUpdateTimeoutFunc(int timer, int timeout)
 
     Py_XDECREF(result);
     Py_DECREF(pyobj_args);
+
+    LIBVIRT_RELEASE_THREAD_STATE;
 }
 
 static int
 libvirt_virEventRemoveTimeoutFunc(int timer)
 {
     PyObject *result = NULL;
-    PyObject *pyobj_args = PyTuple_New(1);
+    PyObject *pyobj_args;
+
+    LIBVIRT_ENSURE_THREAD_STATE;
+
+    pyobj_args = PyTuple_New(1);
     PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
 
     if(updateTimeoutObj && PyCallable_Check(updateTimeoutObj))
@@ -1813,6 +1885,9 @@ libvirt_virEventRemoveTimeoutFunc(int timer)
 
     Py_XDECREF(result);
     Py_DECREF(pyobj_args);
+
+    LIBVIRT_RELEASE_THREAD_STATE;
+
     return 0;
 }
 
@@ -1845,6 +1920,8 @@ libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self,
     Py_INCREF(updateTimeoutObj);
     Py_INCREF(removeTimeoutObj);
 
+    LIBVIRT_BEGIN_ALLOW_THREADS;
+
     virEventRegisterImpl(libvirt_virEventAddHandleFunc,
                          libvirt_virEventUpdateHandleFunc,
                          libvirt_virEventRemoveHandleFunc,
@@ -1852,6 +1929,8 @@ libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self,
                          libvirt_virEventUpdateTimeoutFunc,
                          libvirt_virEventRemoveTimeoutFunc);
 
+    LIBVIRT_END_ALLOW_THREADS;
+
     return VIR_PY_INT_SUCCESS;
 }