From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Jackson Subject: [PATCH 6/9] libxl: event tests: Provide libxl_test_fdevent Date: Thu, 9 Jul 2015 18:47:54 +0100 Message-ID: <1436464077-2752-7-git-send-email-ian.jackson@eu.citrix.com> References: <1436464077-2752-1-git-send-email-ian.jackson@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1436464077-2752-1-git-send-email-ian.jackson@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: Wei Liu , Ian Jackson , Ian Campbell List-Id: xen-devel@lists.xenproject.org We are going to use this shortly. But, it is nicely self-contained. Signed-off-by: Ian Jackson --- tools/libxl/Makefile | 2 +- tools/libxl/libxl_test_fdevent.c | 79 ++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_test_fdevent.h | 12 ++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 tools/libxl/libxl_test_fdevent.c create mode 100644 tools/libxl/libxl_test_fdevent.h diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile index 512b0e1..b92809c 100644 --- a/tools/libxl/Makefile +++ b/tools/libxl/Makefile @@ -101,7 +101,7 @@ LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o LIBXL_TESTS += timedereg LIBXL_TESTS_PROGS = $(LIBXL_TESTS) -LIBXL_TESTS_INSIDE = $(LIBXL_TESTS) +LIBXL_TESTS_INSIDE = $(LIBXL_TESTS) fdevent # Each entry FOO in LIBXL_TESTS has two main .c files: # libxl_test_FOO.c "inside libxl" code to support the test case diff --git a/tools/libxl/libxl_test_fdevent.c b/tools/libxl/libxl_test_fdevent.c new file mode 100644 index 0000000..2d875d9 --- /dev/null +++ b/tools/libxl/libxl_test_fdevent.c @@ -0,0 +1,79 @@ +/* + * fdevent test helpr for the libxl event system + */ + +#include "libxl_internal.h" + +#include "libxl_test_fdevent.h" + +typedef struct { + libxl__ao *ao; + libxl__ev_fd fd; + libxl__ao_abortable abrt; +} libxl__test_fdevent; + +static void fdevent_complete(libxl__egc *egc, libxl__test_fdevent *tfe, + int rc); + +static void tfe_init(libxl__test_fdevent *tfe, libxl__ao *ao) +{ + tfe->ao = ao; + libxl__ev_fd_init(&tfe->fd); + libxl__ao_abortable_init(&tfe->abrt); +} + +static void tfe_cleanup(libxl__gc *gc, libxl__test_fdevent *tfe) +{ + libxl__ev_fd_deregister(gc, &tfe->fd); + libxl__ao_abortable_deregister(&tfe->abrt); +} + +static void tfe_fd_cb(libxl__egc *egc, libxl__ev_fd *ev, + int fd, short events, short revents) +{ + libxl__test_fdevent *tfe = CONTAINER_OF(ev,*tfe,fd); + STATE_AO_GC(tfe->ao); + fdevent_complete(egc, tfe, 0); +} + +static void tfe_abrt_cb(libxl__egc *egc, libxl__ao_abortable *abrt, + int rc) +{ + libxl__test_fdevent *tfe = CONTAINER_OF(abrt,*tfe,abrt); + STATE_AO_GC(tfe->ao); + fdevent_complete(egc, tfe, rc); +} + +static void fdevent_complete(libxl__egc *egc, libxl__test_fdevent *tfe, + int rc) +{ + STATE_AO_GC(tfe->ao); + tfe_cleanup(gc, tfe); + libxl__ao_complete(egc, ao, rc); +} + +int libxl_test_fdevent(libxl_ctx *ctx, int fd, short events, + libxl_asyncop_how *ao_how) +{ + int rc; + libxl__test_fdevent *tfe; + + AO_CREATE(ctx, 0, ao_how); + GCNEW(tfe); + + tfe_init(tfe, ao); + + rc = libxl__ev_fd_register(gc, &tfe->fd, tfe_fd_cb, fd, events); + if (rc) goto out; + + tfe->abrt.ao = ao; + tfe->abrt.callback = tfe_abrt_cb; + rc = libxl__ao_abortable_register(&tfe->abrt); + if (rc) goto out; + + return AO_INPROGRESS; + + out: + tfe_cleanup(gc, tfe); + return AO_CREATE_FAIL(rc); +} diff --git a/tools/libxl/libxl_test_fdevent.h b/tools/libxl/libxl_test_fdevent.h new file mode 100644 index 0000000..82a307e --- /dev/null +++ b/tools/libxl/libxl_test_fdevent.h @@ -0,0 +1,12 @@ +#ifndef TEST_FDEVENT_H +#define TEST_FDEVENT_H + +#include + +int libxl_test_fdevent(libxl_ctx *ctx, int fd, short events, + libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; +/* This operation waits for one of the poll events to occur on fd, and + * then completes successfully. (Or, it can be aborted.) */ + +#endif /*TEST_FDEVENT_H*/ -- 1.7.10.4