@@ -82,25 +82,29 @@ semian_shm_object_sizeof(VALUE klass, VALUE type)
8282 return INT2NUM (sizeof (long ));
8383 // Can definitely add more
8484 else
85- return INT2NUM ( 0 );
85+ rb_raise ( rb_eTypeError , "%s is not a valid C type" , rb_id2name ( SYM2ID ( type )) );
8686}
8787
8888
8989VALUE
90- semian_shm_object_acquire (VALUE self , VALUE name , VALUE byte_size , VALUE permissions )
90+ semian_shm_object_acquire (VALUE self , VALUE name , VALUE data_layout , VALUE permissions )
9191{
9292 semian_shm_object * ptr ;
9393 TypedData_Get_Struct (self , semian_shm_object , & semian_shm_object_type , ptr );
9494
9595 if (TYPE (name ) != T_SYMBOL && TYPE (name ) != T_STRING )
9696 rb_raise (rb_eTypeError , "id must be a symbol or string" );
97- if (TYPE (byte_size ) != T_FIXNUM )
98- rb_raise (rb_eTypeError , "expected integer for byte_size " );
97+ if (TYPE (data_layout ) != T_ARRAY )
98+ rb_raise (rb_eTypeError , "expected array for data_layout " );
9999 if (TYPE (permissions ) != T_FIXNUM )
100100 rb_raise (rb_eTypeError , "expected integer for permissions" );
101101
102- if (NUM2SIZET (byte_size ) <= 0 )
103- rb_raise (rb_eArgError , "byte_size must be larger than 0" );
102+ int byte_size = 0 ;
103+ for (int i = 0 ; i < RARRAY_LEN (data_layout ); ++ i )
104+ byte_size += NUM2INT (semian_shm_object_sizeof (rb_cObject , RARRAY_PTR (data_layout )[i ]));
105+
106+ if (byte_size <= 0 )
107+ rb_raise (rb_eArgError , "total size must be larger than 0" );
104108
105109 const char * id_str = NULL ;
106110 if (TYPE (name ) == T_SYMBOL ) {
@@ -109,7 +113,7 @@ semian_shm_object_acquire(VALUE self, VALUE name, VALUE byte_size, VALUE permiss
109113 id_str = RSTRING_PTR (name );
110114 }
111115 ptr -> key = generate_key (id_str );
112- ptr -> byte_size = NUM2SIZET ( byte_size ) ; // byte_size >=1 or error would have been raised earlier
116+ ptr -> byte_size = byte_size ; // byte_size >=1 or error would have been raised earlier
113117 ptr -> semid = -1 ; // id's default to -1
114118 ptr -> shmid = -1 ;
115119 ptr -> shm_address = 0 ; // address defaults to NULL
@@ -124,7 +128,9 @@ semian_shm_object_acquire(VALUE self, VALUE name, VALUE byte_size, VALUE permiss
124128 semian_shm_object_acquire_semaphore (self );
125129 semian_shm_object_synchronize (self );
126130
127- return self ;
131+
132+
133+ return Qtrue ;
128134}
129135
130136VALUE
@@ -349,13 +355,10 @@ semian_shm_object_synchronize_memory_and_size(VALUE self, VALUE is_master_obj) {
349355 } else {
350356 void * old_shm_address = ptr -> shm_address ;
351357 size_t old_byte_size = ptr -> byte_size ;
352- void * old_memory_content = NULL ;
358+ unsigned char old_memory_content [ old_byte_size ] ;
353359
354- char old_memory_content_tmp [old_byte_size ];
355- memcpy (old_memory_content_tmp , old_shm_address , old_byte_size );
360+ memcpy (old_memory_content , old_shm_address , old_byte_size );
356361 semian_shm_object_cleanup_memory (self );
357- old_memory_content = malloc (old_byte_size );
358- memcpy (old_memory_content , old_memory_content_tmp , old_byte_size );
359362
360363 if (-1 == (ptr -> shmid = shmget (key , requested_byte_size , IPC_CREAT | IPC_EXCL | ptr -> permissions ))) {
361364 rb_raise (eSyscall , "shmget failed to create new resized memory with key %d shmid %d errno %d (%s)" , key , ptr -> shmid , errno , strerror (errno ));
@@ -366,7 +369,6 @@ semian_shm_object_synchronize_memory_and_size(VALUE self, VALUE is_master_obj) {
366369 ptr -> byte_size = requested_byte_size ;
367370
368371 ptr -> initialize_memory (ptr -> byte_size , ptr -> shm_address , old_memory_content , old_byte_size );
369- free (old_memory_content );
370372 }
371373 }
372374 return self ;
@@ -419,30 +421,19 @@ semian_shm_object_shmid(VALUE self)
419421 return INT2NUM (ptr -> shmid );
420422}
421423
422- static VALUE
423- semian_shm_object_byte_size (VALUE self )
424- {
425- semian_shm_object * ptr ;
426- TypedData_Get_Struct (self , semian_shm_object , & semian_shm_object_type , ptr );
427- semian_shm_object_synchronize (self );
428- return INT2NUM (ptr -> byte_size );
429- }
430-
431424void
432425Init_semian_shm_object (void ) {
433426
434427 VALUE cSemianModule = rb_const_get (rb_cObject , rb_intern ("Semian" ));
435428 VALUE cSysVSharedMemory = rb_const_get (cSemianModule , rb_intern ("SysVSharedMemory" ));
436429
437- rb_define_method (cSysVSharedMemory , "_acquire " , semian_shm_object_acquire , 3 );
438- rb_define_method (cSysVSharedMemory , "_destroy " , semian_shm_object_destroy , 0 );
439- rb_define_method (cSysVSharedMemory , "_synchronize " , semian_shm_object_synchronize , 0 );
430+ rb_define_method (cSysVSharedMemory , "acquire_memory_object " , semian_shm_object_acquire , 3 );
431+ rb_define_method (cSysVSharedMemory , "destroy " , semian_shm_object_destroy , 0 );
432+ rb_define_method (cSysVSharedMemory , "synchronize " , semian_shm_object_synchronize , 0 );
440433
441434 rb_define_method (cSysVSharedMemory , "semid" , semian_shm_object_semid , 0 );
442435 rb_define_method (cSysVSharedMemory , "shmid" , semian_shm_object_shmid , 0 );
443- rb_define_method (cSysVSharedMemory , "byte_size" , semian_shm_object_byte_size , 0 );
444436
445- rb_define_singleton_method (cSysVSharedMemory , "_sizeof" , semian_shm_object_sizeof , 1 );
446437 rb_define_singleton_method (cSysVSharedMemory , "replace_alloc" , semian_shm_object_replace_alloc , 1 );
447438
448439 decrement .sem_num = kSHMIndexTicketLock ;
0 commit comments