Module: ProcessShared::ObjectBuffer

Included in:
Posix::SharedMemory
Defined in:
lib/process_shared/object_buffer.rb

Overview

Provides reading and writing of serialized objects from a memory buffer.

Instance Method Summary collapse

Instance Method Details

#get_object(offset) ⇒ Object

Read the serialized object at offset (in bytes) using Marshal.load.

Returns:

  • (Object)


33
34
35
36
37
# File 'lib/process_shared/object_buffer.rb', line 33

def get_object(offset)
  io = to_shm_io
  io.seek(offset)
  Marshal.load(io)
end

#put_object(offset, obj) ⇒ Object

Write the serialization of obj (using Marshal.dump) to this shared memory object at offset (in bytes).

Raises IndexError if there is insufficient space.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/process_shared/object_buffer.rb', line 11

def put_object(offset, obj)
  # FIXME: This is a workaround to an issue I'm seeing in
  # 1.8.7-p352 (not tested in other 1.8's).  If I used the code
  # below that works in 1.9, then inside SharedMemoryIO#write, the
  # passed string object is 'terminated' (garbage collected?) and
  # won't respond to any methods...  This way is less efficient
  # since it involves the creation of an intermediate string, but
  # it works in 1.8.7-p352.
  if RUBY_VERSION =~ /^1.8/
    str = Marshal.dump(obj)
    return put_bytes(offset, str, 0, str.size)
  end

  io = SharedMemoryIO.new(self)
  io.seek(offset)
  Marshal.dump(obj, io)
end

#read_objectObject

Equivalent to obj)

Returns:

  • (Object)


47
48
49
# File 'lib/process_shared/object_buffer.rb', line 47

def read_object
  Marshal.load(to_shm_io)
end

#write_object(obj) ⇒ Object

Equivalent to obj)



40
41
42
# File 'lib/process_shared/object_buffer.rb', line 40

def write_object(obj)
  put_object(0, obj)
end