@@ -28,14 +28,6 @@ static const rb_data_type_t semian_simple_sliding_window_type = {
2828 .flags = RUBY_TYPED_FREE_IMMEDIATELY ,
2929};
3030
31- static void init_fn (void * ptr )
32- {
33- semian_simple_sliding_window_shared_t * res = (semian_simple_sliding_window_shared_t * )ptr ;
34- res -> max_size = 0 ;
35- res -> length = 0 ;
36- res -> start = 0 ;
37- }
38-
3931static int
4032check_max_size_arg (VALUE max_size )
4133{
@@ -93,7 +85,10 @@ check_scale_factor_arg(VALUE scale_factor)
9385static VALUE
9486grow_window (int sem_id , semian_simple_sliding_window_shared_t * window , int new_max_size )
9587{
96- if (new_max_size > SLIDING_WINDOW_MAX_SIZE ) return Qnil ;
88+ if (new_max_size > SLIDING_WINDOW_MAX_SIZE ) {
89+ sem_meta_unlock (sem_id );
90+ rb_raise (rb_eArgError , "Cannot grow window to %d (MAX_SIZE=%d)" , new_max_size , SLIDING_WINDOW_MAX_SIZE );
91+ }
9792
9893 int end = window -> max_size ? (window -> start + window -> length ) % window -> max_size : 0 ;
9994 dprintf ("Growing window - sem_id:%d start:%d end:%d length:%d max_size:%d new_max_size:%d" , sem_id , window -> start , end , window -> length , window -> max_size , new_max_size );
@@ -127,7 +122,10 @@ static void swap(int *a, int *b) {
127122static VALUE
128123shrink_window (int sem_id , semian_simple_sliding_window_shared_t * window , int new_max_size )
129124{
130- if (new_max_size > SLIDING_WINDOW_MAX_SIZE ) return Qnil ;
125+ if (new_max_size > SLIDING_WINDOW_MAX_SIZE ) {
126+ sem_meta_unlock (sem_id );
127+ rb_raise (rb_eArgError , "Cannot shrink window to %d (MAX_SIZE=%d)" , new_max_size , SLIDING_WINDOW_MAX_SIZE );
128+ }
131129
132130 int new_length = (new_max_size > window -> length ) ? window -> length : new_max_size ;
133131
@@ -256,7 +254,7 @@ semian_simple_sliding_window_initialize(VALUE self, VALUE name, VALUE max_size,
256254
257255 dprintf ("Initializing simple sliding window '%s' (key: %lu)" , buffer , res -> key );
258256 res -> sem_id = initialize_single_semaphore (res -> key , SEM_DEFAULT_PERMISSIONS , 1 );
259- res -> shmem = get_or_create_shared_memory (res -> key , init_fn );
257+ res -> shmem = get_or_create_shared_memory (res -> key );
260258 res -> error_threshold = check_max_size_arg (max_size );
261259 res -> scale_factor = check_scale_factor_arg (scale_factor );
262260
@@ -396,8 +394,8 @@ semian_simple_sliding_window_clear(VALUE self)
396394 return self ;
397395}
398396
397+ #if 0
399398// Handy for debugging the sliding window, but too noisy for regular debugging.
400- /*
401399static void dprint_window (semian_simple_sliding_window_shared_t * window )
402400{
403401 dprintf ("---" );
@@ -407,7 +405,7 @@ static void dprint_window(semian_simple_sliding_window_shared_t *window)
407405 }
408406 dprintf ("---" );
409407}
410- */
408+ #endif
411409
412410VALUE
413411semian_simple_sliding_window_reject (VALUE self )
0 commit comments