Skip to content

Commit

Permalink
libxl: ocaml: allocate a long lived libxl context.
Browse files Browse the repository at this point in the history
Rather than allocating a new context for every libxl call begin to
switch to a model where a context is allocated by the caller and may
then be used for multiple calls down into the library.

Signed-off-by: Ian Campbell <[email protected]>
Signed-off-by: Rob Hoes <[email protected]>
Acked-by: David Scott <[email protected]>
  • Loading branch information
robhoes authored and Ian Campbell committed Nov 11, 2013
1 parent 65e35eb commit a45685d
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions tools/ocaml/libs/xl/META.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
version = "@VERSION@"
description = "Xen Toolstack Library"
requires = "xentoollog"
archive(byte) = "xenlight.cma"
archive(native) = "xenlight.cmxa"
3 changes: 3 additions & 0 deletions tools/ocaml/libs/xl/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ include $(TOPLEVEL)/common.make
# ignore unused generated functions
CFLAGS += -Wno-unused
CFLAGS += $(CFLAGS_libxenlight)
CFLAGS += -I ../xentoollog

OBJS = xenlight
INTF = xenlight.cmi
LIBS = xenlight.cma xenlight.cmxa

OCAMLINCLUDE += -I ../xentoollog

LIBS_xenlight = $(LDLIBS_libxenlight)

xenlight_OBJS = $(OBJS)
Expand Down
4 changes: 4 additions & 0 deletions tools/ocaml/libs/xl/xenlight.ml.in
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ type devid = int

(* @@LIBXL_TYPES@@ *)

type ctx

external ctx_alloc: Xentoollog.handle -> ctx = "stub_libxl_ctx_alloc"

external send_trigger : domid -> trigger -> int -> unit = "stub_xl_send_trigger"
external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
Expand Down
4 changes: 4 additions & 0 deletions tools/ocaml/libs/xl/xenlight.mli.in
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ type devid = int

(* @@LIBXL_TYPES@@ *)

type ctx

external ctx_alloc: Xentoollog.handle -> ctx = "stub_libxl_ctx_alloc"

external send_trigger : domid -> trigger -> int -> unit = "stub_xl_send_trigger"
external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
37 changes: 37 additions & 0 deletions tools/ocaml/libs/xl/xenlight_stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <caml/signals.h>
#include <caml/fail.h>
#include <caml/callback.h>
#include <caml/custom.h>

#include <sys/mman.h>
#include <stdint.h>
Expand All @@ -29,6 +30,11 @@
#include <libxl.h>
#include <libxl_utils.h>

#include "caml_xentoollog.h"

#define Ctx_val(x)(*((libxl_ctx **) Data_custom_val(x)))
#define CTX ((libxl_ctx *) Ctx_val(ctx))

struct caml_logger {
struct xentoollog_logger logger;
int log_offset;
Expand Down Expand Up @@ -97,6 +103,37 @@ static void failwith_xl(char *fname, struct caml_logger *lg)
caml_raise_with_string(*caml_named_value("xl.error"), s);
}

void ctx_finalize(value ctx)
{
libxl_ctx_free(CTX);
}

static struct custom_operations libxl_ctx_custom_operations = {
"libxl_ctx_custom_operations",
ctx_finalize /* custom_finalize_default */,
custom_compare_default,
custom_hash_default,
custom_serialize_default,
custom_deserialize_default
};

CAMLprim value stub_libxl_ctx_alloc(value logger)
{
CAMLparam1(logger);
CAMLlocal1(handle);
libxl_ctx *ctx;
int ret;

ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger *) Xtl_val(logger));
if (ret != 0) \
failwith_xl("cannot init context", NULL);

handle = caml_alloc_custom(&libxl_ctx_custom_operations, sizeof(ctx), 0, 1);
Ctx_val(handle) = ctx;

CAMLreturn(handle);
}

static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
{
void *ptr;
Expand Down

0 comments on commit a45685d

Please sign in to comment.