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