From: "Ara.T.Howard" Date: 2005-09-08T23:35:06+09:00 Subject: Re: sharing memory in ruby On Thu, 8 Sep 2005, Masahiro TANAKA wrote: > Hi, > >> Ara wrote: >> + ary->ref = Qfalse; >> >> the 'ary->ref' means it will not be free'd... > > This is not what I have intended. > 'ary->ref' is an object that is referred from NArray object > so that the original String object is not garbage-collected. > So here should be `ary->ref = str;'. hi masa- here's the result: jib:~/build/narray-0.5.7p2 > cat a.rb # # the narray lib below is patched with your suggested mod # require 'mmap' require './narray' data, format = './data', 'c*' # # create a file # open(data, 'w'){|f| f.write [42,0,0,42].flatten.pack(format)} # # map in in # mmap = Mmap::new 'data', 'rw', Mmap::MAP_SHARED # # modify mmap via mmap # na = NArray::str mmap.to_str, NArray::BYTE na[] = 42 # # original backing file is changed # p IO::read(data).unpack(format) jib:~/build/narray-0.5.7p2 > ruby a.rb [42, 42, 42, 42] looks good. how would you feel about making a release with the patch? it's inlined below. cheers. -a -- =============================================================================== | email :: ara [dot] t [dot] howard [at] noaa [dot] gov | phone :: 303.497.6469 | Your life dwells amoung the causes of death | Like a lamp standing in a strong breeze. --Nagarjuna =============================================================================== --- narray.c.org 2004-10-15 20:57:34.000000000 -0600 +++ narray.c 2004-10-15 21:40:21.000000000 -0600 @@ -757,6 +757,54 @@ /* singleton method: + NArray.str( string, type, size1,size2,...,sizeN ) +*/ +static VALUE + na_s_str(int argc, VALUE *argv, VALUE klass) +{ + struct NARRAY *ary; + VALUE v; + VALUE str; + int i, type, len=1, str_len, *shape, rank=argc-2; + + if (argc < 1) + rb_raise(rb_eArgError, "String Argument required"); + + if (argc < 2) + rb_raise(rb_eArgError, "Type and Size Arguments required"); + + type = na_get_typecode(argv[1]); + + str = rb_funcall(argv[0], rb_intern("to_str"), 0); + + str_len = RSTRING(str)->len; + + if (argc == 2) { + rank = 1; + shape = ALLOCA_N(int,rank); + if ( str_len % na_sizeof[type] != 0 ) + rb_raise(rb_eArgError, "string size mismatch"); + shape[0] = str_len / na_sizeof[type]; + } + else { + shape = ALLOCA_N(int,rank); + for (i=0; iptr = RSTRING(str)->ptr; + ary->ref = str; + + return v; +} + + +/* singleton method: NArray[object] */ static VALUE @@ -1189,6 +1237,7 @@ rb_define_singleton_method(cNArray,"to_na",na_s_to_na,-1); rb_define_singleton_method(cNArray,"to_narray",na_s_to_na,-1); rb_define_singleton_method(cNArray,"[]",na_s_bracket,-1); + rb_define_singleton_method(cNArray,"str",na_s_str,-1); /* methods */ rb_define_method(cNArray, "[]", na_aref,-1);