summaryrefslogtreecommitdiff
path: root/libvxi11client/perlbits/perlglue.c
diff options
context:
space:
mode:
authordaniel <danieruru@gmail.com>2013-01-12 14:50:56 +0900
committerdaniel <danieruru@gmail.com>2013-01-12 14:50:56 +0900
commit7c6b1548f8e3c24565d45837bbde961ece718f41 (patch)
treeb91f22f45eea0c95bb1b69f11f1f1d8ee3f10b4d /libvxi11client/perlbits/perlglue.c
parent6b74097642353500f965bdc024c76051c090b4f4 (diff)
Add the ability to wait for interrupts
Diffstat (limited to 'libvxi11client/perlbits/perlglue.c')
-rw-r--r--libvxi11client/perlbits/perlglue.c47
1 files changed, 33 insertions, 14 deletions
diff --git a/libvxi11client/perlbits/perlglue.c b/libvxi11client/perlbits/perlglue.c
index e870477..62d9748 100644
--- a/libvxi11client/perlbits/perlglue.c
+++ b/libvxi11client/perlbits/perlglue.c
@@ -1,23 +1,42 @@
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-
-#include "ppport.h"
-
-#include "perlglue.h"
+#include <stdbool.h>
+#include <glib.h>
+#include "libvxi11client.h"
#define INTERRUPTHANDLE "libvxi11client"
-extern int vxi11_enable_srq(bool enable, char* handle, void (*callback)(void));
+GAsyncQueue* interruptqueue;
-static SV* perlcallback = NULL;
+typedef struct {
+ GTimeVal when;
+} Event;
static void interruptcallback(void) {
- //PUSHMARK(SP);
- call_sv(perlcallback, G_DISCARD | G_NOARGS);
+ Event* event = g_malloc(sizeof(Event));
+ g_get_current_time(&event->when);
+ g_async_queue_push(interruptqueue, event);
+}
+
+int glue_enable_srq(bool enable) {
+ if (enable) {
+ interruptqueue = g_async_queue_new();
+ return vxi11_enable_srq(enable, INTERRUPTHANDLE, interruptcallback);
+ }
+ else {
+ int ret = vxi11_enable_srq(enable, NULL, NULL);
+ g_free(interruptqueue);
+ return ret;
+ }
}
-int glue_enable_srq(bool enable, SV* callback) {
- perlcallback = callback;
- return vxi11_enable_srq(enable, INTERRUPTHANDLE, interruptcallback);
+int glue_wait_for_interrupt() {
+ GTimeVal timeout;
+ g_get_current_time(&timeout);
+ g_time_val_add(&timeout, 2500);
+ gpointer event = g_async_queue_timed_pop(interruptqueue, &timeout);
+ if (event != NULL) {
+ g_free(event);
+ return 1;
+ }
+ else
+ return 0;
}