From 9ba10d17d2403f6ec19b95e99ccd40865bd4f6e7 Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Wed, 29 May 2013 13:29:58 +0200
Subject: [PATCH] Changed lock structure (still no implementation). Changed
 reader/writer interface to simplify stacking (example will be forthcoming).

---
 examples/simple/example_decoder.c            |  2 +-
 examples/simple/example_encoder.c            |  2 +-
 lib/c/labcomm.c                              | 78 ++++++++++----------
 lib/c/labcomm.h                              | 15 +---
 lib/c/labcomm_dynamic_buffer_writer.c        | 13 ++--
 lib/c/labcomm_fd_reader.c                    | 30 +++++---
 lib/c/labcomm_fd_writer.c                    | 34 +++++----
 lib/c/labcomm_private.h                      | 51 ++++++++-----
 lib/c/test/test_labcomm_generated_encoding.c | 15 ++--
 test/relay_gen_c.py                          |  4 +-
 10 files changed, 131 insertions(+), 113 deletions(-)

diff --git a/examples/simple/example_decoder.c b/examples/simple/example_decoder.c
index 531d2ef..d79bc7a 100644
--- a/examples/simple/example_decoder.c
+++ b/examples/simple/example_decoder.c
@@ -56,7 +56,7 @@ int main(int argc, char *argv[]) {
   char *filename = argv[1];
   printf("C decoder reading from %s\n", filename);
   fd = open(filename, O_RDONLY);
-  decoder = labcomm_decoder_new(labcomm_fd_reader_new(fd, 1), NULL, NULL);
+  decoder = labcomm_decoder_new(labcomm_fd_reader_new(fd, 1), NULL);
   if (!decoder) { 
     printf("Failed to allocate decoder %s:%d\n", __FUNCTION__, __LINE__);
     return 1;
diff --git a/examples/simple/example_encoder.c b/examples/simple/example_encoder.c
index eed3f3f..b4f3921 100644
--- a/examples/simple/example_encoder.c
+++ b/examples/simple/example_encoder.c
@@ -12,7 +12,7 @@ int main(int argc, char *argv[]) {
   char *filename = argv[1];
   printf("C encoder writing to %s\n", filename);
   fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644);
-  encoder = labcomm_encoder_new(labcomm_fd_writer_new(fd, 1), NULL, NULL);
+  encoder = labcomm_encoder_new(labcomm_fd_writer_new(fd, 1), NULL);
   labcomm_encoder_register_simple_theTwoInts(encoder);
   labcomm_encoder_register_simple_anotherTwoInts(encoder);
   labcomm_encoder_register_simple_IntString(encoder);
diff --git a/lib/c/labcomm.c b/lib/c/labcomm.c
index 737ec34..c97a08d 100644
--- a/lib/c/labcomm.c
+++ b/lib/c/labcomm.c
@@ -39,10 +39,7 @@
 struct labcomm_decoder {
   void *context;
   struct labcomm_reader *reader;
-  struct {
-    void *context;
-    const struct labcomm_lock_action *action;
-  } lock;
+  struct labcomm_lock *lock;
   labcomm_error_handler_callback on_error;
   labcomm_handle_new_datatype_callback on_new_datatype;
 };
@@ -50,10 +47,7 @@ struct labcomm_decoder {
 struct labcomm_encoder {
   void *context;
   struct labcomm_writer *writer;
-  struct {
-    void *context;
-    const struct labcomm_lock_action *action;
-  } lock;
+  struct labcomm_lock *lock;
   labcomm_error_handler_callback on_error;
 };
 
@@ -240,19 +234,20 @@ static void labcomm_encode_signature(struct labcomm_encoder *e,
   int i, index;
 
   index = get_encoder_index(e, signature);
-  e->writer->action->start(e->writer, e, index, signature, NULL);
+  e->writer->action->start(e->writer, e->writer->context, 
+			   e, index, signature, NULL);
   labcomm_write_packed32(e->writer, signature->type);
   labcomm_write_packed32(e->writer, index);
 
   labcomm_write_string(e->writer, signature->name);
   for (i = 0 ; i < signature->size ; i++) {
     if (e->writer->pos >= e->writer->count) {
-      e->writer->action->flush(e->writer);
+      e->writer->action->flush(e->writer, e->writer->context);
     }
     e->writer->data[e->writer->pos] = signature->signature[i];
     e->writer->pos++;
   }
-  e->writer->action->end(e->writer);
+  e->writer->action->end(e->writer, e->writer->context);
 }
 
 #ifdef LABCOMM_ENCODER_LINEAR_SEARCH
@@ -346,8 +341,7 @@ static struct labcomm_sample_entry *encoder_get_sample_by_signature_address(
 						    
 struct labcomm_encoder *labcomm_encoder_new(
   struct labcomm_writer *writer,
-  const struct labcomm_lock_action *lock,
-  void *lock_context)
+  struct labcomm_lock *lock)
 {
   struct labcomm_encoder *result = malloc(sizeof(*result));
   if (result) {
@@ -367,10 +361,10 @@ struct labcomm_encoder *labcomm_encoder_new(
     result->writer->count = 0;
     result->writer->pos = 0;
     result->writer->error = 0;
-    result->lock.action = lock;
-    result->lock.context = lock_context;
+    result->lock = lock;
     result->on_error = on_error_fprintf;
-    result->writer->action->alloc(result->writer, LABCOMM_VERSION);
+    result->writer->action->alloc(result->writer,result->writer->context,
+				  LABCOMM_VERSION);
   }
   return result;
 }
@@ -410,23 +404,25 @@ int labcomm_internal_encode(
   int index;
 
   index = get_encoder_index(e, signature);
-  result = e->writer->action->start(e->writer, e, index, signature, value);
+  result = e->writer->action->start(e->writer, e->writer->context, 
+				    e, index, signature, value);
   if (result == -EALREADY) { result = 0; goto no_end; }
   if (result != 0) { goto out; }
   result = labcomm_write_packed32(e->writer, index);
   if (result != 0) { goto out; }
   result = encode(e->writer, value);
 out:
-  e->writer->action->end(e->writer);
+  e->writer->action->end(e->writer, e->writer->context);
 no_end:
   return result;
 }
 
 void labcomm_encoder_free(struct labcomm_encoder* e)
 {
-  e->writer->action->free(e->writer);
-  struct labcomm_encoder_context *context = (struct labcomm_encoder_context *) e->context;
+  struct labcomm_encoder_context *context;
 
+  context = (struct labcomm_encoder_context *) e->context;
+  e->writer->action->free(e->writer, e->writer->context);
 #ifdef LABCOMM_ENCODER_LINEAR_SEARCH
   struct labcomm_sample_entry *entry = context->sample;
   struct labcomm_sample_entry *entry_next;
@@ -459,7 +455,9 @@ int labcomm_encoder_ioctl(struct labcomm_encoder *encoder,
   }
     
   va_start(va, action);
-  result = encoder->writer->action->ioctl(encoder->writer, action, NULL, va);
+  result = encoder->writer->action->ioctl(encoder->writer, 
+					  encoder->writer->context,
+					  action, NULL, va);
   va_end(va);
 
 out:
@@ -483,7 +481,7 @@ static int labcomm_writer_ioctl(struct labcomm_writer *writer,
   }
   
   va_start(va, action);
-  result = writer->action->ioctl(writer, action, NULL, va);
+  result = writer->action->ioctl(writer, writer->context, action, NULL, va);
   va_end(va);
 out:
   return result;
@@ -497,8 +495,9 @@ int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder,
   int result = -ENOTSUP;
   
   if (encoder->writer->action->ioctl != NULL) {
-    result = encoder->writer->action->ioctl(encoder->writer, action, 
-					    signature, va);
+    result = encoder->writer->action->ioctl(encoder->writer, 
+					    encoder->writer->context, 
+					    action, signature, va);
   }
   return result;
 }
@@ -556,8 +555,7 @@ static void collect_flat_signature(
 
 struct labcomm_decoder *labcomm_decoder_new(
   struct labcomm_reader *reader,
-  const struct labcomm_lock_action *lock,
-  void *lock_context)
+  struct labcomm_lock *lock)
 {
   struct labcomm_decoder *result = malloc(sizeof(*result));
   if (result) {
@@ -570,11 +568,11 @@ struct labcomm_decoder *labcomm_decoder_new(
     result->reader->data_size = 0;
     result->reader->count = 0;
     result->reader->pos = 0;
-    result->lock.action = lock;
-    result->lock.context = lock_context;
+    result->lock = lock;
     result->on_error = on_error_fprintf;
     result->on_new_datatype = on_new_datatype;
-    result->reader->action->alloc(result->reader, LABCOMM_VERSION);
+    result->reader->action->alloc(result->reader, result->reader->context,
+				  LABCOMM_VERSION);
   }
   return result;
 }
@@ -606,7 +604,7 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d)
 {
   int result;
 
-  result = d->reader->action->start(d->reader);
+  result = d->reader->action->start(d->reader, d->reader->context);
   if (result > 0) {
     struct labcomm_decoder_context *context = d->context;
     
@@ -627,13 +625,13 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d)
       struct labcomm_sample_entry *entry = NULL;
       int index, err;
       
-      writer.action->alloc(&writer, "");
-      writer.action->start(&writer, NULL, 0, NULL, NULL);
+      writer.action->alloc(&writer, writer.context, "");
+      writer.action->start(&writer, writer.context, NULL, 0, NULL, NULL);
       index = labcomm_read_packed32(d->reader); //int
       signature.name = labcomm_read_string(d->reader);
       signature.type = result;
       collect_flat_signature(d, &writer);
-      writer.action->end(&writer);
+      writer.action->end(&writer, writer.context);
       err = labcomm_writer_ioctl(&writer, 
 				 LABCOMM_IOCTL_WRITER_GET_BYTES_WRITTEN,
 				 &signature.size);
@@ -662,7 +660,7 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d)
       }
     free_signature_name:
       free(signature.name);
-      writer.action->free(&writer);
+      writer.action->free(&writer, writer.context);
       if (!entry) {
 	// No handler for found type, bail out (after cleanup)
 	result = -ENOENT;
@@ -681,7 +679,7 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d)
       }
     }
   }
