]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Introduce event loop to commandtest
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 16 Jan 2013 10:58:00 +0000 (11:58 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 5 Feb 2013 14:45:21 +0000 (15:45 +0100)
This is just preparing environment for the next patch, which is
going to need an event loop.

tests/commanddata/test3.log
tests/commandtest.c

index 6bd797498f238f8d85647d2ec381ca6c2e229d11..bd06371c314e6524fb196c4cf7041e5a87972df6 100644 (file)
@@ -8,7 +8,7 @@ ENV:USER=test
 FD:0
 FD:1
 FD:2
-FD:3
 FD:5
+FD:8
 DAEMON:no
 CWD:/tmp
index b5c5882c99746ff320f66bb22c589126ce24be48..00d2eac0f40d9cae4890b52ccee11407c06266fe 100644 (file)
 #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;
 }