Module: MemoryBuffer

Defined in:
lib/memory_buffer.rb,
lib/memory_buffer/version.rb

Constant Summary collapse

PACK_MIN =

size after which performance of pack is better than the * operator

152
PACK_MAX =

size after which pack completely fails

545259518
VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.create(size) ⇒ Object



10
11
12
# File 'lib/memory_buffer.rb', line 10

def self.create(size)
  return size >= PACK_MIN && size <= PACK_MAX ? [""].pack("a#{size}") : "\0" * size 
end

.create_aligned(ralign, rlen) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'ext/memory_buffer/memory_buffer.c', line 17

static VALUE
mb_create_aligned(VALUE self, VALUE ralign, VALUE rlen) {
  size_t align = (size_t)NUM2INT(ralign);
  size_t len   = (size_t)NUM2INT(rlen);
  char *abuf;
  int     rc;
  VALUE  asb;

#ifdef __linux__
  abuf = memalign(align, len);
#elif __APPLE__
  rc = posix_memalign((void **)&abuf, align, len);
  if (0 != rc) {
    abuf = NULL;
  }
#endif

  if (NULL == abuf) {
    rb_raise(rb_eNoMemError, "Could not allocate %d bytes of aligned memory\n", (int)len);
  }

  asb = rb_str_new(NULL, 0);
  RBASIC(asb)->flags |= RSTRING_NOEMBED;
  RSTRING(asb)->as.heap.ptr = abuf;
  RSTRING(asb)->as.heap.aux.capa = len;

  return(asb);
}

.create_longObject



18
19
20
# File 'lib/memory_buffer.rb', line 18

def self.create_long
  "\000\000\000\000"
end

.create_quadObject



14
15
16
# File 'lib/memory_buffer.rb', line 14

def self.create_quad
  "\000\000\000\000\000\000\000\000"
end

.create_shortObject



22
23
24
# File 'lib/memory_buffer.rb', line 22

def self.create_short
  "\000\000"
end