@@ -4,14 +4,17 @@ static VALUE
44cleanup_semian_resource_acquire (VALUE  self );
55
66static  void 
7- check_tickets_xor_quota_arg (VALUE  tickets , VALUE  quota );
7+ check_tickets_xor_quota_arg (VALUE  tickets , VALUE  min_tickets ,  VALUE   quota );
88
99static  double 
1010check_quota_arg (VALUE  quota );
1111
1212static  int 
1313check_tickets_arg (VALUE  tickets );
1414
15+ static  int 
16+ check_min_tickets_arg (VALUE  min_tickets );
17+ 
1518static  long 
1619check_permissions_arg (VALUE  permissions );
1720
@@ -203,13 +206,13 @@ VALUE
203206semian_resource_initialize (VALUE  self , VALUE  id , VALUE  tickets , VALUE  quota , VALUE  permissions , VALUE  default_timeout , VALUE  min_tickets )
204207{
205208  // Check and cast arguments 
206-   check_tickets_xor_quota_arg (tickets , quota );
209+   check_tickets_xor_quota_arg (tickets , min_tickets ,  quota );
207210  double  c_quota  =  check_quota_arg (quota );
208211  int  c_tickets  =  check_tickets_arg (tickets );
209212  long  c_permissions  =  check_permissions_arg (permissions );
210213  const  char  * c_id_str  =  check_id_arg (id );
211214  double  c_timeout  =  check_default_timeout_arg (default_timeout );
212-   int  c_min_tickets  =  check_tickets_arg (min_tickets );
215+   int  c_min_tickets  =  check_min_tickets_arg (min_tickets );
213216
214217  // Build semian resource structure 
215218  semian_resource_t  * res  =  NULL ;
@@ -254,10 +257,22 @@ check_permissions_arg(VALUE permissions)
254257}
255258
256259static  void 
257- check_tickets_xor_quota_arg (VALUE  tickets , VALUE  quota )
260+ check_tickets_xor_quota_arg (VALUE  tickets , VALUE  min_tickets ,  VALUE   quota )
258261{
259-   if  ((TYPE (tickets ) ==  T_NIL  &&  TYPE (quota ) ==  T_NIL ) || (TYPE (tickets ) !=  T_NIL  &&  TYPE (quota ) !=  T_NIL )){
260-     rb_raise (rb_eArgError , "Must pass exactly one of ticket or quota" );
262+   const  char  * msg  =  "Must pass exactly one of ticket or quota/min_tickets" ;
263+   if  (TYPE (quota ) !=  T_NIL ) {
264+     if  (TYPE (tickets ) !=  T_NIL ) {
265+       dprintf ("FOO" );
266+       rb_raise (rb_eArgError , msg );
267+     }
268+   } else  if  (TYPE (tickets ) !=  T_NIL ) {
269+     if  (TYPE (quota ) !=  T_NIL  ||  TYPE (min_tickets ) !=  T_NIL ) {
270+       dprintf ("FOO" );
271+       rb_raise (rb_eArgError , msg );
272+     }
273+   } else  {
274+       dprintf ("FOO" );
275+     rb_raise (rb_eArgError , msg );
261276  }
262277}
263278
@@ -303,6 +318,32 @@ check_tickets_arg(VALUE tickets)
303318  return  c_tickets ;
304319}
305320
321+ static  int 
322+ check_min_tickets_arg (VALUE  min_tickets )
323+ {
324+   int  retval  =  -1 ;
325+ 
326+   switch  (rb_type (min_tickets )) {
327+   case  T_NIL :
328+   case  T_UNDEF :
329+     return  -1 ;
330+   case  T_FLOAT :
331+     rb_warn ("semian min_tickets value %f is a float, converting to fixnum" , RFLOAT_VALUE (min_tickets ));
332+     retval  =  (int ) RFLOAT_VALUE (min_tickets );
333+     break ;
334+   case  T_FIXNUM :
335+     retval  =  FIX2LONG (min_tickets ); break ;
336+   default :
337+     retval  =  -1 ; break ;
338+   }
339+ 
340+   if  (retval  <= 0  ||  retval  >  system_max_semaphore_count ) {
341+     rb_raise (rb_eArgError , "max_tickets must be in range [1,%d)" , system_max_semaphore_count );
342+   }
343+ 
344+   return  retval ;
345+ }
346+ 
306347static  const  char * 
307348check_id_arg (VALUE  id )
308349{
0 commit comments