[libvirt] [PATCH 2/7] Introduce event loop to commandtest

Michal Privoznik mprivozn at redhat.com
Wed Jan 23 09:41:28 UTC 2013


This is just preparing environment for the next patch, which is
going to need an event loop.
---
 tests/commanddata/test3.log |  2 +-
 tests/commandtest.c         | 87 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/tests/commanddata/test3.log b/tests/commanddata/test3.log
index 6bd7974..bd06371 100644
--- a/tests/commanddata/test3.log
+++ b/tests/commanddata/test3.log
@@ -8,7 +8,7 @@ ENV:USER=test
 FD:0
 FD:1
 FD:2
-FD:3
 FD:5
+FD:8
 DAEMON:no
 CWD:/tmp
diff --git a/tests/commandtest.c b/tests/commandtest.c
index b5c5882..00d2eac 100644
--- a/tests/commandtest.c
+++ b/tests/commandtest.c
@@ -37,9 +37,19 @@
 #include "virfile.h"
 #include "virpidfile.h"
 #include "virerror.h"
+#include "virthread.h"
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
+typedef struct _virCommandTestData virCommandTestData;
+typedef virCommandTestData *virCommandTestDataPtr;
+struct _virCommandTestData {
+    virMutex lock;
+    virThread thread;
+    bool quit;
+    bool running;
+};
+
 #ifdef WIN32
 
 int
@@ -841,11 +851,46 @@ static const char *const newenv[] = {
     NULL
 };
 
+static void virCommandThreadWorker(void *opaque)
+{
+    virCommandTestDataPtr test = opaque;
+
+    virMutexLock(&test->lock);
+
+    while (!test->quit) {
+        virMutexUnlock(&test->lock);
+
+        if (virEventRunDefaultImpl() < 0) {
+            test->quit = true;
+            break;
+        }
+
+        virMutexLock(&test->lock);
+    }
+
+    test->running = false;
+
+    virMutexUnlock(&test->lock);
+    return;
+}
+
+static void
+virCommandTestFreeTimer(int timer ATTRIBUTE_UNUSED,
+                        void *opaque ATTRIBUTE_UNUSED)
+{
+    /* nothing to be done here */
+}
+
 static int
 mymain(void)
 {
     int ret = 0;
     int fd;
+    virCommandTestDataPtr test = NULL;
+    int timer = -1;
+
+    if (virThreadInitialize() < 0)
+        return EXIT_FAILURE;
 
     if (chdir("/tmp") < 0)
         return EXIT_FAILURE;
@@ -886,6 +931,30 @@ mymain(void)
     fd = 5;
     VIR_FORCE_CLOSE(fd);
 
+    virEventRegisterDefaultImpl();
+    if (VIR_ALLOC(test) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if (virMutexInit(&test->lock) < 0) {
+        printf("Unable to init mutex: %d\n", errno);
+        goto cleanup;
+    }
+
+    virMutexLock(&test->lock);
+
+    if (virThreadCreate(&test->thread,
+                        true,
+                        virCommandThreadWorker,
+                        test) < 0) {
+        virMutexUnlock(&test->lock);
+        goto cleanup;
+    }
+
+    test->running = true;
+    virMutexUnlock(&test->lock);
+
     environ = (char **)newenv;
 
 # define DO_TEST(NAME)                                                \
@@ -915,6 +984,24 @@ mymain(void)
     DO_TEST(test19);
     DO_TEST(test20);
 
+    virMutexLock(&test->lock);
+    if (test->running) {
+        test->quit = true;
+        /* HACK: Add a dummy timeout to break event loop */
+        timer = virEventAddTimeout(0, virCommandTestFreeTimer, NULL, NULL);
+    }
+    virMutexUnlock(&test->lock);
+
+cleanup:
+    if (test->running)
+        virThreadJoin(&test->thread);
+
+    if (timer != -1)
+        virEventRemoveTimeout(timer);
+
+    virMutexDestroy(&test->lock);
+    VIR_FREE(test);
+
     return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
-- 
1.8.0.2




More information about the libvir-list mailing list