Sha256: 6973eecb1b2ba3438ea7d85f8b5ece0486ed7850d3f23bbb6c4de85ecd557af5

Contents?: true

Size: 1.19 KB

Versions: 2

Compression:

Stored size: 1.19 KB

Contents

#include "um.h"

inline long buffer_size(long len) {
  len--;
  len |= len >> 1;
  len |= len >> 2;
  len |= len >> 4;
  len |= len >> 8;
  len |= len >> 16;
  len++;
  return (len > 4096) ? len : 4096;
}

inline struct um_buffer *um_buffer_checkout(struct um *machine, int len) {
  struct um_buffer *buffer = machine->buffer_freelist;
  if (buffer)
    machine->buffer_freelist = buffer->next;
  else {
    buffer = malloc(sizeof(struct um_buffer));
    memset(buffer, 0, sizeof(struct um_buffer));
  }

  if (buffer->len < len) {
    if (buffer->ptr) {
      free(buffer->ptr);
      buffer->ptr = NULL;
    }

    buffer->len = buffer_size(len);
    if (posix_memalign(&buffer->ptr, 4096, buffer->len))
      rb_raise(rb_eRuntimeError, "Failed to allocate buffer");
  }
  return buffer;
}

inline void um_buffer_checkin(struct um *machine, struct um_buffer *buffer) {
  buffer->next = machine->buffer_freelist;
  machine->buffer_freelist = buffer;
}

inline void um_free_buffer_linked_list(struct um *machine) {
  struct um_buffer *buffer = machine->buffer_freelist;
  while (buffer) {
    struct um_buffer *next = buffer->next;
    if (buffer->ptr) free(buffer->ptr);
    free(buffer);
    buffer = next;
  }
}

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
uringmachine-0.5.1 ext/um/um_buffer.c
uringmachine-0.5 ext/um/um_buffer.c