@@ -19,14 +19,28 @@ static mrb_value
19
19
mrb_zmq_close (mrb_state * mrb , mrb_value self )
20
20
{
21
21
mrb_value socket_val ;
22
- mrb_bool blocky = TRUE;
23
- mrb_get_args (mrb , "o|b" , & socket_val , & blocky );
22
+ mrb_get_args (mrb , "o" , & socket_val );
24
23
25
24
if (mrb_type (socket_val ) == MRB_TT_DATA && DATA_TYPE (socket_val ) == & mrb_zmq_socket_type ) {
26
- if (! blocky ) {
27
- int linger = 0 ;
28
- zmq_setsockopt ( DATA_PTR ( socket_val ), ZMQ_LINGER , & linger , sizeof ( linger ) );
25
+ int rc = zmq_close ( DATA_PTR ( socket_val ));
26
+ if ( unlikely ( rc == -1 )) {
27
+ mrb_zmq_handle_error ( mrb , "zmq_close" );
29
28
}
29
+ mrb_data_init (socket_val , NULL , NULL );
30
+ }
31
+
32
+ return mrb_nil_value ();
33
+ }
34
+
35
+ static mrb_value
36
+ mrb_zmq_close_mark (mrb_state * mrb , mrb_value self )
37
+ {
38
+ mrb_value socket_val ;
39
+ mrb_get_args (mrb , "o" , & socket_val );
40
+
41
+ if (mrb_type (socket_val ) == MRB_TT_DATA && DATA_TYPE (socket_val ) == & mrb_zmq_socket_type ) {
42
+ int disable = 0 ;
43
+ zmq_setsockopt (DATA_PTR (socket_val ), ZMQ_LINGER , & disable , sizeof (disable ));
30
44
int rc = zmq_close (DATA_PTR (socket_val ));
31
45
if (unlikely (rc == -1 )) {
32
46
mrb_zmq_handle_error (mrb , "zmq_close" );
@@ -516,7 +530,7 @@ mrb_zmq_socket(mrb_state *mrb, mrb_value self)
516
530
mrb_get_args (mrb , "i" , & type );
517
531
mrb_assert_int_fit (mrb_int , type , int , INT_MAX );
518
532
519
- void * socket = zmq_socket (MRB_LIBZMQ_CONTEXT (mrb ), type );
533
+ void * socket = zmq_socket (MRB_LIBZMQ_CONTEXT (mrb ), ( int ) type );
520
534
if (likely (socket )) {
521
535
mrb_data_init (self , socket , & mrb_zmq_socket_type );
522
536
} else {
@@ -535,7 +549,7 @@ mrb_zmq_socket_monitor(mrb_state *mrb, mrb_value self)
535
549
mrb_get_args (mrb , "dzi" , & socket , & mrb_zmq_socket_type , & addr , & events );
536
550
mrb_assert_int_fit (mrb_int , events , int , INT_MAX );
537
551
538
- int rc = zmq_socket_monitor (socket , addr , events );
552
+ int rc = zmq_socket_monitor (socket , addr , ( int ) events );
539
553
if (unlikely (rc == -1 )) {
540
554
mrb_zmq_handle_error (mrb , "zmq_socket_monitor" );
541
555
}
@@ -558,7 +572,7 @@ mrb_zmq_socket_recv(mrb_state *mrb, mrb_value self)
558
572
mrb_value msg_val = mrb_obj_new (mrb , zmq_msg_class , 0 , NULL );
559
573
zmq_msg_t * msg = (zmq_msg_t * ) DATA_PTR (msg_val );
560
574
561
- int rc = zmq_msg_recv (msg , DATA_PTR (self ), flags );
575
+ int rc = zmq_msg_recv (msg , DATA_PTR (self ), ( int ) flags );
562
576
if (unlikely (rc == -1 )) {
563
577
mrb_zmq_handle_error (mrb , "zmq_msg_recv" );
564
578
}
@@ -629,11 +643,11 @@ mrb_zmq_thread_fn_cb(mrb_state *mrb, const mrb_value mrb_zmq_thread_data_)
629
643
mrb_zmq_thread_data_t * mrb_zmq_thread_data = (mrb_zmq_thread_data_t * ) mrb_cptr (mrb_zmq_thread_data_ );
630
644
631
645
struct RClass * zmq_mod = mrb_module_get (mrb , "ZMQ" );
632
- mrb_value pipe_val = mrb_obj_value (mrb_obj_alloc (mrb , MRB_TT_DATA , mrb_class_get_under (mrb , zmq_mod , "Pair" )));
633
- mrb_data_init (pipe_val , mrb_zmq_thread_data -> backend , & mrb_zmq_socket_type );
646
+ mrb_value backend_pipe = mrb_obj_value (mrb_obj_alloc (mrb , MRB_TT_DATA , mrb_class_get_under (mrb , zmq_mod , "Pair" )));
647
+ mrb_data_init (backend_pipe , mrb_zmq_thread_data -> backend , & mrb_zmq_socket_type );
634
648
mrb_value timeo = mrb_int_value (mrb , 120000 );
635
- mrb_funcall (mrb , pipe_val , "sndtimeo=" , 1 , timeo );
636
- mrb_funcall (mrb , pipe_val , "rcvtimeo=" , 1 , timeo );
649
+ mrb_funcall (mrb , backend_pipe , "sndtimeo=" , 1 , timeo );
650
+ mrb_funcall (mrb , backend_pipe , "rcvtimeo=" , 1 , timeo );
637
651
638
652
mrb_value argv = mrb_msgpack_unpack (mrb , mrb_zmq_thread_data -> argv_str );
639
653
mrb_value block = mrb_msgpack_unpack (mrb , mrb_zmq_thread_data -> block_str );
@@ -645,7 +659,7 @@ mrb_zmq_thread_fn_cb(mrb_state *mrb, const mrb_value mrb_zmq_thread_data_)
645
659
} else {
646
660
mrb_zmq_thread_data -> thread_fn = mrb_obj_value (mrb_obj_alloc (mrb , MRB_TT_OBJECT , mrb_class_get_under (mrb , mrb_class_get_under (mrb , zmq_mod , "Thread" ), "Thread_fn" )));
647
661
}
648
- mrb_iv_set (mrb , mrb_zmq_thread_data -> thread_fn , mrb_intern_lit (mrb , "@pipe" ), pipe_val );
662
+ mrb_iv_set (mrb , mrb_zmq_thread_data -> thread_fn , mrb_intern_lit (mrb , "@pipe" ), backend_pipe );
649
663
mrb_funcall_with_block (mrb , mrb_zmq_thread_data -> thread_fn , mrb_intern_lit (mrb , "initialize" ), RARRAY_LEN (argv ), RARRAY_PTR (argv ), block );
650
664
int success = TRUE;
651
665
int rc = zmq_send (mrb_zmq_thread_data -> backend , & success , sizeof (success ), 0 );
@@ -731,12 +745,12 @@ mrb_zmq_threadstart(mrb_state *mrb, mrb_value thread_class)
731
745
mrb_true_value ()
732
746
};
733
747
mrb_zmq_thread_data -> endpoint = mrb_string_value_cstr (mrb , & pipe_args [0 ]);
734
- mrb_value frontend_val = mrb_obj_new (mrb , mrb_class_get_under (mrb , mrb_module_get (mrb , "ZMQ" ), "Pair" ), NELEMS (pipe_args ), pipe_args );
735
- mrb_zmq_thread_data -> frontend = DATA_PTR (frontend_val );
748
+ mrb_value frontend_pipe = mrb_obj_new (mrb , mrb_class_get_under (mrb , mrb_module_get (mrb , "ZMQ" ), "Pair" ), NELEMS (pipe_args ), pipe_args );
749
+ mrb_zmq_thread_data -> frontend = DATA_PTR (frontend_pipe );
736
750
mrb_value timeo = mrb_int_value (mrb , 120000 );
737
- mrb_funcall (mrb , frontend_val , "sndtimeo=" , 1 , timeo );
738
- mrb_funcall (mrb , frontend_val , "rcvtimeo=" , 1 , timeo );
739
- mrb_iv_set (mrb , self , mrb_intern_lit (mrb , "@pipe" ), frontend_val );
751
+ mrb_funcall (mrb , frontend_pipe , "sndtimeo=" , 1 , timeo );
752
+ mrb_funcall (mrb , frontend_pipe , "rcvtimeo=" , 1 , timeo );
753
+ mrb_iv_set (mrb , self , mrb_intern_lit (mrb , "@pipe" ), frontend_pipe );
740
754
mrb_zmq_thread_data -> backend = zmq_socket (MRB_LIBZMQ_CONTEXT (mrb ), ZMQ_PAIR );
741
755
if (unlikely (!mrb_zmq_thread_data -> backend )) {
742
756
mrb_zmq_handle_error (mrb , "zmq_socket" );
@@ -751,10 +765,9 @@ mrb_zmq_threadstart(mrb_state *mrb, mrb_value thread_class)
751
765
int success = FALSE;
752
766
zmq_recv (mrb_zmq_thread_data -> frontend , & success , sizeof (success ), 0 );
753
767
if (unlikely (!success )) {
754
- mrb_bool rcvmore = mrb_bool (mrb_funcall (mrb , frontend_val , "rcvmore?" , 0 ));
768
+ mrb_bool rcvmore = mrb_bool (mrb_funcall (mrb , frontend_pipe , "rcvmore?" , 0 ));
755
769
if (rcvmore ) {
756
- mrb_value exc = mrb_msgpack_unpack (mrb , mrb_funcall (mrb , mrb_funcall (mrb , frontend_val , "recv" , 0 ), "to_str" , 0 ));
757
- mrb_exc_raise (mrb , exc );
770
+ mrb_exc_raise (mrb , mrb_msgpack_unpack (mrb , mrb_funcall (mrb , mrb_funcall (mrb , frontend_pipe , "recv" , 0 ), "to_str" , 0 )));
758
771
} else {
759
772
mrb_raise (mrb , E_RUNTIME_ERROR , "Cannot initialize ZMQ Thread" );
760
773
}
@@ -996,7 +1009,9 @@ mrb_zmq_poller_wait(mrb_state *mrb, mrb_value self)
996
1009
return self ;
997
1010
}
998
1011
}
1012
+
999
1013
#else
1014
+
1000
1015
static mrb_value
1001
1016
mrb_zmq_poller_new (mrb_state * mrb , mrb_value self )
1002
1017
{
@@ -1108,10 +1123,7 @@ mrb_zmq_poller_remove(mrb_state *mrb, mrb_value self)
1108
1123
++ ptr ;
1109
1124
}
1110
1125
mrb_funcall (mrb , sockets , "delete_at" , 1 , mrb_int_value (mrb , i ));
1111
- pollitems = (struct zmq_pollitem_t * ) mrb_realloc (mrb , DATA_PTR (self ), RARRAY_LEN (sockets ) * sizeof (* pollitems ));
1112
- if (DATA_PTR (self ) != pollitems ) {
1113
- mrb_data_init (self , pollitems , & mrb_zmq_poller_type );
1114
- }
1126
+ DATA_PTR (self ) = (struct zmq_pollitem_t * ) mrb_realloc (mrb , DATA_PTR (self ), RARRAY_LEN (sockets ) * sizeof (* pollitems ));
1115
1127
1116
1128
return self ;
1117
1129
}
@@ -1216,7 +1228,7 @@ mrb_zmq_timers_add(mrb_state *mrb, mrb_value self)
1216
1228
timer_fn_arg -> block = block ;
1217
1229
mrb_iv_set (mrb , timer , mrb_intern_lit (mrb , "block" ), block );
1218
1230
1219
- int timer_id = zmq_timers_add (DATA_PTR (self ), interval , mrb_zmq_timer_fn , timer_fn_arg );
1231
+ int timer_id = zmq_timers_add (DATA_PTR (self ), ( size_t ) interval , mrb_zmq_timer_fn , timer_fn_arg );
1220
1232
if (unlikely (timer_id == -1 )) {
1221
1233
mrb_zmq_handle_error (mrb , "zmq_timers_add" );
1222
1234
}
@@ -1234,7 +1246,7 @@ mrb_zmq_timers_set_interval(mrb_state *mrb, mrb_value self)
1234
1246
mrb_assert_int_fit (mrb_int , interval , size_t , SIZE_MAX );
1235
1247
1236
1248
mrb_zmq_timers_fn_t * timer_fn_arg = (mrb_zmq_timers_fn_t * ) DATA_PTR (self );
1237
- int rc = zmq_timers_set_interval (DATA_PTR (timer_fn_arg -> timers ), timer_fn_arg -> timer_id , interval );
1249
+ int rc = zmq_timers_set_interval (DATA_PTR (timer_fn_arg -> timers ), timer_fn_arg -> timer_id , ( size_t ) interval );
1238
1250
if (unlikely (rc == -1 )) {
1239
1251
mrb_zmq_handle_error (mrb , "zmq_timers_set_interval" );
1240
1252
}
@@ -1426,7 +1438,8 @@ mrb_mruby_zmq_gem_init(mrb_state* mrb)
1426
1438
libzmq_mod = mrb_define_module (mrb , "LibZMQ" );
1427
1439
mrb_define_const (mrb , libzmq_mod , "_Context" , mrb_cptr_value (mrb , context ));
1428
1440
mrb_define_module_function (mrb , libzmq_mod , "bind" , mrb_zmq_bind , MRB_ARGS_REQ (2 ));
1429
- mrb_define_module_function (mrb , libzmq_mod , "close" , mrb_zmq_close , MRB_ARGS_ARG (1 , 1 ));
1441
+ mrb_define_module_function (mrb , libzmq_mod , "close" , mrb_zmq_close , MRB_ARGS_REQ (1 ));
1442
+ mrb_define_module_function (mrb , libzmq_mod , "close!" , mrb_zmq_close_mark , MRB_ARGS_REQ (1 ));
1430
1443
mrb_define_module_function (mrb , libzmq_mod , "connect" , mrb_zmq_connect , MRB_ARGS_REQ (2 ));
1431
1444
mrb_define_module_function (mrb , libzmq_mod , "ctx_get" , mrb_zmq_ctx_get , MRB_ARGS_REQ (1 ));
1432
1445
mrb_define_module_function (mrb , libzmq_mod , "ctx_set" , mrb_zmq_ctx_set , MRB_ARGS_REQ (2 ));
0 commit comments