-  d->reader->action->end(d->reader);
+  d->reader->action->end(d->reader, d->reader->context);
   return result;
 }
 
@@ -693,11 +691,11 @@ void labcomm_decoder_run(struct labcomm_decoder *d)
 
 void labcomm_decoder_free(struct labcomm_decoder* d)
 {
-  d->reader->action->free(d->reader);
   struct labcomm_decoder_context *context = (struct labcomm_decoder_context *) d->context;
   struct labcomm_sample_entry *entry = context->sample;
   struct labcomm_sample_entry *entry_next;
 
+  d->reader->action->free(d->reader, d->reader->context);
   while (entry != NULL) {
     entry_next = entry->next;
     free(entry);
@@ -718,7 +716,9 @@ int labcomm_decoder_ioctl(struct labcomm_decoder *decoder,
     va_list va;
     
     va_start(va, action);
-    result = decoder->reader->action->ioctl(decoder->reader, action, NULL, va);
+    result = decoder->reader->action->ioctl(decoder->reader, 
+					    decoder->reader->context,
+					    action, NULL, va);
     va_end(va);
   }
   return result;
@@ -732,7 +732,9 @@ int labcomm_internal_decoder_ioctl(struct labcomm_decoder *decoder,
   int result = -ENOTSUP;
   
   if (decoder->reader->action->ioctl != NULL) {
-    result = decoder->reader->action->ioctl(decoder->reader, action, NULL, va);
+    result = decoder->reader->action->ioctl(decoder->reader, 
+					    decoder->reader->context,
+					    action, NULL, va);
   }
   return result;
 }
diff --git a/lib/c/labcomm.h b/lib/c/labcomm.h
index 933137e..3b4a25c 100644
--- a/lib/c/labcomm.h
+++ b/lib/c/labcomm.h
@@ -61,15 +61,6 @@ void labcomm_decoder_register_new_datatype_handler(struct labcomm_decoder *d,
  */
 struct labcomm_lock;
 
-struct labcomm_lock_action {
-  int (*alloc)(void *context);
-  int (*free)(void *context);
-  int (*read_lock)(void *context);
-  int (*read_unlock)(void *context);
-  int (*write_lock)(void *context);
-  int (*write_unlock)(void *context);
-};
-
 /*
  * Decoder
  */
@@ -77,8 +68,7 @@ struct labcomm_reader;
 
 struct labcomm_decoder *labcomm_decoder_new(
   struct labcomm_reader *reader,
-  const struct labcomm_lock_action *lock,
-  void *lock_context);
+  struct labcomm_lock *lock);
 int labcomm_decoder_decode_one(
   struct labcomm_decoder *decoder);
 void labcomm_decoder_run(
@@ -98,8 +88,7 @@ struct labcomm_writer;
 
 struct labcomm_encoder *labcomm_encoder_new(
   struct labcomm_writer *writer,
-  const struct labcomm_lock_action *lock,
-  void *lock_context);
+  struct labcomm_lock *lock);
 void labcomm_encoder_free(
   struct labcomm_encoder *encoder);
 
diff --git a/lib/c/labcomm_dynamic_buffer_writer.c b/lib/c/labcomm_dynamic_buffer_writer.c
index 8c83dee..feb5778 100644
--- a/lib/c/labcomm_dynamic_buffer_writer.c
+++ b/lib/c/labcomm_dynamic_buffer_writer.c
@@ -6,7 +6,8 @@
 #include "labcomm_ioctl.h"
 #include "labcomm_dynamic_buffer_writer.h"
 
-static int dyn_alloc(struct labcomm_writer *w, char *labcomm_version)
+static int dyn_alloc(struct labcomm_writer *w, void *context,
+		     char *labcomm_version)
 {
   w->data_size = 1000;
   w->count = w->data_size;
@@ -19,7 +20,7 @@ static int dyn_alloc(struct labcomm_writer *w, char *labcomm_version)
   return w->error;
 }
 
-static int dyn_free(struct labcomm_writer *w)
+static int dyn_free(struct labcomm_writer *w, void *context)
 {
   free(w->data);
   w->data = 0;
@@ -30,7 +31,7 @@ static int dyn_free(struct labcomm_writer *w)
   return 0;
 }
 
-static int dyn_start(struct labcomm_writer *w,
+static int dyn_start(struct labcomm_writer *w, void *context,
 		     struct labcomm_encoder *encoder,
 		     int index,
 		     struct labcomm_signature *signature,
@@ -52,12 +53,12 @@ static int dyn_start(struct labcomm_writer *w,
   return w->error;
 }
 
-static int dyn_end(struct labcomm_writer *w)
+static int dyn_end(struct labcomm_writer *w, void *context)
 {
   return 0;
 }
 
-static int dyn_flush(struct labcomm_writer *w)
+static int dyn_flush(struct labcomm_writer *w, void *context)
 {
   void *tmp;
 
@@ -74,7 +75,7 @@ static int dyn_flush(struct labcomm_writer *w)
   return w->error; 
 }
 
-static int dyn_ioctl(struct labcomm_writer *w, 
+static int dyn_ioctl(struct labcomm_writer *w, void *context, 
 		     int action, 
 		     struct labcomm_signature *signature,
 		     va_list arg)
diff --git a/lib/c/labcomm_fd_reader.c b/lib/c/labcomm_fd_reader.c
index f8b6f50..9975564 100644
--- a/lib/c/labcomm_fd_reader.c
+++ b/lib/c/labcomm_fd_reader.c
@@ -13,7 +13,7 @@ struct labcomm_fd_reader {
   int close_fd_on_free;
 };
 
-static int fd_alloc(struct labcomm_reader *r, char *version)
+static int fd_alloc(struct labcomm_reader *r, void *context, char *version)
 {
   int result = 0;
   
@@ -42,9 +42,9 @@ static int fd_alloc(struct labcomm_reader *r, char *version)
   return result;
 }
 
-static int fd_free(struct labcomm_reader *r)
+static int fd_free(struct labcomm_reader *r, void *context)
 {
-  struct labcomm_fd_reader *context = r->context;
+  struct labcomm_fd_reader *fd_context = context;
 
   free(r->data);
   r->data = 0;
@@ -52,18 +52,18 @@ static int fd_free(struct labcomm_reader *r)
   r->count = 0;
   r->pos = 0;
 
-  if (context->close_fd_on_free) {
-    close(context->fd);
+  if (fd_context->close_fd_on_free) {
+    close(fd_context->fd);
   }
-  free(context);
+  free(fd_context);
 
   return 0;
 }
 
-static int fd_fill(struct labcomm_reader *r)
+static int fd_fill(struct labcomm_reader *r, void *context)
 {
   int result = 0;
-  struct labcomm_fd_reader *context = r->context;
+  struct labcomm_fd_reader *fd_context = context;
 
   if (r->pos < r->count) {
     result = r->count - r->pos;
@@ -71,7 +71,7 @@ static int fd_fill(struct labcomm_reader *r)
     int err;
     
     r->pos = 0;
-    err = read(context->fd, r->data, r->data_size);
+    err = read(fd_context->fd, r->data, r->data_size);
     if (err <= 0) {
       r->count = 0;
       result = -EPIPE;
@@ -83,12 +83,18 @@ static int fd_fill(struct labcomm_reader *r)
   return result;
 }
 
-static int fd_start(struct labcomm_reader *r)
+static int fd_start(struct labcomm_reader *r, void *context)
 {
-  return fd_fill(r);
+  int available;
+
+  available = r->count - r->pos;
+  if (available == 0) {
+    available = fd_fill(r, context);
+  }
+  return available;
 }
 
-static int fd_end(struct labcomm_reader *r)
+static int fd_end(struct labcomm_reader *r, void *context)
 {
   return 0;
 }
diff --git a/lib/c/labcomm_fd_writer.c b/lib/c/labcomm_fd_writer.c
index 88a7780..696e626 100644
--- a/lib/c/labcomm_fd_writer.c
+++ b/lib/c/labcomm_fd_writer.c
@@ -14,9 +14,9 @@ struct labcomm_fd_writer {
   int close_fd_on_free;
 };
 
-static int fd_flush(struct labcomm_writer *w);
+static int fd_flush(struct labcomm_writer *w, void *context);
 
-static int fd_alloc(struct labcomm_writer *w, char *version)
+static int fd_alloc(struct labcomm_writer *w, void *context, char *version)
 {
   w->data = malloc(BUFFER_SIZE);
   if (! w->data) {
@@ -30,16 +30,16 @@ static int fd_alloc(struct labcomm_writer *w, char *version)
     w->pos = 0;
     if (version && version[0]) {
       labcomm_write_string(w, version);
-      fd_flush(w);
+      fd_flush(w, context);
     }
   }
 
   return w->error;
 }
 
-static int fd_free(struct labcomm_writer *w)
+static int fd_free(struct labcomm_writer *w, void *context)
 {
-  struct labcomm_fd_writer *context = w->context;
+  struct labcomm_fd_writer *fd_context = context;
 
   free(w->data);
   w->data = 0;
@@ -47,13 +47,13 @@ static int fd_free(struct labcomm_writer *w)
   w->count = 0;
   w->pos = 0;
 
-  if (context->close_fd_on_free) {
-    close(context->fd);
+  if (fd_context->close_fd_on_free) {
+    close(fd_context->fd);
   }
   return 0;
 }
 
-static int fd_start(struct labcomm_writer *w,
+static int fd_start(struct labcomm_writer *w, void *context,
 		    struct labcomm_encoder *encoder,
 		    int index,
 		    struct labcomm_signature *signature,
@@ -64,12 +64,20 @@ static int fd_start(struct labcomm_writer *w,
   return w->error;
 }
 
-static int fd_flush(struct labcomm_writer *w)
+static int fd_flush(struct labcomm_writer *w, void *context)
 {
-  struct labcomm_fd_writer *context = w->context;
-  int err;
-
-  err = write(context->fd, w->data, w->pos);
+  struct labcomm_fd_writer *fd_context = context;
+  int start, err;
+  
+  start = 0;
+  err = 0;
+  while (start < w->pos) {
+    err = write(fd_context->fd, &w->data[start], w->pos - start);
+    if (err <= 0) {
+      break;
+    }
+    start = start + err;
+  }
   if (err < 0) {
     w->error = -errno;
   } else if (err == 0) {
diff --git a/lib/c/labcomm_private.h b/lib/c/labcomm_private.h
index a06c7f1..dfad869 100644
--- a/lib/c/labcomm_private.h
+++ b/lib/c/labcomm_private.h
@@ -47,7 +47,17 @@
 /*
  * Semi private lock declarations
  */
+struct labcomm_lock_action {
+  int (*alloc)(void *context);
+  int (*free)(void *context);
+  int (*read_lock)(void *context);
+  int (*read_unlock)(void *context);
+  int (*write_lock)(void *context);
+  int (*write_unlock)(void *context);
+};
+
 struct labcomm_lock {
+  const struct labcomm_lock_action action;
 };
 
 /*
@@ -61,12 +71,13 @@ typedef void (*labcomm_decoder_function)(
   void *context);
 
 struct labcomm_reader_action {
-  int (*alloc)(struct labcomm_reader *r, char *labcomm_version);
-  int (*free)(struct labcomm_reader *r);
-  int (*start)(struct labcomm_reader *r);
-  int (*end)(struct labcomm_reader *r);
-  int (*fill)(struct labcomm_reader *r); 
-  int (*ioctl)(struct labcomm_reader *r, int, struct labcomm_signature *, va_list);
+  int (*alloc)(struct labcomm_reader *r, void *context, char *labcomm_version);
+  int (*free)(struct labcomm_reader *r, void *context);
+  int (*start)(struct labcomm_reader *r, void *context);
+  int (*end)(struct labcomm_reader *r, void *context);
+  int (*fill)(struct labcomm_reader *r, void *context); 
+  int (*ioctl)(struct labcomm_reader *r, void *context,
+	       int action, struct labcomm_signature *signature, va_list args);
 };
 
 struct labcomm_reader {
@@ -104,7 +115,7 @@ int labcomm_internal_decoder_ioctl(struct labcomm_decoder *decoder,
     type result; int i;							\
     for (i = sizeof(type) - 1 ; i >= 0 ; i--) {				\
       if (r->pos >= r->count) {						\
-	r->action->fill(r);						\
+	r->action->fill(r, r->context);					\
       }									\
       ((unsigned char*)(&result))[i] = r->data[r->pos];			\
       r->pos++;								\
@@ -119,7 +130,7 @@ int labcomm_internal_decoder_ioctl(struct labcomm_decoder *decoder,
     type result; int i;							\
     for (i = 0 ; i < sizeof(type) ; i++) {				\
       if (r->pos >= r->count) {						\
-	r->action->fill(r);						\
+	r->action->fill(r, r->context);					\
       }									\
       ((unsigned char*)(&result))[i] = r->data[r->pos];			\
       r->pos++;								\
@@ -145,7 +156,7 @@ static inline unsigned int labcomm_read_packed32(struct labcomm_reader *r)
     unsigned char tmp;
 
     if (r->pos >= r->count) {	
-      r->action->fill(r);
+      r->action->fill(r, r->context);
     }
     tmp = r->data[r->pos];
     r->pos++;
@@ -166,7 +177,7 @@ static inline char *labcomm_read_string(struct labcomm_reader *r)
   result = malloc(length + 1);
   for (i = 0 ; i < length ; i++) {
     if (r->pos >= r->count) {	
-      r->action->fill(r);
+      r->action->fill(r, r->context);
     }
     result[i] = r->data[r->pos];
     r->pos++;
@@ -185,15 +196,15 @@ typedef int (*labcomm_encoder_function)(
 struct labcomm_writer;
 
 struct labcomm_writer_action {
-  int (*alloc)(struct labcomm_writer *w, char *labcomm_version);
-  int (*free)(struct labcomm_writer *w);
-  int (*start)(struct labcomm_writer *w,
+  int (*alloc)(struct labcomm_writer *w, void *context, char *labcomm_version);
+  int (*free)(struct labcomm_writer *w, void *context);
+  int (*start)(struct labcomm_writer *w, void *context,
 	       struct labcomm_encoder *encoder,
 	       int index, struct labcomm_signature *signature,
 	       void *value);
-  int (*end)(struct labcomm_writer *w);
-  int (*flush)(struct labcomm_writer *w); 
-  int (*ioctl)(struct labcomm_writer *w, 
+  int (*end)(struct labcomm_writer *w, void *context);
+  int (*flush)(struct labcomm_writer *w, void *context); 
+  int (*ioctl)(struct labcomm_writer *w, void *context, 
 	       int index, struct labcomm_signature *, 
 	       va_list);
 };
@@ -233,7 +244,7 @@ int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder,
     for (i = sizeof(type) - 1 ; i >= 0 ; i--) {				\
       if (w->pos >= w->count) { /*buffer is full*/			\
         int err;							\
-	err = w->action->flush(w);					\
+	err = w->action->flush(w, w->context);				\
 	if (err != 0) { return err; }					\
       }									\
       w->data[w->pos] = ((unsigned char*)(&data))[i];			\
@@ -250,7 +261,7 @@ int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder,
     for (i = 0 ; i < sizeof(type) ; i++) {				\
       if (w->pos >= w->count) {						\
         int err;							\
-	err = w->action->flush(w);					\
+	err = w->action->flush(w, w->context);					\
 	if (err != 0) { return err; }					\
       }									\
       w->data[w->pos] = ((unsigned char*)(&data))[i];			\
@@ -281,7 +292,7 @@ static inline int labcomm_write_packed32(struct labcomm_writer *w,
   for (i = i - 1 ; i >= 0 ; i--) {
     if (w->pos >= w->count) {					
       int err;
-      err = w->action->flush(w);
+      err = w->action->flush(w, w->context);
       if (err != 0) { return err; }
     }
     w->data[w->pos++] = tmp[i] | (i?0x80:0x00);
@@ -299,7 +310,7 @@ static inline int labcomm_write_string(struct labcomm_writer *w, char *s)
   for (i = 0 ; i < length ; i++) {
     if (w->pos >= w->count) {	
       int err;
-      err = w->action->flush(w);
+      err = w->action->flush(w, w->context);
       if (err != 0) { return err; }
     }
     w->data[w->pos] = s[i];
diff --git a/lib/c/test/test_labcomm_generated_encoding.c b/lib/c/test/test_labcomm_generated_encoding.c
index 36bb24b..059fe7d 100644
--- a/lib/c/test/test_labcomm_generated_encoding.c
+++ b/lib/c/test/test_labcomm_generated_encoding.c
@@ -11,7 +11,8 @@
 static unsigned char buffer[128];
 struct labcomm_writer *writer;
 
-static int buf_writer_alloc(struct labcomm_writer *w, char *labcomm_version)
+static int buf_writer_alloc(struct labcomm_writer *w, void *context,
+			    char *labcomm_version)
 {
   writer = w; /* Hack */
   w->data_size = sizeof(buffer);
@@ -22,12 +23,12 @@ static int buf_writer_alloc(struct labcomm_writer *w, char *labcomm_version)
   return 0;
 }
 
-static int buf_writer_free(struct labcomm_writer *w)
+static int buf_writer_free(struct labcomm_writer *w, void *context)
 {
   return 0;
 }
 
-static int buf_writer_start(struct labcomm_writer *w,
+static int buf_writer_start(struct labcomm_writer *w, void *context,
 			    struct labcomm_encoder *encoder,
 			    int index,
 			    struct labcomm_signature *signature,
@@ -36,12 +37,12 @@ static int buf_writer_start(struct labcomm_writer *w,
   return 0;
 }
 
-static int buf_writer_end(struct labcomm_writer *w)
+static int buf_writer_end(struct labcomm_writer *w, void *context)
 {
   return 0;
 }
 
-static int buf_writer_flush(struct labcomm_writer *w)
+static int buf_writer_flush(struct labcomm_writer *w, void *context)
 {
   fprintf(stderr, "Should not come here %s:%d\n", __FILE__, __LINE__);
   exit(1);
@@ -50,7 +51,7 @@ static int buf_writer_flush(struct labcomm_writer *w)
 }
 
 static int buf_writer_ioctl(
-  struct labcomm_writer *w, 
+  struct labcomm_writer *w, void *context,
   int action, 
   struct labcomm_signature *signature,
   va_list arg)
@@ -145,7 +146,7 @@ int main(void)
   generated_encoding_B B = 1;
 
   struct labcomm_encoder *encoder = labcomm_encoder_new(&buffer_writer, 
-							NULL, NULL);
+							NULL);
 
   labcomm_encoder_ioctl(encoder, IOCTL_WRITER_RESET);
   labcomm_encoder_register_generated_encoding_V(encoder);
diff --git a/test/relay_gen_c.py b/test/relay_gen_c.py
index 75aaa46..9e2a3a7 100755
--- a/test/relay_gen_c.py
+++ b/test/relay_gen_c.py
@@ -50,8 +50,8 @@ if __name__ == '__main__':
       |  if (in < 0) { return 1; }
       |  out = open(argv[2], O_WRONLY);
       |  if (out < 0) { return 1; }
-      |  e = labcomm_encoder_new(labcomm_fd_writer_new(out, 1), NULL, NULL);
-      |  d = labcomm_decoder_new(labcomm_fd_reader_new(in, 1), NULL, NULL);
+      |  e = labcomm_encoder_new(labcomm_fd_writer_new(out, 1), NULL);
+      |  d = labcomm_decoder_new(labcomm_fd_reader_new(in, 1), NULL);
     """))
     for func,arg in sample:
         result.extend(split_match('^[^|]*\|(.*)$', """
-- 
GitLab