@@ -309,21 +309,16 @@ NIF(erlzmq_nif_setsockopt)
309
309
size_t option_len ;
310
310
switch (option_name ) {
311
311
// uint64_t
312
- case ZMQ_HWM :
313
312
case ZMQ_AFFINITY :
314
- case ZMQ_SNDBUF :
315
- case ZMQ_RCVBUF :
316
313
if (! enif_get_uint64 (env , argv [2 ], & value_uint64 )) {
317
314
return enif_make_badarg (env );
318
315
}
319
316
option_value = & value_uint64 ;
320
317
option_len = sizeof (int64_t );
321
318
break ;
319
+
322
320
// int64_t
323
- case ZMQ_SWAP :
324
- case ZMQ_RATE :
325
- case ZMQ_RECOVERY_IVL :
326
- case ZMQ_MCAST_LOOP :
321
+ case ZMQ_MAXMSGSIZE :
327
322
if (! enif_get_int64 (env , argv [2 ], & value_int64 )) {
328
323
return enif_make_badarg (env );
329
324
}
@@ -341,10 +336,21 @@ NIF(erlzmq_nif_setsockopt)
341
336
option_len = value_binary .size ;
342
337
break ;
343
338
// int
339
+ case ZMQ_SNDHWM :
340
+ case ZMQ_RCVHWM :
341
+ case ZMQ_RATE :
342
+ case ZMQ_RECOVERY_IVL :
343
+ case ZMQ_RCVBUF :
344
+ case ZMQ_SNDBUF :
344
345
case ZMQ_LINGER :
345
346
case ZMQ_RECONNECT_IVL :
347
+ case ZMQ_RECONNECT_IVL_MAX :
346
348
case ZMQ_BACKLOG :
347
- if (! enif_get_int (env , argv [1 ], & value_int )) {
349
+ case ZMQ_MULTICAST_HOPS :
350
+ case ZMQ_RCVTIMEO :
351
+ case ZMQ_SNDTIMEO :
352
+ case ZMQ_IPV4ONLY :
353
+ if (! enif_get_int (env , argv [2 ], & value_int )) {
348
354
return enif_make_badarg (env );
349
355
}
350
356
option_value = & value_int ;
@@ -388,12 +394,7 @@ NIF(erlzmq_nif_getsockopt)
388
394
size_t option_len ;
389
395
switch (option_name ) {
390
396
// int64_t
391
- case ZMQ_RCVMORE :
392
- case ZMQ_SWAP :
393
- case ZMQ_RATE :
394
- case ZMQ_RECOVERY_IVL :
395
- case ZMQ_RECOVERY_IVL_MSEC :
396
- case ZMQ_MCAST_LOOP :
397
+ case ZMQ_MAXMSGSIZE :
397
398
option_len = sizeof (value_int64 );
398
399
enif_mutex_lock (socket -> mutex );
399
400
if (zmq_getsockopt (socket -> socket_zmq , option_name ,
@@ -405,10 +406,7 @@ NIF(erlzmq_nif_getsockopt)
405
406
return enif_make_tuple2 (env , enif_make_atom (env , "ok" ),
406
407
enif_make_int64 (env , value_int64 ));
407
408
// uint64_t
408
- case ZMQ_HWM :
409
409
case ZMQ_AFFINITY :
410
- case ZMQ_SNDBUF :
411
- case ZMQ_RCVBUF :
412
410
option_len = sizeof (value_uint64 );
413
411
enif_mutex_lock (socket -> mutex );
414
412
if (zmq_getsockopt (socket -> socket_zmq , option_name ,
@@ -435,10 +433,22 @@ NIF(erlzmq_nif_getsockopt)
435
433
enif_make_binary (env , & value_binary ));
436
434
// int
437
435
case ZMQ_TYPE :
436
+ case ZMQ_RCVMORE :
437
+ case ZMQ_SNDHWM :
438
+ case ZMQ_RCVHWM :
439
+ case ZMQ_RATE :
440
+ case ZMQ_RECOVERY_IVL :
441
+ case ZMQ_SNDBUF :
442
+ case ZMQ_RCVBUF :
438
443
case ZMQ_LINGER :
439
444
case ZMQ_RECONNECT_IVL :
440
445
case ZMQ_RECONNECT_IVL_MAX :
441
446
case ZMQ_BACKLOG :
447
+ case ZMQ_MULTICAST_HOPS :
448
+ case ZMQ_RCVTIMEO :
449
+ case ZMQ_SNDTIMEO :
450
+ case ZMQ_IPV4ONLY :
451
+ case ZMQ_EVENTS :
442
452
case ZMQ_FD : // FIXME: ZMQ_FD returns SOCKET on Windows
443
453
option_len = sizeof (value_int );
444
454
enif_mutex_lock (socket -> mutex );
@@ -483,12 +493,12 @@ NIF(erlzmq_nif_send)
483
493
int polling_thread_send = 1 ;
484
494
if (! socket -> active ) {
485
495
enif_mutex_lock (socket -> mutex );
486
- if (zmq_send (socket -> socket_zmq , & req .data .send .msg ,
487
- req .data .send .flags | ZMQ_NOBLOCK ) ) {
496
+ if (zmq_sendmsg (socket -> socket_zmq , & req .data .send .msg ,
497
+ req .data .send .flags | ZMQ_DONTWAIT ) == -1 ) {
488
498
enif_mutex_unlock (socket -> mutex );
489
499
int const error = zmq_errno ();
490
500
if (error != EAGAIN ||
491
- (error == EAGAIN && (req .data .send .flags & ZMQ_NOBLOCK ))) {
501
+ (error == EAGAIN && (req .data .send .flags & ZMQ_DONTWAIT ))) {
492
502
zmq_msg_close (& req .data .send .msg );
493
503
return return_zmq_errno (env , error );
494
504
}
@@ -520,7 +530,7 @@ NIF(erlzmq_nif_send)
520
530
enif_mutex_unlock (socket -> context -> mutex );
521
531
return return_zmq_errno (env , ETERM );
522
532
}
523
- if (zmq_send (socket -> context -> thread_socket , & msg , 0 )) {
533
+ if (zmq_sendmsg (socket -> context -> thread_socket , & msg , 0 ) == -1 ) {
524
534
enif_mutex_unlock (socket -> context -> mutex );
525
535
526
536
zmq_msg_close (& msg );
@@ -568,25 +578,25 @@ NIF(erlzmq_nif_recv)
568
578
if (zmq_msg_init (& msg )) {
569
579
return return_zmq_errno (env , zmq_errno ());
570
580
}
571
-
572
581
// try recv with noblock
573
582
enif_mutex_lock (socket -> mutex );
574
- if (zmq_recv (socket -> socket_zmq , & msg , ZMQ_NOBLOCK ) ) {
583
+ if (zmq_recvmsg (socket -> socket_zmq , & msg , ZMQ_DONTWAIT ) == -1 ) {
575
584
enif_mutex_unlock (socket -> mutex );
585
+ int const error = zmq_errno ();
576
586
zmq_msg_close (& msg );
577
587
578
- int const error = zmq_errno ();
579
588
if (error != EAGAIN ||
580
- (error == EAGAIN && (req .data .recv .flags & ZMQ_NOBLOCK ))) {
589
+ (error == EAGAIN && (req .data .recv .flags & ZMQ_DONTWAIT ))) {
581
590
return return_zmq_errno (env , error );
582
591
}
592
+
583
593
req .type = ERLZMQ_THREAD_REQUEST_RECV ;
584
594
req .data .recv .env = enif_alloc_env ();
585
595
req .data .recv .ref = enif_make_ref (req .data .recv .env );
586
596
enif_self (env , & req .data .recv .pid );
587
597
req .data .recv .socket = socket ;
588
598
589
- if (zmq_msg_init_size (& msg , sizeof (erlzmq_thread_request_t ))) {
599
+ if (zmq_msg_init_size (& msg , sizeof (erlzmq_thread_request_t )) == -1 ) {
590
600
enif_free_env (req .data .recv .env );
591
601
return return_zmq_errno (env , zmq_errno ());
592
602
}
@@ -598,7 +608,7 @@ NIF(erlzmq_nif_recv)
598
608
enif_mutex_unlock (socket -> context -> mutex );
599
609
return return_zmq_errno (env , ETERM );
600
610
}
601
- if (zmq_send (socket -> context -> thread_socket , & msg , 0 )) {
611
+ if (zmq_sendmsg (socket -> context -> thread_socket , & msg , 0 ) == -1 ) {
602
612
enif_mutex_unlock (socket -> context -> mutex );
603
613
604
614
zmq_msg_close (& msg );
@@ -665,7 +675,7 @@ NIF(erlzmq_nif_close)
665
675
enif_mutex_unlock (socket -> context -> mutex );
666
676
return enif_make_atom (env , "ok" );
667
677
}
668
- if (zmq_send (socket -> context -> thread_socket , & msg , 0 )) {
678
+ if (zmq_sendmsg (socket -> context -> thread_socket , & msg , 0 ) == -1 ) {
669
679
enif_mutex_unlock (socket -> context -> mutex );
670
680
zmq_msg_close (& msg );
671
681
enif_free_env (req .data .close .env );
@@ -704,7 +714,7 @@ NIF(erlzmq_nif_term)
704
714
memcpy (zmq_msg_data (& msg ), & req , sizeof (erlzmq_thread_request_t ));
705
715
706
716
enif_mutex_lock (context -> mutex );
707
- if (zmq_send (context -> thread_socket , & msg , 0 )) {
717
+ if (zmq_sendmsg (context -> thread_socket , & msg , 0 ) == -1 ) {
708
718
enif_mutex_unlock (context -> mutex );
709
719
zmq_msg_close (& msg );
710
720
enif_free_env (req .data .term .env );
@@ -770,17 +780,17 @@ static void * polling_thread(void * handle)
770
780
if (item -> revents & ZMQ_POLLIN ) {
771
781
size_t value_len = sizeof (int64_t );
772
782
int64_t flag_value = 0 ;
773
-
783
+
774
784
assert (r -> type == ERLZMQ_THREAD_REQUEST_RECV );
775
785
-- count ;
776
786
777
787
zmq_msg_t msg ;
778
788
zmq_msg_init (& msg );
779
789
enif_mutex_lock (r -> data .recv .socket -> mutex );
780
- if (zmq_recv (r -> data .recv .socket -> socket_zmq , & msg ,
781
- r -> data .recv .flags ) ||
782
- (r -> data .recv .socket -> active == ERLZMQ_SOCKET_ACTIVE_ON &&
783
- zmq_getsockopt (r -> data .recv .socket -> socket_zmq ,
790
+ if (zmq_recvmsg (r -> data .recv .socket -> socket_zmq , & msg ,
791
+ r -> data .recv .flags ) == -1 ||
792
+ (r -> data .recv .socket -> active == ERLZMQ_SOCKET_ACTIVE_ON &&
793
+ zmq_getsockopt (r -> data .recv .socket -> socket_zmq ,
784
794
ZMQ_RCVMORE , & flag_value , & value_len )) )
785
795
{
786
796
enif_mutex_unlock (r -> data .recv .socket -> mutex );
@@ -812,14 +822,16 @@ static void * polling_thread(void * handle)
812
822
813
823
if (r -> data .recv .socket -> active == ERLZMQ_SOCKET_ACTIVE_ON ) {
814
824
ERL_NIF_TERM flags_list ;
815
-
825
+
816
826
// Should we send the multipart flag
817
827
if (flag_value == 1 ) {
818
- flags_list = enif_make_list1 (r -> data .recv .env , enif_make_atom (r -> data .recv .env , "rcvmore" ));
828
+ flags_list = enif_make_list1 (r -> data .recv .env ,
829
+ enif_make_atom (r -> data .recv .env ,
830
+ "rcvmore" ));
819
831
} else {
820
832
flags_list = enif_make_list (r -> data .recv .env , 0 );
821
833
}
822
-
834
+
823
835
enif_send (NULL , & r -> data .recv .pid , r -> data .recv .env ,
824
836
enif_make_tuple4 (r -> data .recv .env ,
825
837
enif_make_atom (r -> data .recv .env , "zmq" ),
@@ -854,8 +866,8 @@ static void * polling_thread(void * handle)
854
866
-- count ;
855
867
856
868
enif_mutex_lock (r -> data .send .socket -> mutex );
857
- if (zmq_send (r -> data .send .socket -> socket_zmq ,
858
- & r -> data .send .msg , r -> data .send .flags )) {
869
+ if (zmq_sendmsg (r -> data .send .socket -> socket_zmq ,
870
+ & r -> data .send .msg , r -> data .send .flags ) == -1 ) {
859
871
enif_mutex_unlock (r -> data .send .socket -> mutex );
860
872
enif_send (NULL , & r -> data .send .pid , r -> data .send .env ,
861
873
enif_make_tuple2 (r -> data .send .env ,
@@ -885,9 +897,9 @@ static void * polling_thread(void * handle)
885
897
zmq_msg_t msg ;
886
898
zmq_msg_init (& msg );
887
899
enif_mutex_lock (context -> mutex );
888
- status = zmq_recv (thread_socket , & msg , 0 );
900
+ status = zmq_recvmsg (thread_socket , & msg , 0 );
889
901
enif_mutex_unlock (context -> mutex );
890
- assert (status == 0 );
902
+ assert (status != -1 );
891
903
892
904
assert (zmq_msg_size (& msg ) == sizeof (erlzmq_thread_request_t ));
893
905
@@ -1024,7 +1036,7 @@ static ERL_NIF_TERM add_active_req(ErlNifEnv* env, erlzmq_socket_t * socket)
1024
1036
1025
1037
memcpy (zmq_msg_data (& msg ), & req , sizeof (erlzmq_thread_request_t ));
1026
1038
1027
- if (zmq_send (socket -> context -> thread_socket , & msg , 0 )) {
1039
+ if (zmq_sendmsg (socket -> context -> thread_socket , & msg , 0 ) == -1 ) {
1028
1040
zmq_msg_close (& msg );
1029
1041
enif_free_env (req .data .recv .env );
1030
1042
return return_zmq_errno (env , zmq_errno ());
0 commit comments