diff options
| -rw-r--r-- | kiro-client.c | 2 | ||||
| -rw-r--r-- | kiro-server.c | 3 | ||||
| -rw-r--r-- | kiro-trb.c | 40 | ||||
| -rw-r--r-- | kiro-trb.h | 67 | ||||
| -rw-r--r-- | test.c | 8 | 
5 files changed, 112 insertions, 8 deletions
| diff --git a/kiro-client.c b/kiro-client.c index 253251f..3df870f 100644 --- a/kiro-client.c +++ b/kiro-client.c @@ -226,7 +226,7 @@ int kiro_client_sync (KiroClient *self)      if(!kiro_trb_is_setup(priv->buffer))      {          //First time setup -        kiro_trb_ingest(priv->buffer, ctx->rdma_mr->mem); +        kiro_trb_adopt(priv->buffer, ctx->rdma_mr->mem);      }      else      { diff --git a/kiro-server.c b/kiro-server.c index d4cf7bc..1ed47f8 100644 --- a/kiro-server.c +++ b/kiro-server.c @@ -136,6 +136,9 @@ int kiro_server_start (KiroServer *self, char *address, char *port)      }      printf("Enpoint listening.\n"); +     +    // ---> *SNIP* +          priv->client = (struct kiro_connection *)calloc(1, sizeof(struct kiro_connection));      if(!priv->client)      { @@ -163,6 +163,7 @@ void kiro_trb_flush (KiroTrb *self)      KiroTrbPrivate* priv = KIRO_TRB_GET_PRIVATE(self);      priv->iteration = 0;      priv->current = priv->frame_top; +    write_header(priv);  } @@ -182,7 +183,7 @@ int kiro_trb_reshape (KiroTrb *self, uint64_t element_size, uint64_t element_cou      ((struct KiroTrbInfo *)newmem)->buffer_size_bytes = new_size;      ((struct KiroTrbInfo *)newmem)->element_size = element_size;      ((struct KiroTrbInfo *)newmem)->offset = 0; -    kiro_trb_ingest(self, newmem); +    kiro_trb_adopt(self, newmem);      return 0;  } @@ -206,6 +207,25 @@ int kiro_trb_push (KiroTrb *self, void *element_in)  } +void* kiro_trb_dma_push (KiroTrb *self) +{ +    KiroTrbPrivate* priv = KIRO_TRB_GET_PRIVATE(self); +    if(priv->initialized != 1) +        return -1; +    if((priv->current + priv->element_size) > (priv->mem + priv->buff_size)) +        return -1; +    void *mem_out = priv->current; +    priv->current += priv->element_size; +    if(priv->current >= priv->frame_top + (priv->element_size * priv->max_elements)) +    { +        priv->current = priv->frame_top; +        priv->iteration++; +    } +    write_header(priv); +    return mem_out;         +} + +  void kiro_trb_refresh (KiroTrb *self)  {      KiroTrbPrivate* priv = KIRO_TRB_GET_PRIVATE(self); @@ -220,7 +240,7 @@ void kiro_trb_refresh (KiroTrb *self)  } -void kiro_trb_ingest (KiroTrb *self, void *buff_in) +void kiro_trb_adopt (KiroTrb *self, void *buff_in)  {      KiroTrbPrivate* priv = KIRO_TRB_GET_PRIVATE(self);      if(priv->mem) @@ -228,3 +248,19 @@ void kiro_trb_ingest (KiroTrb *self, void *buff_in)      priv->mem = buff_in;      kiro_trb_refresh(self);  } + + +int kiro_trb_clone (KiroTrb *self, void *buff_in) +{ +    KiroTrbPrivate* priv = KIRO_TRB_GET_PRIVATE(self); +    struct KiroTrbInfo *header = (struct KiroTrbInfo *)buff_in; +    void *newmem = malloc(header->buffer_size_bytes); +    if(!newmem) +        return -1; +    memcpy(newmem, buff_in, header->buffer_size_bytes); +    if(priv->mem) +        free(priv->mem); +    priv->mem = newmem; +    kiro_trb_refresh(self); +    return 0; +} @@ -94,21 +94,86 @@ uint64_t    kiro_trb_get_max_elements   (KiroTrb* trb);  uint64_t    kiro_trb_get_raw_size       (KiroTrb* trb); + +/** + * kiro_trb_get_raw_buffer - Returns a pointer to the buffer memory + * @self: KIRO TRB to perform the operation on + * Description: + *   Returns a pointer to the memory structure of the given buffer. + * Notes: + *   The returned pointer points to the beginning of the internal + *   memory of the buffer, including all header information. The + *   user is responsible to ensure the consistency of any data + *   written to the memory and should call 'kiro_trb_refesh' in + *   case any header information was changed. + *   The pointed to memory might become invalid at any time by + *   concurrent access to the TRB, reshaping, adopting or cloning + *   a new memory block. + *   Under no circumstances might the memory pointed to by the returned + *   pointer be 'freed' by the user! + * See also: + *   kiro_trb_refesh, kiro_trb_reshape, kiro_trb_adopt, kiro_trb_clone + */  void*       kiro_trb_get_raw_buffer     (KiroTrb* trb); + +/** + * kiro_trb_get_element - Returns a pointer to the element at the given + * index. + * @self: KIRO TRB to perform the operation on + * @index: Index of the element in the buffer to access + * Description: + *   Returns a pointer to the element in the buffer at the given index. + * Notes: + *   The returned pointer to the element is only guaranteed to be valid + *   immediately after the function call. The user is responsible to + *   ensure that no data is written to the returned memory. The + *   element pointed to might become invalid at any time by any concurrent + *   access to the buffer wraping around and overwriting the element or + *   changing the buffer memory entirely. + *   Under no circumstances might the memory pointed to by the returned + *   pointer be 'freed' by the user! + * See also: + *   kiro_trb_get_element_size, kiro_trb_get_raw_buffer + */  void*       kiro_trb_get_element        (KiroTrb* trb, uint64_t index); + +/** + * kiro_trb_dma_push - Gives DMA to the next element and pushes the buffer + * @self: KIRO TRB to perform the operation on + * Description: + *   Returns a pointer to the next element in the buffer and increases + *   all internal counters and meta data as if an element was pushed + *   onto the buffer. + * Notes: + *   The returned pointer to the element is only guaranteed to be valid + *   immediately after the function call. The user is responsible to + *   ensure that no more data is written than 'element_size'. The + *   element pointed to might become invalid at any time by any concurrent + *   access to the buffer wraping around and overwriting the element or + *   changing the buffer memory entirely. + *   Under no circumstances might the memory pointed to by the returned + *   pointer be 'freed' by the user! + * See also: + *   kiro_trb_push, kiro_trb_get_element_size, kiro_trb_get_raw_buffer + */ +void*       kiro_trb_dma_push           (KiroTrb*); + +  void        kiro_trb_flush              (KiroTrb* trb);  int         kiro_trb_is_setup           (KiroTrb* trb);  int         kiro_trb_reshape            (KiroTrb* trb, uint64_t element_size, uint64_t element_count); +int         kiro_trb_clone              (KiroTrb* trb, void* source); +  int         kiro_trb_push               (KiroTrb* trb, void* source);  void        kiro_trb_refresh            (KiroTrb* trb); -void        kiro_trb_ingest             (KiroTrb* trb, void* source); +void        kiro_trb_adopt              (KiroTrb* trb, void* source);  G_END_DECLS @@ -31,16 +31,16 @@ int main(void)      void *buffer = kiro_trb_get_raw_buffer(rb);      uint64_t foo = 0xAFFED00F;      uint64_t bar = 0x1337BEEF; -    kiro_trb_push(rb, &foo); -    kiro_trb_push(rb, &foo); -    kiro_trb_push(rb, &foo); +    memcpy(kiro_trb_dma_push(rb), &foo, sizeof(foo)); +    memcpy(kiro_trb_dma_push(rb), &foo, sizeof(foo)); +    memcpy(kiro_trb_dma_push(rb), &foo, sizeof(foo));      kiro_trb_push(rb, &bar);      kiro_trb_push(rb, &foo);      kiro_trb_push(rb, &foo);      uint64_t *maman = kiro_trb_get_element(rb, 3);      printf("Stored in old: %x\n", *maman);      KiroTrb *rb2 = g_object_new(KIRO_TYPE_TRB, NULL); -    kiro_trb_ingest(rb2, kiro_trb_get_raw_buffer(rb)); +    kiro_trb_clone(rb2, kiro_trb_get_raw_buffer(rb));      maman = kiro_trb_get_element(rb2, 3);      printf("Stored in New: %x\n", *maman);      sleep(1); | 
