From 7c6b1548f8e3c24565d45837bbde961ece718f41 Mon Sep 17 00:00:00 2001 From: daniel Date: Sat, 12 Jan 2013 14:50:56 +0900 Subject: Add the ability to wait for interrupts --- libvxi11client/perlbits/Client.xs | 13 +++++++--- libvxi11client/perlbits/VXI11-Client.t | 7 ++--- libvxi11client/perlbits/perlglue.c | 47 ++++++++++++++++++++++++---------- libvxi11client/perlbits/perlglue.h | 3 ++- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/libvxi11client/perlbits/Client.xs b/libvxi11client/perlbits/Client.xs index b747707..ebfc037 100644 --- a/libvxi11client/perlbits/Client.xs +++ b/libvxi11client/perlbits/Client.xs @@ -52,14 +52,21 @@ docmd(cmd, waitforlock) RETVAL int -enable_srq(enable, callback) +enable_srq(enable) bool enable - SV * callback CODE: - RETVAL = glue_enable_srq(enable, callback); + RETVAL = glue_enable_srq(enable); OUTPUT: RETVAL +int +wait_for_interrupt() + CODE: + RETVAL = glue_wait_for_interrupt(); + OUTPUT: + RETVAL + + int local(waitforlock) bool waitforlock diff --git a/libvxi11client/perlbits/VXI11-Client.t b/libvxi11client/perlbits/VXI11-Client.t index 5b7f35f..1c91965 100644 --- a/libvxi11client/perlbits/VXI11-Client.t +++ b/libvxi11client/perlbits/VXI11-Client.t @@ -8,7 +8,7 @@ use strict; use warnings; -use Test::More tests => 14; +use Test::More tests => 17; BEGIN { use_ok('VXI11::Client') }; ######################### @@ -21,8 +21,9 @@ is(&VXI11::Client::lock(0), 1, "Lock"); is(&VXI11::Client::write("*IDN?", 6, 0, 0), 6, "Write"); ok(&VXI11::Client::readstatusbyte(0) >= 0 , "Read status byte"); is(&VXI11::Client::create_intr_chan(), 1, "Create intr channel"); -#is(&VXI11::Client::enable_srq(1, sub { print "Interrupt fired\n" }), 1, "Enable interrupts"); -#is(&VXI11::Client::enable_srq(0), 1, "Disable interrupts"); +is(&VXI11::Client::enable_srq(1), 1, "Enable interrupts"); +is(&VXI11::Client::wait_for_interrupt, 1, "Wait for interrupt"); +is(&VXI11::Client::enable_srq(0), 1, "Disable interrupts"); is(&VXI11::Client::destroy_intr_chan(), 1, "Destroy intr channel"); is(&VXI11::Client::abort(), 1, "Abort"); is(&VXI11::Client::clear(0), 1, "Clear"); 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 +#include +#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; } diff --git a/libvxi11client/perlbits/perlglue.h b/libvxi11client/perlbits/perlglue.h index 09e71aa..e2ded42 100644 --- a/libvxi11client/perlbits/perlglue.h +++ b/libvxi11client/perlbits/perlglue.h @@ -1,5 +1,6 @@ #include #include -int glue_enable_srq(bool enable, SV* callback); +int glue_enable_srq(bool enable); +int glue_wait_for_interrupt(void); -- cgit