Skip to content

Commit 7dcd68f

Browse files
committed
migrate from the 2.1 api to 3.1 api for zmq
1 parent 08fe70c commit 7dcd68f

File tree

5 files changed

+413
-108
lines changed

5 files changed

+413
-108
lines changed

README.md

+15-21
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,41 @@
11
erlzmq2
2-
====
2+
=======
33
NIF based Erlang bindings for the ZeroMQ messaging library.
44

55
Copyright (c) 2011 Yurii Rashkovskii, Evax Software and Michael Truog
66

77
Overview
8-
========
8+
--------
99

1010
The erlzmq2 application provides high-performance NIF based Erlang
1111
bindings for the ZeroMQ messaging library.
1212

1313
Downloading
14-
===========
14+
-----------
1515

1616
The erlzmq2 source code can be found on
17-
[GitHub](https://github.com/yrashk/erlzmq2)
17+
[GitHub](https://github.com/zeromq/erlzmq2)
1818

1919
$ git clone http://github.com/zeromq/erlzmq2.git
2020

21-
It is also available on [Agner](http://erlagner.org/):
22-
23-
$ agner build erlzmq
24-
25-
In order to build erlzmq2 against a specific version of ZeroMQ (not
26-
`v2.1.11`), use this:
27-
28-
$ ZEROMQ_VERSION=v<VERSION> agner build erlzmq
29-
3021
Building
31-
========
22+
--------
23+
24+
Please note that to behave properly on your system ZeroMQ might
25+
require [some tuning](http://www.zeromq.org/docs:tuning-zeromq).
3226

3327
Build the code
3428

3529
$ make
3630

37-
If you want to build against a specific version of ZeroMQ (not
38-
`v2.1.11`), use this:
31+
If you want to build against a specific version of ZeroMQ in the 3.1
32+
series (not `v3.1.0`), use this:
3933

4034
$ ZEROMQ_VERSION=v<VERSION> make
4135

36+
Be aware that this will almost assuredly not work correctly for any
37+
versions of zeromq that are not in the 3.1 series.
38+
4239
Build the docs
4340

4441
$ make docs
@@ -55,11 +52,8 @@ Run the benchmarks (requires [python](http://www.python.org) and
5552
This will run performance tests and output png graphs in the graphs
5653
directory.
5754

58-
Please note that to behave properly on your system ZeroMQ might
59-
require [some tuning](http://www.zeromq.org/docs:tuning-zeromq).
60-
6155
Architecture
62-
============
56+
------------
6357

6458
The bindings use Erlang's
6559
[NIF (native implemented functions)](http://www.erlang.org/doc/man/erl_nif.html)
@@ -68,7 +62,7 @@ pair of inproc sockets by context are used to simulate blocking recv
6862
calls without affecting the Erlang virtual machine's responsiveness.
6963

7064
License
71-
=======
65+
-------
7266

7367
The project is released under the MIT license.
7468

c_src/erlzmq_nif.c

+54-42
Original file line numberDiff line numberDiff line change
@@ -309,21 +309,16 @@ NIF(erlzmq_nif_setsockopt)
309309
size_t option_len;
310310
switch (option_name) {
311311
// uint64_t
312-
case ZMQ_HWM:
313312
case ZMQ_AFFINITY:
314-
case ZMQ_SNDBUF:
315-
case ZMQ_RCVBUF:
316313
if (! enif_get_uint64(env, argv[2], &value_uint64)) {
317314
return enif_make_badarg(env);
318315
}
319316
option_value = &value_uint64;
320317
option_len = sizeof(int64_t);
321318
break;
319+
322320
// int64_t
323-
case ZMQ_SWAP:
324-
case ZMQ_RATE:
325-
case ZMQ_RECOVERY_IVL:
326-
case ZMQ_MCAST_LOOP:
321+
case ZMQ_MAXMSGSIZE:
327322
if (! enif_get_int64(env, argv[2], &value_int64)) {
328323
return enif_make_badarg(env);
329324
}
@@ -341,10 +336,21 @@ NIF(erlzmq_nif_setsockopt)
341336
option_len = value_binary.size;
342337
break;
343338
// 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:
344345
case ZMQ_LINGER:
345346
case ZMQ_RECONNECT_IVL:
347+
case ZMQ_RECONNECT_IVL_MAX:
346348
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)) {
348354
return enif_make_badarg(env);
349355
}
350356
option_value = &value_int;
@@ -388,12 +394,7 @@ NIF(erlzmq_nif_getsockopt)
388394
size_t option_len;
389395
switch(option_name) {
390396
// 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:
397398
option_len = sizeof(value_int64);
398399
enif_mutex_lock(socket->mutex);
399400
if (zmq_getsockopt(socket->socket_zmq, option_name,
@@ -405,10 +406,7 @@ NIF(erlzmq_nif_getsockopt)
405406
return enif_make_tuple2(env, enif_make_atom(env, "ok"),
406407
enif_make_int64(env, value_int64));
407408
// uint64_t
408-
case ZMQ_HWM:
409409
case ZMQ_AFFINITY:
410-
case ZMQ_SNDBUF:
411-
case ZMQ_RCVBUF:
412410
option_len = sizeof(value_uint64);
413411
enif_mutex_lock(socket->mutex);
414412
if (zmq_getsockopt(socket->socket_zmq, option_name,
@@ -435,10 +433,22 @@ NIF(erlzmq_nif_getsockopt)
435433
enif_make_binary(env, &value_binary));
436434
// int
437435
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:
438443
case ZMQ_LINGER:
439444
case ZMQ_RECONNECT_IVL:
440445
case ZMQ_RECONNECT_IVL_MAX:
441446
case ZMQ_BACKLOG:
447+
case ZMQ_MULTICAST_HOPS:
448+
case ZMQ_RCVTIMEO:
449+
case ZMQ_SNDTIMEO:
450+
case ZMQ_IPV4ONLY:
451+
case ZMQ_EVENTS:
442452
case ZMQ_FD: // FIXME: ZMQ_FD returns SOCKET on Windows
443453
option_len = sizeof(value_int);
444454
enif_mutex_lock(socket->mutex);
@@ -483,12 +493,12 @@ NIF(erlzmq_nif_send)
483493
int polling_thread_send = 1;
484494
if (! socket->active) {
485495
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) {
488498
enif_mutex_unlock(socket->mutex);
489499
int const error = zmq_errno();
490500
if (error != EAGAIN ||
491-
(error == EAGAIN && (req.data.send.flags & ZMQ_NOBLOCK))) {
501+
(error == EAGAIN && (req.data.send.flags & ZMQ_DONTWAIT))) {
492502
zmq_msg_close(&req.data.send.msg);
493503
return return_zmq_errno(env, error);
494504
}
@@ -520,7 +530,7 @@ NIF(erlzmq_nif_send)
520530
enif_mutex_unlock(socket->context->mutex);
521531
return return_zmq_errno(env, ETERM);
522532
}
523-
if (zmq_send(socket->context->thread_socket, &msg, 0)) {
533+
if (zmq_sendmsg(socket->context->thread_socket, &msg, 0) == -1) {
524534
enif_mutex_unlock(socket->context->mutex);
525535

526536
zmq_msg_close(&msg);
@@ -568,25 +578,25 @@ NIF(erlzmq_nif_recv)
568578
if (zmq_msg_init(&msg)) {
569579
return return_zmq_errno(env, zmq_errno());
570580
}
571-
572581
// try recv with noblock
573582
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) {
575584
enif_mutex_unlock(socket->mutex);
585+
int const error = zmq_errno();
576586
zmq_msg_close(&msg);
577587

578-
int const error = zmq_errno();
579588
if (error != EAGAIN ||
580-
(error == EAGAIN && (req.data.recv.flags & ZMQ_NOBLOCK))) {
589+
(error == EAGAIN && (req.data.recv.flags & ZMQ_DONTWAIT))) {
581590
return return_zmq_errno(env, error);
582591
}
592+
583593
req.type = ERLZMQ_THREAD_REQUEST_RECV;
584594
req.data.recv.env = enif_alloc_env();
585595
req.data.recv.ref = enif_make_ref(req.data.recv.env);
586596
enif_self(env, &req.data.recv.pid);
587597
req.data.recv.socket = socket;
588598

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) {
590600
enif_free_env(req.data.recv.env);
591601
return return_zmq_errno(env, zmq_errno());
592602
}
@@ -598,7 +608,7 @@ NIF(erlzmq_nif_recv)
598608
enif_mutex_unlock(socket->context->mutex);
599609
return return_zmq_errno(env, ETERM);
600610
}
601-
if (zmq_send(socket->context->thread_socket, &msg, 0)) {
611+
if (zmq_sendmsg(socket->context->thread_socket, &msg, 0) == -1) {
602612
enif_mutex_unlock(socket->context->mutex);
603613

604614
zmq_msg_close(&msg);
@@ -665,7 +675,7 @@ NIF(erlzmq_nif_close)
665675
enif_mutex_unlock(socket->context->mutex);
666676
return enif_make_atom(env, "ok");
667677
}
668-
if (zmq_send(socket->context->thread_socket, &msg, 0)) {
678+
if (zmq_sendmsg(socket->context->thread_socket, &msg, 0) == -1) {
669679
enif_mutex_unlock(socket->context->mutex);
670680
zmq_msg_close(&msg);
671681
enif_free_env(req.data.close.env);
@@ -704,7 +714,7 @@ NIF(erlzmq_nif_term)
704714
memcpy(zmq_msg_data(&msg), &req, sizeof(erlzmq_thread_request_t));
705715

706716
enif_mutex_lock(context->mutex);
707-
if (zmq_send(context->thread_socket, &msg, 0)) {
717+
if (zmq_sendmsg(context->thread_socket, &msg, 0) == -1) {
708718
enif_mutex_unlock(context->mutex);
709719
zmq_msg_close(&msg);
710720
enif_free_env(req.data.term.env);
@@ -770,17 +780,17 @@ static void * polling_thread(void * handle)
770780
if (item->revents & ZMQ_POLLIN) {
771781
size_t value_len = sizeof(int64_t);
772782
int64_t flag_value = 0;
773-
783+
774784
assert(r->type == ERLZMQ_THREAD_REQUEST_RECV);
775785
--count;
776786

777787
zmq_msg_t msg;
778788
zmq_msg_init(&msg);
779789
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,
784794
ZMQ_RCVMORE, &flag_value, &value_len)) )
785795
{
786796
enif_mutex_unlock(r->data.recv.socket->mutex);
@@ -812,14 +822,16 @@ static void * polling_thread(void * handle)
812822

813823
if (r->data.recv.socket->active == ERLZMQ_SOCKET_ACTIVE_ON) {
814824
ERL_NIF_TERM flags_list;
815-
825+
816826
// Should we send the multipart flag
817827
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"));
819831
} else {
820832
flags_list = enif_make_list(r->data.recv.env, 0);
821833
}
822-
834+
823835
enif_send(NULL, &r->data.recv.pid, r->data.recv.env,
824836
enif_make_tuple4(r->data.recv.env,
825837
enif_make_atom(r->data.recv.env, "zmq"),
@@ -854,8 +866,8 @@ static void * polling_thread(void * handle)
854866
--count;
855867

856868
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) {
859871
enif_mutex_unlock(r->data.send.socket->mutex);
860872
enif_send(NULL, &r->data.send.pid, r->data.send.env,
861873
enif_make_tuple2(r->data.send.env,
@@ -885,9 +897,9 @@ static void * polling_thread(void * handle)
885897
zmq_msg_t msg;
886898
zmq_msg_init(&msg);
887899
enif_mutex_lock(context->mutex);
888-
status = zmq_recv(thread_socket, &msg, 0);
900+
status = zmq_recvmsg(thread_socket, &msg, 0);
889901
enif_mutex_unlock(context->mutex);
890-
assert(status == 0);
902+
assert(status != -1);
891903

892904
assert(zmq_msg_size(&msg) == sizeof(erlzmq_thread_request_t));
893905

@@ -1024,7 +1036,7 @@ static ERL_NIF_TERM add_active_req(ErlNifEnv* env, erlzmq_socket_t * socket)
10241036

10251037
memcpy(zmq_msg_data(&msg), &req, sizeof(erlzmq_thread_request_t));
10261038

1027-
if (zmq_send(socket->context->thread_socket, &msg, 0)) {
1039+
if (zmq_sendmsg(socket->context->thread_socket, &msg, 0) == -1) {
10281040
zmq_msg_close(&msg);
10291041
enif_free_env(req.data.recv.env);
10301042
return return_zmq_errno(env, zmq_errno());

0 commit comments

Comments
 (0)