Sha256: 3e5c7e321a5302a6eb318b6b176042fb254dc63df77ecfe18e37a010b2c2ddb2

Contents?: true

Size: 1.72 KB

Versions: 4

Compression:

Stored size: 1.72 KB

Contents

# Copyright: Copyright (c) 2004  Nicolas Despres. All rights reserved.
# Author: Nicolas Despres  <polrop@lrde.epita.fr>.
# License: Gnu General Public License.

# $LastChangedBy: polrop $
# $Id: io_marshal.rb 63 2004-12-06 13:09:14Z polrop $


class IO

  def dump(*objs)
    objs.each do |obj|
      data = Marshal.dump(obj)
      write(data.size.to_s)
      write("\0")
      write(data)
    end
  end

  def load(num_objs=nil, non_block=false)
    objs = []
    n = num_objs
    begin
      return nil if eof? and non_block
      objs << load_one_object(non_block)
      unless n.nil?
        n -= 1
        break if n <= 0
      end
    end until eof?
    objs
  end

  def load_one_object(non_block=false)
    size = ''
    while (c = read(1)) != "\0" do
      if c.nil?
        if non_block
          return nil
        else
          sleep(0.1)
          redo
        end
      end
      size += c
    end
    size = size.to_i
    data = read(size)
    Marshal.load(data)
  end

end # class IO


#
# Unit test suite
#
if defined? TEST_MODE or $0 == __FILE__


require 'test/unit/ui/yaml/testrunner'


class IOMarshalTest < Test::Unit::TestCase

  #
  # Tests
  #
  def test_simple
    obj1 = 12
    obj2 = 'hello'
    obj3 = { 'a' => 12, 'b' => 42 }
    rd, wr = IO.pipe
    if pid = fork # father
      wr.close
      o1, o2 = rd.load(2)
      assert_equal(obj1, o1)
      assert_equal(obj2, o2)
      o3 = rd.load
      assert_equal([obj3], o3)
      assert_equal(nil, rd.load(4, true))
      assert_equal(nil, rd.load_one_object(true))
      Process.waitpid(pid)
      rd.close
    else #  son
      rd.close
      sleep(0.5)
      wr.dump(obj1)
      wr.dump(obj2, obj3)
      wr.close
      exit
    end
  end


end # class IOMarshalTest


end

Version data entries

4 entries across 4 versions & 2 rubygems

Version Path
ttk-0.1.576 ruby_ex/io_marshal.rb
ttk-0.1.579 ruby_ex/io_marshal.rb
ttk-0.1.580 ruby_ex/io_marshal.rb
vcs-0.2.148 ruby_ex/io_marshal.rb