[libvirt] [PATCH v3 1/2] timer impl

Wen Congyang wency at cn.fujitsu.com
Fri Dec 17 08:49:26 UTC 2010


* tools/timer.c tools/timer.h: timer implementation
* tools/virsh.c: Initialize timer
* tools/Makefile.am: build timer

Signed-off-by: Wen Congyang <wency at cn.fujitsu.com>

---
 tools/Makefile.am |    1 +
 tools/timer.c     |  170 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/timer.h     |   38 ++++++++++++
 tools/virsh.c     |    3 +
 4 files changed, 212 insertions(+), 0 deletions(-)
 create mode 100644 tools/timer.c
 create mode 100644 tools/timer.h

diff --git a/tools/Makefile.am b/tools/Makefile.am
index 8a5fb52..506265d 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -38,6 +38,7 @@ virt-pki-validate.1: virt-pki-validate
 
 virsh_SOURCES =							\
 		console.c console.h				\
+		timer.c timer.h					\
 		../daemon/event.c ../daemon/event.h		\
 		virsh.c
 
diff --git a/tools/timer.c b/tools/timer.c
new file mode 100644
index 0000000..88c42bb
--- /dev/null
+++ b/tools/timer.c
@@ -0,0 +1,170 @@
+/*
+ * timer.c: timer functions
+ *
+ * Copyright (C) 2010 Fujitsu Limited
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ * Author: Wen Congyang <wency at cn.fujitsu.com>
+ */
+
+#include <config.h>
+
+#include "daemon/event.h"
+#include "event.h"
+#include "memory.h"
+#include "threads.h"
+#include "timer.h"
+#include "virterror_internal.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+struct virTimer {
+    int timer_id;
+
+    int frequency;
+    virTimerCallback function;
+    void *opaque;
+};
+
+/* use timerFunc to prevent the user know timer id. */
+static void timerFunc(int timer_id ATTRIBUTE_UNUSED, void *opaque)
+{
+    virTimerPtr timer = (virTimerPtr)opaque;
+    timer->function(timer->opaque);
+}
+
+virTimerPtr virNewTimer(virTimerCallback callback, void *opaque)
+{
+    virTimerPtr timer = NULL;
+
+    if (VIR_ALLOC(timer) < 0) {
+        virReportOOMError();
+        return NULL;
+    }
+
+    timer->timer_id = -1;
+    timer->function = callback;
+    timer->opaque = opaque;
+    timer->frequency = -1;
+
+    return timer;
+}
+
+int virAddTimer(virTimerPtr timer, int expire_time)
+{
+    int ret;
+
+    if ((ret = virEventAddTimeout(expire_time, timerFunc,
+                                  timer, NULL)) < 0) {
+        return -1;
+    }
+    timer->timer_id = ret;
+    return 0;
+}
+
+int virModTimer(virTimerPtr timer, int expire_time)
+{
+    if (timer->timer_id == -1)
+        return virAddTimer(timer, expire_time);
+
+    virEventUpdateTimeout(timer->timer_id, expire_time);
+    return 0;
+}
+
+int virDelTimer(virTimerPtr timer)
+{
+    if (timer->timer_id == -1)
+        return 0;
+
+    if (virEventRemoveTimeout(timer->timer_id) < 0)
+        return -1;
+
+    timer->timer_id = -1;
+    return 0;
+}
+
+void virFreeTimer(virTimerPtr timer)
+{
+    VIR_FREE(timer);
+}
+
+static int timer_initialized = 0;
+static virThread timer_thread;
+static bool timer_running = false;
+static bool timer_quit = false;
+static virMutex timer_lock;
+
+static void timerThreadFunc(void *opaque ATTRIBUTE_UNUSED)
+{
+    while(!timer_quit) {
+        virEventRunOnce();
+    }
+}
+
+int virStartTimer(void)
+{
+    int ret = -1;
+
+    virMutexLock(&timer_lock);
+    if (timer_running) {
+        ret = 0;
+        goto cleanup;
+    }
+
+    timer_quit = false;
+    if (virThreadCreate(&timer_thread, true, timerThreadFunc, NULL) < 0)
+        goto cleanup;
+
+    timer_running = true;
+    ret = 0;
+
+cleanup:
+    virMutexUnlock(&timer_lock);
+    return ret;
+}
+
+int virStopTimer(void)
+{
+    int ret = -1;
+    virMutexLock(&timer_lock);
+    if (!timer_running) {
+        ret = 0;
+        goto cleanup;
+    }
+
+    timer_quit = true;
+    virEventInterrupt();
+    virThreadJoin(&timer_thread);
+    timer_running = false;
+
+cleanup:
+    virMutexUnlock(&timer_lock);
+    return ret;
+}
+
+int virTimerInitialize(void)
+{
+    if (timer_initialized)
+        return 0;
+
+    if (virMutexInit(&timer_lock) < 0)
+        return -1;
+
+    timer_initialized = 1;
+    timer_running = false;
+    timer_quit = false;
+    return 0;
+}
diff --git a/tools/timer.h b/tools/timer.h
new file mode 100644
index 0000000..eba08ec
--- /dev/null
+++ b/tools/timer.h
@@ -0,0 +1,38 @@
+/*
+ * timer.h: structure and entry points for timer support
+ *
+ * Copyright (C) 2010 Fujitsu Limited
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ * Author: Wen Congyang <wency at cn.fujitsu.com>
+ */
+
+#ifndef __VIR_TIMER_H__
+# define __VIR_TIMER_H__
+
+typedef struct virTimer virTimer;
+typedef virTimer *virTimerPtr;
+typedef void (*virTimerCallback)(void *);
+
+extern virTimerPtr virNewTimer(virTimerCallback, void *);
+extern int virAddTimer(virTimerPtr, int);
+extern int virModTimer(virTimerPtr, int);
+extern int virDelTimer(virTimerPtr);
+extern void virFreeTimer(virTimerPtr);
+extern int virStartTimer(void);
+extern int virStopTimer(void);
+extern int virTimerInitialize(void);
+#endif /* __VIR_TIMER_H__ */
diff --git a/tools/virsh.c b/tools/virsh.c
index 4e37f2d..cbde085 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -54,6 +54,7 @@
 #include "files.h"
 #include "../daemon/event.h"
 #include "configmake.h"
+#include "timer.h"
 
 static char *progname;
 
@@ -11298,6 +11299,8 @@ vshInit(vshControl *ctl)
                          virEventRemoveTimeoutImpl);
     virEventInit();
 
+    virTimerInitialize();
+
     ctl->conn = virConnectOpenAuth(ctl->name,
                                    virConnectAuthPtrDefault,
                                    ctl->readonly ? VIR_CONNECT_RO : 0);
-- 
1.7.1




More information about the libvir-list mailing list