From c79c471588df372904d82cc1d8450fa71ea9ce86 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 2 Jul 2014 15:30:32 +0200 Subject: [PATCH 01/40] Add ZMQZyre class, a binding of the libzyre https://github.com/zeromq/zyre Signed-off-by: William MARTIN --- config.m4 | 34 ++++ php_zmq.h | 12 ++ php_zmq_private.h | 17 ++ tests/skipzyre.inc | 6 + tests/zyre-001.phpt | 15 ++ tests/zyre-002.phpt | 39 ++++ tests/zyre-003.phpt | 79 ++++++++ tests/zyre-004.phpt | 49 +++++ zmq.c | 441 ++++++++++++++++++++++++++++++++++++++++++-- 9 files changed, 680 insertions(+), 12 deletions(-) create mode 100644 tests/skipzyre.inc create mode 100644 tests/zyre-001.phpt create mode 100644 tests/zyre-002.phpt create mode 100644 tests/zyre-003.phpt create mode 100644 tests/zyre-004.phpt diff --git a/config.m4 b/config.m4 index 6e5acde..90f3a29 100644 --- a/config.m4 +++ b/config.m4 @@ -43,6 +43,40 @@ if test "$PHP_ZMQ" != "no"; then AC_MSG_ERROR(Unable to find libzmq installation) fi + AC_MSG_CHECKING(for CZMQ) + if $PKG_CONFIG --exists libczmq; then + PHP_CZMQ_VERSION=`$PKG_CONFIG libczmq --modversion` + PHP_CZMQ_PREFIX=`$PKG_CONFIG libczmq --variable=prefix` + AC_MSG_RESULT([found version $PHP_CZMQ_VERSION in $PHP_CZMQ_PREFIX]) + + PHP_CZMQ_LIBS=`$PKG_CONFIG libczmq --libs` + PHP_CZMQ_INCS=`$PKG_CONFIG libczmq --cflags` + + PHP_EVAL_LIBLINE($PHP_CZMQ_LIBS, ZMQ_SHARED_LIBADD) + PHP_EVAL_INCLINE($PHP_CZMQ_INCS) + + AC_DEFINE([HAVE_CZMQ], [], [CZMQ was found]) + else + AC_MSG_RESULT([no]) + fi + + AC_MSG_CHECKING(for Zyre) + if $PKG_CONFIG --exists libzyre; then + PHP_ZYRE_VERSION=`$PKG_CONFIG libzyre --modversion` + PHP_ZYRE_PREFIX=`$PKG_CONFIG libzyre --variable=prefix` + AC_MSG_RESULT([found version $PHP_ZYRE_VERSION in $PHP_ZYRE_PREFIX]) + + PHP_ZYRE_LIBS=`$PKG_CONFIG libzyre --libs` + PHP_ZYRE_INCS=`$PKG_CONFIG libzyre --cflags` + + PHP_EVAL_LIBLINE($PHP_ZYRE_LIBS, ZMQ_SHARED_LIBADD) + PHP_EVAL_INCLINE($PHP_ZYRE_INCS) + + AC_DEFINE([HAVE_ZYRE], [], [ZYRE was found]) + else + AC_MSG_RESULT([no]) + fi + AC_CHECK_HEADERS([stdint.h],[php_zmq_have_stdint=yes; break;]) if test $php_zmq_have_stdint != "yes"; then AC_MSG_ERROR(Unable to find stdint.h) diff --git a/php_zmq.h b/php_zmq.h index ef50bfb..538fe7a 100644 --- a/php_zmq.h +++ b/php_zmq.h @@ -47,4 +47,16 @@ extern zend_module_entry zmq_module_entry; #define phpext_zmq_ptr &zmq_module_entry +/* PHP 5.4 */ +#if PHP_VERSION_ID < 50399 +# define object_properties_init(zo, class_type) { \ + zval *tmp; \ + zend_hash_copy((*zo).properties, \ + &class_type->default_properties, \ + (copy_ctor_func_t) zval_add_ref, \ + (void *) &tmp, \ + sizeof(zval *)); \ + } +#endif + #endif /* _PHP_ZMQ_H_ */ diff --git a/php_zmq_private.h b/php_zmq_private.h index 4712b83..3a90c28 100644 --- a/php_zmq_private.h +++ b/php_zmq_private.h @@ -37,6 +37,14 @@ #include +#ifdef HAVE_CZMQ && HAVE_ZYRE +# include +# include +# if ZYRE_VERSION_MAJOR == 1 +# define HAVE_ZYRE_1 +# endif +#endif + #ifdef PHP_WIN32 # include "win32/php_stdint.h" #else @@ -263,5 +271,14 @@ ZEND_BEGIN_MODULE_GLOBALS(php_zmq) php_zmq_clock_ctx_t *clock_ctx; ZEND_END_MODULE_GLOBALS(php_zmq) +#ifdef HAVE_ZYRE_1 +#define PHP_ZMQ_ZYRE_OBJECT php_zmq_zyre *this = (php_zmq_zyre *)zend_object_store_get_object(getThis() TSRMLS_CC) + +typedef struct _php_zmq_zyre { + zend_object zend_object; + zctx_t *shadow_context; + zyre_t *zyre; +} php_zmq_zyre; +#endif #endif /* _PHP_ZMQ_PRIVATE_H_ */ diff --git a/tests/skipzyre.inc b/tests/skipzyre.inc new file mode 100644 index 0000000..e81bd91 --- /dev/null +++ b/tests/skipzyre.inc @@ -0,0 +1,6 @@ + diff --git a/tests/zyre-001.phpt b/tests/zyre-001.phpt new file mode 100644 index 0000000..cbced3e --- /dev/null +++ b/tests/zyre-001.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test [Zyre] Object can be instancied multiple time +--SKIPIF-- + +--FILE-- + +--FILE-- +setHeader('X-TEST', 'Z1'); +$z1->start(); + +$z2 = new ZMQZyre($ctx); +$z2->setHeader('X-TEST', 'Z2'); +$z2->start(); + +usleep(100000); + +$obj = $z1->recv(); +var_dump($obj->command); +var_dump($obj->headers->{'X-TEST'}); + +$obj = $z2->recv(); +var_dump($obj->command); +var_dump($obj->headers->{'X-TEST'}); + +$z1->stop(); + +$obj = $z2->recv(); +var_dump($obj->command); +$z2->stop(); + +--EXPECTF-- +string(5) "ENTER" +string(2) "Z2" +string(5) "ENTER" +string(2) "Z1" +string(4) "EXIT" diff --git a/tests/zyre-003.phpt b/tests/zyre-003.phpt new file mode 100644 index 0000000..d2365b2 --- /dev/null +++ b/tests/zyre-003.phpt @@ -0,0 +1,79 @@ +--TEST-- +Test [Zyre] Zyre objects can exchange data in a group of peer +--SKIPIF-- + +--FILE-- +start(); +$z1->join('ZMQZyreTestGroup'); + + +$z2 = new ZMQZyre($ctx); +$z2->start(); +$z2->join('ZMQZyreTestGroup'); + + +usleep(100000); + +// Enter +$obj = $z1->recv(); +var_dump($obj->command); + +// Join +$obj = $z1->recv(); +var_dump($obj->command); +var_dump($obj->group); + +// Enter +$obj = $z2->recv(); +var_dump($obj->command); + +// Join +$obj = $z2->recv(); +var_dump($obj->command); +var_dump($obj->group); + +$z2->sendGroup('ZMQZyreTestGroup', 'Some usefull data'); + +usleep(100000); + +// SHOUT +$obj = $z1->recv(); +var_dump($obj->group); +var_dump($obj->data); + +$z1->leave('ZMQZyreTestGroup'); + +usleep(100000); + +// Leave +$obj = $z2->recv(); +var_dump($obj->command); +var_dump($obj->group); + +$z1->stop(); + +usleep(100000); + +// Exit +$obj = $z2->recv(); +var_dump($obj->command); + +$z2->stop(); + +--EXPECTF-- +string(5) "ENTER" +string(4) "JOIN" +string(16) "ZMQZyreTestGroup" +string(5) "ENTER" +string(4) "JOIN" +string(16) "ZMQZyreTestGroup" +string(16) "ZMQZyreTestGroup" +string(17) "Some usefull data" +string(5) "LEAVE" +string(16) "ZMQZyreTestGroup" +string(4) "EXIT" diff --git a/tests/zyre-004.phpt b/tests/zyre-004.phpt new file mode 100644 index 0000000..67fc720 --- /dev/null +++ b/tests/zyre-004.phpt @@ -0,0 +1,49 @@ +--TEST-- +Test [Zyre] Zyre objects can exchange data with a peer +--SKIPIF-- + +--FILE-- +start(); + +$z2 = new ZMQZyre($ctx); +$z2->start(); + +usleep(100000); + +// Enter +$obj = $z1->recv(); +var_dump($obj->command); + +// Enter +$obj = $z2->recv(); +var_dump($obj->command); +$peer = $obj->peer; + +$z2->sendPeer($peer, 'Some very usefull data'); + +usleep(100000); + +// SHOUT +$obj = $z1->recv(); +var_dump($obj->data); + +$z1->stop(); + +usleep(100000); + +// Exit +$obj = $z2->recv(); +var_dump($obj->command); + +$z2->stop(); + +--EXPECTF-- +string(5) "ENTER" +string(5) "ENTER" +string(22) "Some very usefull data" +string(4) "EXIT" diff --git a/zmq.c b/zmq.c index 8f7e222..e1bd447 100644 --- a/zmq.c +++ b/zmq.c @@ -40,18 +40,30 @@ zend_class_entry *php_zmq_socket_sc_entry; zend_class_entry *php_zmq_poll_sc_entry; zend_class_entry *php_zmq_device_sc_entry; +#ifdef HAVE_ZYRE_1 +zend_class_entry *php_zmq_zyre_sc_entry; +#endif + zend_class_entry *php_zmq_exception_sc_entry; zend_class_entry *php_zmq_context_exception_sc_entry; zend_class_entry *php_zmq_socket_exception_sc_entry; zend_class_entry *php_zmq_poll_exception_sc_entry; zend_class_entry *php_zmq_device_exception_sc_entry; +#ifdef HAVE_ZYRE_1 +zend_class_entry *php_zmq_zyre_exception_sc_entry; +#endif + static zend_object_handlers zmq_object_handlers; static zend_object_handlers zmq_socket_object_handlers; static zend_object_handlers zmq_context_object_handlers; static zend_object_handlers zmq_poll_object_handlers; static zend_object_handlers zmq_device_object_handlers; +#ifdef HAVE_ZYRE_1 +static zend_object_handlers zmq_zyre_object_handlers; +#endif + #ifdef PHP_ZMQ_PTHREADS #include @@ -1578,6 +1590,402 @@ PHP_METHOD(zmqdevice, __clone) { } /* -- END ZMQPoll */ +#ifdef HAVE_ZYRE_1 + +/* --- START ZMQZyre --- */ + +static void php_zmq_zyre_free_storage(void *object TSRMLS_DC) +{ + php_zmq_zyre *zmq_zyre = (php_zmq_zyre *) object; + + zyre_destroy(&zmq_zyre->zyre); + zctx_destroy(&zmq_zyre->shadow_context); + + zend_object_std_dtor(&zmq_zyre->zend_object TSRMLS_CC); + efree(zmq_zyre); +} + +static zend_object_value php_zmq_zyre_object_new(zend_class_entry *class_type TSRMLS_DC) +{ + zend_object_value result; + php_zmq_zyre *zmq_zyre; + + zmq_zyre = (php_zmq_zyre *) emalloc(sizeof(php_zmq_zyre)); + memset(&zmq_zyre->zend_object, 0, sizeof(zend_object)); + + /* zbeacon is initialised in ZMQZyre#__construct. */ + zmq_zyre->zyre = NULL; + + zend_object_std_init(&zmq_zyre->zend_object, class_type TSRMLS_CC); + object_properties_init(&zmq_zyre->zend_object, class_type); + + result.handle = zend_objects_store_put( + zmq_zyre, + NULL, + (zend_objects_free_object_storage_t) php_zmq_zyre_free_storage, + NULL TSRMLS_CC + ); + result.handlers = &zmq_zyre_object_handlers; + return result; +} + +/* {{{ proto void ZMQZyre::__construct(ZMQContext context) + Construct a ZMQZyre +*/ +PHP_METHOD(zmqzyre, __construct) +{ + php_zmq_zyre *this; + zval *object; + php_zmq_context_object *context_object; + + this = (php_zmq_zyre *) zend_object_store_get_object(getThis() TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &object, php_zmq_context_sc_entry) != SUCCESS) { + return; + } + + context_object = (php_zmq_context_object *) zend_object_store_get_object(object TSRMLS_CC); + + this->shadow_context = zctx_shadow_zmq_ctx(context_object->context->z_ctx); + if (this->shadow_context == NULL) { + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Failed to create the underlying shadow context object."); + } + + this->zyre = zyre_new(this->shadow_context); + if (this->zyre == NULL) { + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Failed to create the underlying zbeacon object."); + } + + return; +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre___construct_args, 0, 0, 1) + ZEND_ARG_OBJ_INFO(0, ZMQContext, ZMQContext, 0) +ZEND_END_ARG_INFO(); + +/* {{{ proto void ZMQZyre::setHeader(string name, string value) + Set node header; these are provided to other nodes during discovery and come in each ENTER message. +*/ +PHP_METHOD(zmqzyre, setHeader) +{ + PHP_ZMQ_ZYRE_OBJECT; + char *name, *value; + int name_len, value_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &name, &name_len, &value, &value_len) == FAILURE) { + return; + } + + zyre_set_header(this->zyre, name, value); + + ZMQ_RETURN_THIS; +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_setHeader_args, 0, 0, 1) + ZEND_ARG_INFO(0, name) + ZEND_ARG_INFO(0, value) +ZEND_END_ARG_INFO(); + +/* {{{ proto void ZMQZyre::start() + Start node, after setting header values. When you start a node it begins discovery and connection. + There is no stop method; to stop a node, destroy it. +*/ +PHP_METHOD(zmqzyre, start) +{ + PHP_ZMQ_ZYRE_OBJECT; + + zyre_start(this->zyre); + + ZMQ_RETURN_THIS; +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_start_args, 0, 0, 1) +ZEND_END_ARG_INFO(); + +/* {{{ proto void ZMQZyre::stop() + Stop node, this signals to other peers that this node will go away. + This is polite; however you can also just destroy the node without stopping it. +*/ +PHP_METHOD(zmqzyre, stop) +{ + PHP_ZMQ_ZYRE_OBJECT; + + zyre_stop(this->zyre); + + ZMQ_RETURN_THIS; +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_stop_args, 0, 0, 1) +ZEND_END_ARG_INFO(); + +/* {{{ proto void ZMQZyre::join(string group) + Join a named group; after joining a group you can send messages + to the group and all Zyre nodes in that group will receive them. +*/ +PHP_METHOD(zmqzyre, join) +{ + PHP_ZMQ_ZYRE_OBJECT; + char *group; + int group_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &group, &group_len) == FAILURE) { + return; + } + + zyre_join(this->zyre, group); + + ZMQ_RETURN_THIS; +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_join_args, 0, 0, 1) + ZEND_ARG_INFO(0, group) +ZEND_END_ARG_INFO(); + +/* {{{ proto void ZMQZyre::leave(string group) + Leave a group. +*/ +PHP_METHOD(zmqzyre, leave) +{ + PHP_ZMQ_ZYRE_OBJECT; + char *group; + int group_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &group, &group_len) == FAILURE) { + return; + } + + zyre_leave(this->zyre, group); + + ZMQ_RETURN_THIS; +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_leave_args, 0, 0, 1) + ZEND_ARG_INFO(0, group) +ZEND_END_ARG_INFO(); + + +// Helper function to convert zhash_t to php object +void zhash_to_object(const char *key, void *item, void *argument) +{ + zval *obj = (zval *)argument; + zend_update_property_string(NULL, obj, key, strlen(key), (char *)item TSRMLS_CC); +} + +/* {{{ proto void ZMQZyre::recv() + Receive next message from network; the message may be a control + message (ENTER, EXIT, JOIN, LEAVE) or data (WHISPER, SHOUT). + Returns associative array, or NULL if interrupted +*/ +PHP_METHOD(zmqzyre, recv) +{ + PHP_ZMQ_ZYRE_OBJECT; + zmsg_t *msg; + char *command, *peerid; + + msg = zyre_recv(this->zyre); + if (msg == NULL) { + RETURN_NULL(); + } + + object_init(return_value); + + command = zmsg_popstr(msg); + peerid = zmsg_popstr(msg); + + // Parse commands with additional content + if (strcmp(command, "ENTER") == 0) { + + zframe_t *headers_packed = zmsg_pop (msg); + char *ipaddress = zmsg_popstr(msg); + + if (headers_packed != NULL) { + + zhash_t *headers = zhash_unpack (headers_packed); + zframe_destroy (&headers_packed); + + if (headers != NULL) { + zval *h; + MAKE_STD_ZVAL(h); + object_init(h); + + zhash_foreach(headers, zhash_to_object, h); + zhash_destroy(&headers); + + zend_update_property(NULL, return_value, "headers", strlen("headers"), h TSRMLS_CC); + } + } + + if (ipaddress != NULL) { + zend_update_property_string(NULL, return_value, "ipaddress", strlen("ipaddress"), ipaddress TSRMLS_CC); + free(ipaddress); + } else { + zend_update_property_null(NULL, return_value, "ipaddress", strlen("ipaddress") TSRMLS_CC); + } + } else + if (strcmp(command, "JOIN") == 0) { + char *group = zmsg_popstr(msg); + if (group == NULL) { + zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); + free(group); + } + } else + if (strcmp(command, "LEAVE") == 0) { + char *group = zmsg_popstr(msg); + if (group == NULL) { + zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); + free(group); + } + } else + if (strcmp(command, "SHOUT") == 0) { + char *group = zmsg_popstr(msg); + if (group == NULL) { + zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); + free(group); + } + + char *data = zmsg_popstr(msg); + if (data == NULL) { + zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "data", strlen("data"), data TSRMLS_CC); + free(data); + } + } else + if (strcmp(command, "WHISPER") == 0) { + char *data = zmsg_popstr(msg); + if (data == NULL) { + zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "data", strlen("data"), data TSRMLS_CC); + free(data); + } + } + + zend_update_property_string(NULL, return_value, "command", strlen("command"), command TSRMLS_CC); + free(command); + + zend_update_property_string(NULL, return_value, "peer", strlen("peer"), peerid TSRMLS_CC); + free(peerid); + + zmsg_destroy(&msg); +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_recv_args, 0, 0, 1) +ZEND_END_ARG_INFO(); + +/* {{{ proto void ZMQZyre::send(string group, string data) + Send a message on the network for a group +*/ +PHP_METHOD(zmqzyre, sendGroup) +{ + PHP_ZMQ_ZYRE_OBJECT; + char *data = NULL, *group = NULL; + int data_len, group_len; + int rc; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &group, &group_len, &data, &data_len) == FAILURE) { + RETURN_FALSE; + } + + zyre_shouts (this->zyre, group, data); + + RETURN_TRUE; +} + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendGroup_args, 0, 0, 2) + ZEND_ARG_INFO(0, group) + ZEND_ARG_INFO(0, data) +ZEND_END_ARG_INFO(); + +/* {{{ proto void ZMQZyre::send(string peer, string data) + Send a message on the network to a specific peer +*/ +PHP_METHOD(zmqzyre, sendPeer) +{ + PHP_ZMQ_ZYRE_OBJECT; + char *data = NULL, *peer = NULL; + int data_len, peer_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &peer, &peer_len, &data, &data_len) == FAILURE) { + RETURN_FALSE; + } + + zyre_whispers(this->zyre, peer, data); + + RETURN_TRUE; +} + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendPeer_args, 0, 0, 2) + ZEND_ARG_INFO(0, peer) + ZEND_ARG_INFO(0, data) +ZEND_END_ARG_INFO(); + +/* {{{ proto ZMQSocket ZMQBeacon::getSocket() + Get beacon ZeroMQ socket, for polling or receiving messages +*/ +PHP_METHOD(zmqzyre, getSocket) +{ + PHP_ZMQ_ZYRE_OBJECT; + php_zmq_socket_object *zmq_sock; + void *zyre_sock = NULL; + bool is_persistent = false; + + zyre_sock = zyre_socket(this->zyre); + if (zyre_socket == NULL) { + RETURN_NULL(); + } + + // Create internal socket + php_zmq_socket *socket = (php_zmq_socket *) emalloc(sizeof(php_zmq_socket)); + socket->z_socket = zyre_sock; + socket->ctx = NULL; + socket->pid = getpid(); + socket->is_persistent = is_persistent; + zend_hash_init(&(socket->connect), 0, NULL, NULL, is_persistent); + zend_hash_init(&(socket->bind), 0, NULL, NULL, is_persistent); + + // Return a ZMQSocket + object_init_ex(return_value, php_zmq_socket_sc_entry); + zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(return_value TSRMLS_CC); + zmq_sock->socket = socket; +} +/* }}} */ + +ZEND_BEGIN_ARG_INFO_EX(zmqzyre_getSocket_args, 0, 0, 0) +ZEND_END_ARG_INFO() + + +static zend_function_entry php_zmq_zyre_class_methods[] = { + PHP_ME(zmqzyre, __construct, zmqzyre___construct_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR | ZEND_ACC_FINAL) + PHP_ME(zmqzyre, setHeader, zmqzyre_setHeader_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, start, zmqzyre_start_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, stop, zmqzyre_stop_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, join, zmqzyre_join_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, leave, zmqzyre_leave_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, recv, zmqzyre_recv_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, sendPeer, zmqzyre_sendPeer_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, sendGroup, zmqzyre_sendGroup_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, getSocket, zmqzyre_getSocket_args, ZEND_ACC_PUBLIC) + {NULL, NULL, NULL} +}; + +/* --- END ZMQZyre --- */ + +#endif // HAVE_ZYRE_1 + ZEND_BEGIN_ARG_INFO_EX(zmq_construct_args, 0, 0, 0) ZEND_END_ARG_INFO() @@ -1903,18 +2311,6 @@ static void php_zmq_device_object_free_storage(void *object TSRMLS_DC) efree(intern); } -/* PHP 5.4 */ -#if PHP_VERSION_ID < 50399 -# define object_properties_init(zo, class_type) { \ - zval *tmp; \ - zend_hash_copy((*zo).properties, \ - &class_type->default_properties, \ - (copy_ctor_func_t) zval_add_ref, \ - (void *) &tmp, \ - sizeof(zval *)); \ - } -#endif - static zend_object_value php_zmq_context_object_new_ex(zend_class_entry *class_type, php_zmq_context_object **ptr TSRMLS_DC) { zend_object_value retval; @@ -2065,6 +2461,10 @@ PHP_MINIT_FUNCTION(zmq) zend_class_entry ce, ce_context, ce_socket, ce_poll, ce_device; zend_class_entry ce_exception, ce_context_exception, ce_socket_exception, ce_poll_exception, ce_device_exception; +#ifdef HAVE_ZYRE_1 + zend_class_entry ce_zyre, ce_zyre_exception; +#endif + le_zmq_context = zend_register_list_destructors_ex(NULL, php_zmq_context_dtor, "ZMQ persistent context", module_number); le_zmq_socket = zend_register_list_destructors_ex(NULL, php_zmq_socket_dtor, "ZMQ persistent socket", module_number); @@ -2074,6 +2474,10 @@ PHP_MINIT_FUNCTION(zmq) memcpy(&zmq_poll_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); memcpy(&zmq_device_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); +#ifdef HAVE_ZYRE_1 + memcpy(&zmq_zyre_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); +#endif + INIT_CLASS_ENTRY(ce, "ZMQ", php_zmq_class_methods); ce.create_object = NULL; zmq_object_handlers.clone_obj = NULL; @@ -2099,6 +2503,13 @@ PHP_MINIT_FUNCTION(zmq) zmq_device_object_handlers.clone_obj = NULL; php_zmq_device_sc_entry = zend_register_internal_class(&ce_device TSRMLS_CC); +#ifdef HAVE_ZYRE_1 + INIT_CLASS_ENTRY(ce_zyre, "ZMQZyre", php_zmq_zyre_class_methods); + ce_zyre.create_object = php_zmq_zyre_object_new; + zmq_zyre_object_handlers.clone_obj = NULL; + php_zmq_zyre_sc_entry = zend_register_internal_class(&ce_zyre TSRMLS_CC); +#endif + INIT_CLASS_ENTRY(ce_exception, "ZMQException", NULL); php_zmq_exception_sc_entry = zend_register_internal_class_ex(&ce_exception, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC); php_zmq_exception_sc_entry->ce_flags &= ~ZEND_ACC_FINAL_CLASS; @@ -2119,6 +2530,12 @@ PHP_MINIT_FUNCTION(zmq) php_zmq_device_exception_sc_entry = zend_register_internal_class_ex(&ce_device_exception, php_zmq_exception_sc_entry, "ZMQException" TSRMLS_CC); php_zmq_device_exception_sc_entry->ce_flags |= ZEND_ACC_FINAL_CLASS; +#ifdef HAVE_ZYRE_1 + INIT_CLASS_ENTRY(ce_zyre_exception, "ZMQZyreException", NULL); + php_zmq_zyre_exception_sc_entry = zend_register_internal_class_ex(&ce_zyre_exception, php_zmq_exception_sc_entry, "ZMQException" TSRMLS_CC); + php_zmq_zyre_exception_sc_entry->ce_flags |= ZEND_ACC_FINAL_CLASS; +#endif + ZEND_INIT_MODULE_GLOBALS(php_zmq, php_zmq_init_globals, NULL); ZMQ_G(clock_ctx) = php_zmq_clock_init (); From e3ad68fc9445def9b790c52312dae173fc6aefd9 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 2 Jul 2014 15:35:53 +0200 Subject: [PATCH 02/40] Update api.h --- api.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- zmq.c | 8 +++--- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/api.php b/api.php index 7bf7743..6e5b2b8 100644 --- a/api.php +++ b/api.php @@ -374,5 +374,89 @@ public function count() {} */ public function clear() {} } + +class ZMQZyre { + /** + * Construct a ZMQZyre + * + * @param ZMQContext $context + * @return void + */ + public function __construct(ZMQContext $ZMQContext) {} + /** + * Set node header; these are provided to other nodes during discovery and come in each ENTER message. + * + * @param string $name + * @param string $value + * @return void + */ + public function setHeader($name, $value="") {} + /** + * Start node, after setting header values. When you start a node it begins discovery and connection. + There is no stop method; to stop a node, destroy it. + * + * @return void + */ + public function start() {} + /** + * Stop node, this signals to other peers that this node will go away. + This is polite; however you can also just destroy the node without stopping it. + * + * @return void + */ + public function stop() {} + /** + * Join a named group; after joining a group you can send messages + to the group and all Zyre nodes in that group will receive them. + * + * @param string $group + * @return void + */ + public function join($group) {} + /** + * Leave a group. + * + * @param string $group + * @return void + */ + public function leave($group) {} + /** + * Receive next message from network; the message may be a control + message (ENTER, EXIT, JOIN, LEAVE) or data (WHISPER, SHOUT). + Returns associative array, or NULL if interrupted + * + * @return void + */ + public function recv() {} + /** + * Send a message on the network to a specific peer + * + * @param string $peer + * @param string $data + * @return void + */ + public function sendPeer($peer, $data) {} + /** + * Send a message on the network for a group + * + * @param string $group + * @param string $data + * @return void + */ + public function sendGroup($group, $data) {} + /** + * Get zyre ZeroMQ socket, for polling or receiving messages + * + * @return ZMQSocket + */ + public function getSocket() {} +} + +class ZMQException extends Exception {} +class ZMQContextException extends ZMQException {} +class ZMQSocketException extends ZMQException {} +class ZMQPollException extends ZMQException {} +class ZMQDeviceException extends ZMQException {} +class ZMQZyreException extends ZMQException {} ?> - \ No newline at end of file + diff --git a/zmq.c b/zmq.c index e1bd447..5e8b987 100644 --- a/zmq.c +++ b/zmq.c @@ -1886,7 +1886,7 @@ PHP_METHOD(zmqzyre, recv) ZEND_BEGIN_ARG_INFO_EX(zmqzyre_recv_args, 0, 0, 1) ZEND_END_ARG_INFO(); -/* {{{ proto void ZMQZyre::send(string group, string data) +/* {{{ proto void ZMQZyre::sendGroup(string group, string data) Send a message on the network for a group */ PHP_METHOD(zmqzyre, sendGroup) @@ -1910,7 +1910,7 @@ ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendGroup_args, 0, 0, 2) ZEND_ARG_INFO(0, data) ZEND_END_ARG_INFO(); -/* {{{ proto void ZMQZyre::send(string peer, string data) +/* {{{ proto void ZMQZyre::sendPeer(string peer, string data) Send a message on the network to a specific peer */ PHP_METHOD(zmqzyre, sendPeer) @@ -1933,8 +1933,8 @@ ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendPeer_args, 0, 0, 2) ZEND_ARG_INFO(0, data) ZEND_END_ARG_INFO(); -/* {{{ proto ZMQSocket ZMQBeacon::getSocket() - Get beacon ZeroMQ socket, for polling or receiving messages +/* {{{ proto ZMQSocket ZMQZyre::getSocket() + Get zyre ZeroMQ socket, for polling or receiving messages */ PHP_METHOD(zmqzyre, getSocket) { From b18fec2c7c4ef235122fb48002ebdfd6dd14c85f Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 2 Jul 2014 16:24:42 +0200 Subject: [PATCH 03/40] Add test on ZMQZyre::getSocket --- tests/zyre-002.phpt | 3 +++ tests/zyre-005.phpt | 41 +++++++++++++++++++++++++++++++++++++++++ zmq.c | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/zyre-005.phpt diff --git a/tests/zyre-002.phpt b/tests/zyre-002.phpt index 1307a07..c830242 100644 --- a/tests/zyre-002.phpt +++ b/tests/zyre-002.phpt @@ -27,8 +27,11 @@ var_dump($obj->headers->{'X-TEST'}); $z1->stop(); +usleep(100000); + $obj = $z2->recv(); var_dump($obj->command); + $z2->stop(); --EXPECTF-- diff --git a/tests/zyre-005.phpt b/tests/zyre-005.phpt new file mode 100644 index 0000000..6ade673 --- /dev/null +++ b/tests/zyre-005.phpt @@ -0,0 +1,41 @@ +--TEST-- +Test [Zyre] Test getter of internal ZMQSocket in ZMQZyre +--SKIPIF-- + +--FILE-- +setHeader('X-TEST', 'Z1'); +$z1->start(); + +usleep(100000); + +$z2 = new ZMQZyre($ctx); +$z2->setHeader('X-TEST', 'Z2'); +$z2->start(); + +usleep(100000); + +$sock1 = $z1->getSocket(); +$sock2 = $z2->getSocket(); + + +var_dump($sock1->recv()); // Enter +$sock1->recv(); // ID +$sock1->recv(); // Headers +$sock1->recv(); // IP:PORT + +var_dump($sock2->recv()); // Enter +$sock2->recv(); // ID +$sock2->recv(); // Headers +$sock2->recv(); // IP:PORT + +unset($sock1); +unset($sock2); + +--EXPECTF-- +string(5) "ENTER" +string(5) "ENTER" diff --git a/zmq.c b/zmq.c index 5e8b987..5ebb51d 100644 --- a/zmq.c +++ b/zmq.c @@ -1951,7 +1951,7 @@ PHP_METHOD(zmqzyre, getSocket) // Create internal socket php_zmq_socket *socket = (php_zmq_socket *) emalloc(sizeof(php_zmq_socket)); socket->z_socket = zyre_sock; - socket->ctx = NULL; + socket->ctx = this->shadow_context; socket->pid = getpid(); socket->is_persistent = is_persistent; zend_hash_init(&(socket->connect), 0, NULL, NULL, is_persistent); From b35155c6146a82adb906b114a92033aa477ba758 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 09:17:02 +0200 Subject: [PATCH 04/40] Refactor ZMQZyre::getSocket --- php_zmq_private.h | 1 + zmq.c | 49 +++++++++++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/php_zmq_private.h b/php_zmq_private.h index 3a90c28..9007412 100644 --- a/php_zmq_private.h +++ b/php_zmq_private.h @@ -278,6 +278,7 @@ typedef struct _php_zmq_zyre { zend_object zend_object; zctx_t *shadow_context; zyre_t *zyre; + zval *internalSocket; } php_zmq_zyre; #endif diff --git a/zmq.c b/zmq.c index 5ebb51d..038dc21 100644 --- a/zmq.c +++ b/zmq.c @@ -1598,6 +1598,11 @@ static void php_zmq_zyre_free_storage(void *object TSRMLS_DC) { php_zmq_zyre *zmq_zyre = (php_zmq_zyre *) object; + if (zmq_zyre->internalSocket != NULL) { + zend_objects_store_del_ref(zmq_zyre->internalSocket TSRMLS_CC); + zval_ptr_dtor (&zmq_zyre->internalSocket); + } + zyre_destroy(&zmq_zyre->zyre); zctx_destroy(&zmq_zyre->shadow_context); @@ -1615,7 +1620,7 @@ static zend_object_value php_zmq_zyre_object_new(zend_class_entry *class_type TS /* zbeacon is initialised in ZMQZyre#__construct. */ zmq_zyre->zyre = NULL; - + zmq_zyre->internalSocket = NULL; zend_object_std_init(&zmq_zyre->zend_object, class_type TSRMLS_CC); object_properties_init(&zmq_zyre->zend_object, class_type); @@ -1941,26 +1946,32 @@ PHP_METHOD(zmqzyre, getSocket) PHP_ZMQ_ZYRE_OBJECT; php_zmq_socket_object *zmq_sock; void *zyre_sock = NULL; - bool is_persistent = false; - - zyre_sock = zyre_socket(this->zyre); - if (zyre_socket == NULL) { - RETURN_NULL(); - } + bool is_persistent = true; - // Create internal socket - php_zmq_socket *socket = (php_zmq_socket *) emalloc(sizeof(php_zmq_socket)); - socket->z_socket = zyre_sock; - socket->ctx = this->shadow_context; - socket->pid = getpid(); - socket->is_persistent = is_persistent; - zend_hash_init(&(socket->connect), 0, NULL, NULL, is_persistent); - zend_hash_init(&(socket->bind), 0, NULL, NULL, is_persistent); + if (this->internalSocket == NULL) { + zyre_sock = zyre_socket(this->zyre); + if (zyre_socket == NULL) { + RETURN_NULL(); + } - // Return a ZMQSocket - object_init_ex(return_value, php_zmq_socket_sc_entry); - zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(return_value TSRMLS_CC); - zmq_sock->socket = socket; + // Create internal socket + php_zmq_socket *socket = (php_zmq_socket *) emalloc(sizeof(php_zmq_socket)); + socket->z_socket = zyre_sock; + socket->ctx = this->shadow_context; + socket->pid = getpid(); + socket->is_persistent = is_persistent; + zend_hash_init(&(socket->connect), 0, NULL, NULL, is_persistent); + zend_hash_init(&(socket->bind), 0, NULL, NULL, is_persistent); + + // Create a ZMQSocket + MAKE_STD_ZVAL(this->internalSocket); + object_init_ex(this->internalSocket, php_zmq_socket_sc_entry); + zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(this->internalSocket TSRMLS_CC); + zmq_sock->socket = socket; + } + + *return_value = *(this->internalSocket); + zval_copy_ctor(return_value); } /* }}} */ From 994f3caac526ad5205fc5337f714211b047224e7 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 09:50:34 +0200 Subject: [PATCH 05/40] Display version of libs --- api.php | 1 + zmq.c | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/api.php b/api.php index 6e5b2b8..12479c2 100644 --- a/api.php +++ b/api.php @@ -376,6 +376,7 @@ public function clear() {} } class ZMQZyre { + const LIBZYRE_VERSION = '1.1.0'; /** * Construct a ZMQZyre * diff --git a/zmq.c b/zmq.c index 038dc21..f7863b1 100644 --- a/zmq.c +++ b/zmq.c @@ -103,6 +103,22 @@ static void php_zmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) } /* }}} */ +/** {{{ static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) +*/ +static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) +{ + (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", CZMQ_VERSION_MAJOR, CZMQ_VERSION_MINOR, CZMQ_VERSION_PATCH); +} +/* }}} */ + +/** {{{ static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) +*/ +static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) +{ + (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", ZYRE_VERSION_MAJOR, ZYRE_VERSION_MINOR, ZYRE_VERSION_PATCH); +} +/* }}} */ + /** {{{ static int php_zmq_socket_list_entry(void) */ static int php_zmq_socket_list_entry(void) @@ -2619,6 +2635,14 @@ PHP_MINIT_FUNCTION(zmq) #undef PHP_ZMQ_REGISTER_CONST_LONG #undef PHP_ZMQ_REGISTER_CONST_STRING +#define PHP_ZYRE_REGISTER_CONST_STRING(const_name, value) \ + zend_declare_class_constant_string (php_zmq_zyre_sc_entry, const_name, sizeof(const_name)-1, value TSRMLS_CC); + + php_zyre_get_lib_version(version); + PHP_ZYRE_REGISTER_CONST_STRING("LIBZYRE_VERSION", version); + +#undef PHP_ZYRE_REGISTER_CONST_STRING + return SUCCESS; } @@ -2636,14 +2660,21 @@ PHP_MSHUTDOWN_FUNCTION(zmq) PHP_MINFO_FUNCTION(zmq) { - char version[PHP_ZMQ_VERSION_LEN]; - php_zmq_get_lib_version(version); - + char zmq[PHP_ZMQ_VERSION_LEN]; + char czmq[PHP_ZMQ_VERSION_LEN]; + char zyre[PHP_ZMQ_VERSION_LEN]; + + php_zmq_get_lib_version(zmq); + php_czmq_get_lib_version(czmq); + php_zyre_get_lib_version(zyre); + php_info_print_table_start(); php_info_print_table_header(2, "ZMQ extension", "enabled"); php_info_print_table_row(2, "ZMQ extension version", PHP_ZMQ_VERSION); - php_info_print_table_row(2, "libzmq version", version); + php_info_print_table_row(2, "libzmq version", zmq); + php_info_print_table_row(2, "czmq version", czmq); + php_info_print_table_row(2, "libzyre version", zyre); php_info_print_table_end(); DISPLAY_INI_ENTRIES(); From 929b10811abb2d442ccb43170960fae256431b34 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 10:01:06 +0200 Subject: [PATCH 06/40] Remove a camelcase variable --- php_zmq_private.h | 2 +- zmq.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/php_zmq_private.h b/php_zmq_private.h index 9007412..1501a72 100644 --- a/php_zmq_private.h +++ b/php_zmq_private.h @@ -278,7 +278,7 @@ typedef struct _php_zmq_zyre { zend_object zend_object; zctx_t *shadow_context; zyre_t *zyre; - zval *internalSocket; + zval *internal_socket; } php_zmq_zyre; #endif diff --git a/zmq.c b/zmq.c index f7863b1..f3cb770 100644 --- a/zmq.c +++ b/zmq.c @@ -1614,9 +1614,9 @@ static void php_zmq_zyre_free_storage(void *object TSRMLS_DC) { php_zmq_zyre *zmq_zyre = (php_zmq_zyre *) object; - if (zmq_zyre->internalSocket != NULL) { - zend_objects_store_del_ref(zmq_zyre->internalSocket TSRMLS_CC); - zval_ptr_dtor (&zmq_zyre->internalSocket); + if (zmq_zyre->internal_socket != NULL) { + zend_objects_store_del_ref(zmq_zyre->internal_socket TSRMLS_CC); + zval_ptr_dtor (&zmq_zyre->internal_socket); } zyre_destroy(&zmq_zyre->zyre); @@ -1636,7 +1636,7 @@ static zend_object_value php_zmq_zyre_object_new(zend_class_entry *class_type TS /* zbeacon is initialised in ZMQZyre#__construct. */ zmq_zyre->zyre = NULL; - zmq_zyre->internalSocket = NULL; + zmq_zyre->internal_socket = NULL; zend_object_std_init(&zmq_zyre->zend_object, class_type TSRMLS_CC); object_properties_init(&zmq_zyre->zend_object, class_type); @@ -1964,7 +1964,7 @@ PHP_METHOD(zmqzyre, getSocket) void *zyre_sock = NULL; bool is_persistent = true; - if (this->internalSocket == NULL) { + if (this->internal_socket == NULL) { zyre_sock = zyre_socket(this->zyre); if (zyre_socket == NULL) { RETURN_NULL(); @@ -1980,13 +1980,13 @@ PHP_METHOD(zmqzyre, getSocket) zend_hash_init(&(socket->bind), 0, NULL, NULL, is_persistent); // Create a ZMQSocket - MAKE_STD_ZVAL(this->internalSocket); - object_init_ex(this->internalSocket, php_zmq_socket_sc_entry); - zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(this->internalSocket TSRMLS_CC); + MAKE_STD_ZVAL(this->internal_socket); + object_init_ex(this->internal_socket, php_zmq_socket_sc_entry); + zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(this->internal_socket TSRMLS_CC); zmq_sock->socket = socket; } - *return_value = *(this->internalSocket); + *return_value = *(this->internal_socket); zval_copy_ctor(return_value); } /* }}} */ From f0ccd4f14e7592d6127172d219117c62f951459d Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 10:01:27 +0200 Subject: [PATCH 07/40] Use real tabs --- zmq.c | 258 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 129 insertions(+), 129 deletions(-) diff --git a/zmq.c b/zmq.c index f3cb770..dd74cbd 100644 --- a/zmq.c +++ b/zmq.c @@ -1614,13 +1614,13 @@ static void php_zmq_zyre_free_storage(void *object TSRMLS_DC) { php_zmq_zyre *zmq_zyre = (php_zmq_zyre *) object; - if (zmq_zyre->internal_socket != NULL) { - zend_objects_store_del_ref(zmq_zyre->internal_socket TSRMLS_CC); - zval_ptr_dtor (&zmq_zyre->internal_socket); + if (zmq_zyre->internal_socket != NULL) { + zend_objects_store_del_ref(zmq_zyre->internal_socket TSRMLS_CC); + zval_ptr_dtor (&zmq_zyre->internal_socket); } - zyre_destroy(&zmq_zyre->zyre); - zctx_destroy(&zmq_zyre->shadow_context); + zyre_destroy(&zmq_zyre->zyre); + zctx_destroy(&zmq_zyre->shadow_context); zend_object_std_dtor(&zmq_zyre->zend_object TSRMLS_CC); efree(zmq_zyre); @@ -1636,7 +1636,7 @@ static zend_object_value php_zmq_zyre_object_new(zend_class_entry *class_type TS /* zbeacon is initialised in ZMQZyre#__construct. */ zmq_zyre->zyre = NULL; - zmq_zyre->internal_socket = NULL; + zmq_zyre->internal_socket = NULL; zend_object_std_init(&zmq_zyre->zend_object, class_type TSRMLS_CC); object_properties_init(&zmq_zyre->zend_object, class_type); @@ -1698,7 +1698,7 @@ PHP_METHOD(zmqzyre, setHeader) return; } - zyre_set_header(this->zyre, name, value); + zyre_set_header(this->zyre, name, value); ZMQ_RETURN_THIS; } @@ -1717,7 +1717,7 @@ PHP_METHOD(zmqzyre, start) { PHP_ZMQ_ZYRE_OBJECT; - zyre_start(this->zyre); + zyre_start(this->zyre); ZMQ_RETURN_THIS; } @@ -1734,7 +1734,7 @@ PHP_METHOD(zmqzyre, stop) { PHP_ZMQ_ZYRE_OBJECT; - zyre_stop(this->zyre); + zyre_stop(this->zyre); ZMQ_RETURN_THIS; } @@ -1757,7 +1757,7 @@ PHP_METHOD(zmqzyre, join) return; } - zyre_join(this->zyre, group); + zyre_join(this->zyre, group); ZMQ_RETURN_THIS; } @@ -1780,7 +1780,7 @@ PHP_METHOD(zmqzyre, leave) return; } - zyre_leave(this->zyre, group); + zyre_leave(this->zyre, group); ZMQ_RETURN_THIS; } @@ -1794,8 +1794,8 @@ ZEND_END_ARG_INFO(); // Helper function to convert zhash_t to php object void zhash_to_object(const char *key, void *item, void *argument) { - zval *obj = (zval *)argument; - zend_update_property_string(NULL, obj, key, strlen(key), (char *)item TSRMLS_CC); + zval *obj = (zval *)argument; + zend_update_property_string(NULL, obj, key, strlen(key), (char *)item TSRMLS_CC); } /* {{{ proto void ZMQZyre::recv() @@ -1811,7 +1811,7 @@ PHP_METHOD(zmqzyre, recv) msg = zyre_recv(this->zyre); if (msg == NULL) { - RETURN_NULL(); + RETURN_NULL(); } object_init(return_value); @@ -1819,80 +1819,80 @@ PHP_METHOD(zmqzyre, recv) command = zmsg_popstr(msg); peerid = zmsg_popstr(msg); - // Parse commands with additional content + // Parse commands with additional content if (strcmp(command, "ENTER") == 0) { - zframe_t *headers_packed = zmsg_pop (msg); - char *ipaddress = zmsg_popstr(msg); - - if (headers_packed != NULL) { - - zhash_t *headers = zhash_unpack (headers_packed); - zframe_destroy (&headers_packed); - - if (headers != NULL) { - zval *h; - MAKE_STD_ZVAL(h); - object_init(h); - - zhash_foreach(headers, zhash_to_object, h); - zhash_destroy(&headers); - - zend_update_property(NULL, return_value, "headers", strlen("headers"), h TSRMLS_CC); - } - } - - if (ipaddress != NULL) { - zend_update_property_string(NULL, return_value, "ipaddress", strlen("ipaddress"), ipaddress TSRMLS_CC); - free(ipaddress); - } else { - zend_update_property_null(NULL, return_value, "ipaddress", strlen("ipaddress") TSRMLS_CC); - } + zframe_t *headers_packed = zmsg_pop (msg); + char *ipaddress = zmsg_popstr(msg); + + if (headers_packed != NULL) { + + zhash_t *headers = zhash_unpack (headers_packed); + zframe_destroy (&headers_packed); + + if (headers != NULL) { + zval *h; + MAKE_STD_ZVAL(h); + object_init(h); + + zhash_foreach(headers, zhash_to_object, h); + zhash_destroy(&headers); + + zend_update_property(NULL, return_value, "headers", strlen("headers"), h TSRMLS_CC); + } + } + + if (ipaddress != NULL) { + zend_update_property_string(NULL, return_value, "ipaddress", strlen("ipaddress"), ipaddress TSRMLS_CC); + free(ipaddress); + } else { + zend_update_property_null(NULL, return_value, "ipaddress", strlen("ipaddress") TSRMLS_CC); + } } else if (strcmp(command, "JOIN") == 0) { - char *group = zmsg_popstr(msg); - if (group == NULL) { - zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); - } else { - zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); - free(group); - } - } else - if (strcmp(command, "LEAVE") == 0) { - char *group = zmsg_popstr(msg); - if (group == NULL) { - zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); - } else { - zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); - free(group); - } - } else - if (strcmp(command, "SHOUT") == 0) { - char *group = zmsg_popstr(msg); - if (group == NULL) { - zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); - } else { - zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); - free(group); - } - - char *data = zmsg_popstr(msg); - if (data == NULL) { - zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); - } else { - zend_update_property_string(NULL, return_value, "data", strlen("data"), data TSRMLS_CC); - free(data); - } - } else - if (strcmp(command, "WHISPER") == 0) { - char *data = zmsg_popstr(msg); - if (data == NULL) { - zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); - } else { - zend_update_property_string(NULL, return_value, "data", strlen("data"), data TSRMLS_CC); - free(data); - } - } + char *group = zmsg_popstr(msg); + if (group == NULL) { + zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); + free(group); + } + } else + if (strcmp(command, "LEAVE") == 0) { + char *group = zmsg_popstr(msg); + if (group == NULL) { + zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); + free(group); + } + } else + if (strcmp(command, "SHOUT") == 0) { + char *group = zmsg_popstr(msg); + if (group == NULL) { + zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); + free(group); + } + + char *data = zmsg_popstr(msg); + if (data == NULL) { + zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "data", strlen("data"), data TSRMLS_CC); + free(data); + } + } else + if (strcmp(command, "WHISPER") == 0) { + char *data = zmsg_popstr(msg); + if (data == NULL) { + zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); + } else { + zend_update_property_string(NULL, return_value, "data", strlen("data"), data TSRMLS_CC); + free(data); + } + } zend_update_property_string(NULL, return_value, "command", strlen("command"), command TSRMLS_CC); free(command); @@ -1915,15 +1915,15 @@ PHP_METHOD(zmqzyre, sendGroup) PHP_ZMQ_ZYRE_OBJECT; char *data = NULL, *group = NULL; int data_len, group_len; - int rc; + int rc; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &group, &group_len, &data, &data_len) == FAILURE) { RETURN_FALSE; } - - zyre_shouts (this->zyre, group, data); + + zyre_shouts (this->zyre, group, data); - RETURN_TRUE; + RETURN_TRUE; } ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendGroup_args, 0, 0, 2) @@ -1943,10 +1943,10 @@ PHP_METHOD(zmqzyre, sendPeer) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &peer, &peer_len, &data, &data_len) == FAILURE) { RETURN_FALSE; } - - zyre_whispers(this->zyre, peer, data); + + zyre_whispers(this->zyre, peer, data); - RETURN_TRUE; + RETURN_TRUE; } ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendPeer_args, 0, 0, 2) @@ -1959,35 +1959,35 @@ ZEND_END_ARG_INFO(); */ PHP_METHOD(zmqzyre, getSocket) { - PHP_ZMQ_ZYRE_OBJECT; + PHP_ZMQ_ZYRE_OBJECT; php_zmq_socket_object *zmq_sock; void *zyre_sock = NULL; bool is_persistent = true; - if (this->internal_socket == NULL) { - zyre_sock = zyre_socket(this->zyre); - if (zyre_socket == NULL) { - RETURN_NULL(); - } - - // Create internal socket - php_zmq_socket *socket = (php_zmq_socket *) emalloc(sizeof(php_zmq_socket)); - socket->z_socket = zyre_sock; - socket->ctx = this->shadow_context; - socket->pid = getpid(); - socket->is_persistent = is_persistent; - zend_hash_init(&(socket->connect), 0, NULL, NULL, is_persistent); - zend_hash_init(&(socket->bind), 0, NULL, NULL, is_persistent); - - // Create a ZMQSocket - MAKE_STD_ZVAL(this->internal_socket); - object_init_ex(this->internal_socket, php_zmq_socket_sc_entry); - zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(this->internal_socket TSRMLS_CC); - zmq_sock->socket = socket; - } - - *return_value = *(this->internal_socket); - zval_copy_ctor(return_value); + if (this->internal_socket == NULL) { + zyre_sock = zyre_socket(this->zyre); + if (zyre_socket == NULL) { + RETURN_NULL(); + } + + // Create internal socket + php_zmq_socket *socket = (php_zmq_socket *) emalloc(sizeof(php_zmq_socket)); + socket->z_socket = zyre_sock; + socket->ctx = this->shadow_context; + socket->pid = getpid(); + socket->is_persistent = is_persistent; + zend_hash_init(&(socket->connect), 0, NULL, NULL, is_persistent); + zend_hash_init(&(socket->bind), 0, NULL, NULL, is_persistent); + + // Create a ZMQSocket + MAKE_STD_ZVAL(this->internal_socket); + object_init_ex(this->internal_socket, php_zmq_socket_sc_entry); + zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(this->internal_socket TSRMLS_CC); + zmq_sock->socket = socket; + } + + *return_value = *(this->internal_socket); + zval_copy_ctor(return_value); } /* }}} */ @@ -1996,17 +1996,17 @@ ZEND_END_ARG_INFO() static zend_function_entry php_zmq_zyre_class_methods[] = { - PHP_ME(zmqzyre, __construct, zmqzyre___construct_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR | ZEND_ACC_FINAL) - PHP_ME(zmqzyre, setHeader, zmqzyre_setHeader_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, start, zmqzyre_start_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, stop, zmqzyre_stop_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, join, zmqzyre_join_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, leave, zmqzyre_leave_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, recv, zmqzyre_recv_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, sendPeer, zmqzyre_sendPeer_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, sendGroup, zmqzyre_sendGroup_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, getSocket, zmqzyre_getSocket_args, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + PHP_ME(zmqzyre, __construct, zmqzyre___construct_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR | ZEND_ACC_FINAL) + PHP_ME(zmqzyre, setHeader, zmqzyre_setHeader_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, start, zmqzyre_start_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, stop, zmqzyre_stop_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, join, zmqzyre_join_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, leave, zmqzyre_leave_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, recv, zmqzyre_recv_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, sendPeer, zmqzyre_sendPeer_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, sendGroup, zmqzyre_sendGroup_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, getSocket, zmqzyre_getSocket_args, ZEND_ACC_PUBLIC) + {NULL, NULL, NULL} }; /* --- END ZMQZyre --- */ @@ -2489,7 +2489,7 @@ PHP_MINIT_FUNCTION(zmq) zend_class_entry ce_exception, ce_context_exception, ce_socket_exception, ce_poll_exception, ce_device_exception; #ifdef HAVE_ZYRE_1 - zend_class_entry ce_zyre, ce_zyre_exception; + zend_class_entry ce_zyre, ce_zyre_exception; #endif le_zmq_context = zend_register_list_destructors_ex(NULL, php_zmq_context_dtor, "ZMQ persistent context", module_number); @@ -2502,7 +2502,7 @@ PHP_MINIT_FUNCTION(zmq) memcpy(&zmq_device_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); #ifdef HAVE_ZYRE_1 - memcpy(&zmq_zyre_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + memcpy(&zmq_zyre_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); #endif INIT_CLASS_ENTRY(ce, "ZMQ", php_zmq_class_methods); From 7bd6f6c4889347af9d08d5bcec0d500fc41980e0 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 10:07:34 +0200 Subject: [PATCH 08/40] add zend_parse_parameters_none where missing --- zmq.c | 72 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/zmq.c b/zmq.c index dd74cbd..920d3c9 100644 --- a/zmq.c +++ b/zmq.c @@ -43,7 +43,7 @@ zend_class_entry *php_zmq_device_sc_entry; #ifdef HAVE_ZYRE_1 zend_class_entry *php_zmq_zyre_sc_entry; #endif - + zend_class_entry *php_zmq_exception_sc_entry; zend_class_entry *php_zmq_context_exception_sc_entry; zend_class_entry *php_zmq_socket_exception_sc_entry; @@ -95,7 +95,7 @@ static int le_zmq_socket, le_zmq_context; /** {{{ static void php_zmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) */ -static void php_zmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) +static void php_zmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) { int major = 0, minor = 0, patch = 0; zmq_version(&major, &minor, &patch); @@ -105,7 +105,7 @@ static void php_zmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) /** {{{ static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) */ -static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) +static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) { (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", CZMQ_VERSION_MAJOR, CZMQ_VERSION_MINOR, CZMQ_VERSION_PATCH); } @@ -113,7 +113,7 @@ static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) /** {{{ static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) */ -static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) +static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) { (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", ZYRE_VERSION_MAJOR, ZYRE_VERSION_MINOR, ZYRE_VERSION_PATCH); } @@ -886,7 +886,7 @@ PHP_METHOD(zmqsocket, recvmulti) long flags = 0; zend_bool retval; zval *msg; -#if ZMQ_VERSION_MAJOR < 3 +#if ZMQ_VERSION_MAJOR < 3 int64_t value; #else int value; @@ -916,7 +916,7 @@ PHP_METHOD(zmqsocket, recvmulti) } /* }}} */ -/** {{{ string ZMQ::getPersistentId() +/** {{{ string ZMQ::getPersistentId() Returns the persistent id of the object */ PHP_METHOD(zmqsocket, getpersistentid) @@ -1618,7 +1618,7 @@ static void php_zmq_zyre_free_storage(void *object TSRMLS_DC) zend_objects_store_del_ref(zmq_zyre->internal_socket TSRMLS_CC); zval_ptr_dtor (&zmq_zyre->internal_socket); } - + zyre_destroy(&zmq_zyre->zyre); zctx_destroy(&zmq_zyre->shadow_context); @@ -1717,6 +1717,10 @@ PHP_METHOD(zmqzyre, start) { PHP_ZMQ_ZYRE_OBJECT; + if (zend_parse_parameters_none() == FAILURE) { + return; + } + zyre_start(this->zyre); ZMQ_RETURN_THIS; @@ -1734,6 +1738,10 @@ PHP_METHOD(zmqzyre, stop) { PHP_ZMQ_ZYRE_OBJECT; + if (zend_parse_parameters_none() == FAILURE) { + return; + } + zyre_stop(this->zyre); ZMQ_RETURN_THIS; @@ -1744,7 +1752,7 @@ ZEND_BEGIN_ARG_INFO_EX(zmqzyre_stop_args, 0, 0, 1) ZEND_END_ARG_INFO(); /* {{{ proto void ZMQZyre::join(string group) - Join a named group; after joining a group you can send messages + Join a named group; after joining a group you can send messages to the group and all Zyre nodes in that group will receive them. */ PHP_METHOD(zmqzyre, join) @@ -1799,7 +1807,7 @@ void zhash_to_object(const char *key, void *item, void *argument) } /* {{{ proto void ZMQZyre::recv() - Receive next message from network; the message may be a control + Receive next message from network; the message may be a control message (ENTER, EXIT, JOIN, LEAVE) or data (WHISPER, SHOUT). Returns associative array, or NULL if interrupted */ @@ -1808,14 +1816,18 @@ PHP_METHOD(zmqzyre, recv) PHP_ZMQ_ZYRE_OBJECT; zmsg_t *msg; char *command, *peerid; - + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + msg = zyre_recv(this->zyre); if (msg == NULL) { RETURN_NULL(); } - + object_init(return_value); - + command = zmsg_popstr(msg); peerid = zmsg_popstr(msg); @@ -1824,24 +1836,24 @@ PHP_METHOD(zmqzyre, recv) zframe_t *headers_packed = zmsg_pop (msg); char *ipaddress = zmsg_popstr(msg); - + if (headers_packed != NULL) { - + zhash_t *headers = zhash_unpack (headers_packed); zframe_destroy (&headers_packed); - + if (headers != NULL) { zval *h; MAKE_STD_ZVAL(h); object_init(h); - + zhash_foreach(headers, zhash_to_object, h); zhash_destroy(&headers); - + zend_update_property(NULL, return_value, "headers", strlen("headers"), h TSRMLS_CC); } } - + if (ipaddress != NULL) { zend_update_property_string(NULL, return_value, "ipaddress", strlen("ipaddress"), ipaddress TSRMLS_CC); free(ipaddress); @@ -1875,7 +1887,7 @@ PHP_METHOD(zmqzyre, recv) zend_update_property_string(NULL, return_value, "group", strlen("group"), group TSRMLS_CC); free(group); } - + char *data = zmsg_popstr(msg); if (data == NULL) { zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); @@ -1893,13 +1905,13 @@ PHP_METHOD(zmqzyre, recv) free(data); } } - + zend_update_property_string(NULL, return_value, "command", strlen("command"), command TSRMLS_CC); free(command); - + zend_update_property_string(NULL, return_value, "peer", strlen("peer"), peerid TSRMLS_CC); free(peerid); - + zmsg_destroy(&msg); } /* }}} */ @@ -1920,7 +1932,7 @@ PHP_METHOD(zmqzyre, sendGroup) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &group, &group_len, &data, &data_len) == FAILURE) { RETURN_FALSE; } - + zyre_shouts (this->zyre, group, data); RETURN_TRUE; @@ -1943,7 +1955,7 @@ PHP_METHOD(zmqzyre, sendPeer) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &peer, &peer_len, &data, &data_len) == FAILURE) { RETURN_FALSE; } - + zyre_whispers(this->zyre, peer, data); RETURN_TRUE; @@ -1964,6 +1976,10 @@ PHP_METHOD(zmqzyre, getSocket) void *zyre_sock = NULL; bool is_persistent = true; + if (zend_parse_parameters_none() == FAILURE) { + return; + } + if (this->internal_socket == NULL) { zyre_sock = zyre_socket(this->zyre); if (zyre_socket == NULL) { @@ -1985,7 +2001,7 @@ PHP_METHOD(zmqzyre, getSocket) zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(this->internal_socket TSRMLS_CC); zmq_sock->socket = socket; } - + *return_value = *(this->internal_socket); zval_copy_ctor(return_value); } @@ -2640,7 +2656,7 @@ PHP_MINIT_FUNCTION(zmq) php_zyre_get_lib_version(version); PHP_ZYRE_REGISTER_CONST_STRING("LIBZYRE_VERSION", version); - + #undef PHP_ZYRE_REGISTER_CONST_STRING return SUCCESS; @@ -2663,11 +2679,11 @@ PHP_MINFO_FUNCTION(zmq) char zmq[PHP_ZMQ_VERSION_LEN]; char czmq[PHP_ZMQ_VERSION_LEN]; char zyre[PHP_ZMQ_VERSION_LEN]; - + php_zmq_get_lib_version(zmq); php_czmq_get_lib_version(czmq); php_zyre_get_lib_version(zyre); - + php_info_print_table_start(); php_info_print_table_header(2, "ZMQ extension", "enabled"); From 574d4a087bbb2f709c828c442776d24a611993d3 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 10:11:46 +0200 Subject: [PATCH 09/40] Fix returns after zend_parse_parameters --- zmq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zmq.c b/zmq.c index 920d3c9..966ddb0 100644 --- a/zmq.c +++ b/zmq.c @@ -1930,7 +1930,7 @@ PHP_METHOD(zmqzyre, sendGroup) int rc; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &group, &group_len, &data, &data_len) == FAILURE) { - RETURN_FALSE; + return; } zyre_shouts (this->zyre, group, data); @@ -1953,7 +1953,7 @@ PHP_METHOD(zmqzyre, sendPeer) int data_len, peer_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &peer, &peer_len, &data, &data_len) == FAILURE) { - RETURN_FALSE; + return; } zyre_whispers(this->zyre, peer, data); From fa37d9b1e45d39cffa935a7288735c332dc14708 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 11:08:10 +0200 Subject: [PATCH 10/40] Use PHP_ZMQ_ZYRE_OBJECT to create this pointer --- zmq.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/zmq.c b/zmq.c index 966ddb0..572f781 100644 --- a/zmq.c +++ b/zmq.c @@ -1655,12 +1655,10 @@ static zend_object_value php_zmq_zyre_object_new(zend_class_entry *class_type TS */ PHP_METHOD(zmqzyre, __construct) { - php_zmq_zyre *this; + PHP_ZMQ_ZYRE_OBJECT; zval *object; php_zmq_context_object *context_object; - this = (php_zmq_zyre *) zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &object, php_zmq_context_sc_entry) != SUCCESS) { return; } From 0027747c7fc36af757963209b7b9f9b24d39390d Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 11:09:20 +0200 Subject: [PATCH 11/40] Ensure peer or groupe name are not empty --- zmq.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/zmq.c b/zmq.c index 572f781..a2e14ce 100644 --- a/zmq.c +++ b/zmq.c @@ -1931,6 +1931,10 @@ PHP_METHOD(zmqzyre, sendGroup) return; } + if (group_len == 0) { + RETURN_FALSE; + } + zyre_shouts (this->zyre, group, data); RETURN_TRUE; @@ -1953,6 +1957,10 @@ PHP_METHOD(zmqzyre, sendPeer) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &peer, &peer_len, &data, &data_len) == FAILURE) { return; } + + if (peer_len == 0) { + RETURN_FALSE; + } zyre_whispers(this->zyre, peer, data); From cfabf10875d08b7d0bb6489c83bdb3eaf4f43ebc Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 11:10:28 +0200 Subject: [PATCH 12/40] Check for null pointers --- zmq.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/zmq.c b/zmq.c index a2e14ce..a55d7af 100644 --- a/zmq.c +++ b/zmq.c @@ -1813,7 +1813,7 @@ PHP_METHOD(zmqzyre, recv) { PHP_ZMQ_ZYRE_OBJECT; zmsg_t *msg; - char *command, *peerid; + char *command = NULL, *peerid = NULL; if (zend_parse_parameters_none() == FAILURE) { return; @@ -1826,9 +1826,18 @@ PHP_METHOD(zmqzyre, recv) object_init(return_value); + // All frame start by a command command = zmsg_popstr(msg); + if (command == NULL) { + RETURN_NULL(); + } + + // 2nd parameter is always the peerid of the emiter peerid = zmsg_popstr(msg); - + if (peerid == NULL) { + RETURN_NULL(); + } + // Parse commands with additional content if (strcmp(command, "ENTER") == 0) { From 5d7420637d3a1337991611817e46d8012751165d Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 11:22:22 +0200 Subject: [PATCH 13/40] Set persistent_id to NULL --- zmq.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zmq.c b/zmq.c index a55d7af..de8e430 100644 --- a/zmq.c +++ b/zmq.c @@ -2002,7 +2002,10 @@ PHP_METHOD(zmqzyre, getSocket) } // Create internal socket - php_zmq_socket *socket = (php_zmq_socket *) emalloc(sizeof(php_zmq_socket)); + php_zmq_socket *socket = (php_zmq_socket *) ecalloc(1, sizeof(php_zmq_socket)); + if (socket == NULL) { + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Memory allocation fail"); + } socket->z_socket = zyre_sock; socket->ctx = this->shadow_context; socket->pid = getpid(); @@ -2015,6 +2018,7 @@ PHP_METHOD(zmqzyre, getSocket) object_init_ex(this->internal_socket, php_zmq_socket_sc_entry); zmq_sock = (php_zmq_socket_object *) zend_object_store_get_object(this->internal_socket TSRMLS_CC); zmq_sock->socket = socket; + zmq_sock->persistent_id = NULL; } *return_value = *(this->internal_socket); From 64d6cd17a178ac42e21bf784491e357dbb3456e7 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 11:50:29 +0200 Subject: [PATCH 14/40] Add test of using ZMQPoll with ZMQZyre --- tests/zyre-006.phpt | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tests/zyre-006.phpt diff --git a/tests/zyre-006.phpt b/tests/zyre-006.phpt new file mode 100644 index 0000000..55862d7 --- /dev/null +++ b/tests/zyre-006.phpt @@ -0,0 +1,62 @@ +--TEST-- +Test [Zyre] Use ZMQSocket, build by ZMQZyre::getSocket, in a ZMQPoll +--SKIPIF-- + +--FILE-- +start(); +$z1->join('ZMQZyreTestGroup'); + +usleep(100000); + +$z2 = new ZMQZyre($ctx); +$z2->start(); +$z2->join('ZMQZyreTestGroup'); + +usleep(100000); + +$z1->sendGroup('ZMQZyreTestGroup', 'A'); +$z1->sendGroup('ZMQZyreTestGroup', 'B'); + +$poll = new ZMQPoll; +$poll->add($z2->getSocket(), ZMQ::POLL_IN); + +$readable = array(); +$writable = array(); + +for ($i=0; $i<4; $i++) { +try { + $events = $poll->poll($readable, $writable, -1); + $errors = $poll->getLastErrors(); + + if (count($errors) > 0) { + foreach ($errors as $error) { + echo "Error polling object " . $error . "\n"; + } + die('polling error'); + } + } catch (ZMQPollException $e) { + echo "poll failed: " . $e->getMessage() . "\n"; + die('polling exception'); + } + + if ($events > 0) { + /* Loop through readable objects and recv messages */ + foreach ($readable as $r) { + // Don't read the Socket use the recv function of zyre + // Socket will return a multi-part zmq message, instead zyre will parse it and produce an abject + $obj = $z2->recv(); + var_dump($obj->command); + } + } +} +--EXPECTF-- +string(5) "ENTER" +string(4) "JOIN" +string(5) "SHOUT" +string(5) "SHOUT" + From c4be910ffe2200d56037f6d99c22729ee07c692f Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 12:06:53 +0200 Subject: [PATCH 15/40] Add zyre tests file in the package.xml --- package.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/package.xml b/package.xml index 7658a5d..06caa64 100644 --- a/package.xml +++ b/package.xml @@ -98,6 +98,15 @@ + + + + + + + + + From 7a2297f05581596188106b9521f6e61207fcef43 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 3 Jul 2014 12:10:50 +0200 Subject: [PATCH 16/40] Use correct filename... need a break ;) --- package.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.xml b/package.xml index 06caa64..d994cf0 100644 --- a/package.xml +++ b/package.xml @@ -101,12 +101,12 @@ - - - - - - + + + + + + From 05c5c8d61b1a416ab742a05499e2eb01500dc604 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 8 Jul 2014 15:27:11 +0200 Subject: [PATCH 17/40] Throw exception, if group name or peer id are empty --- zmq.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/zmq.c b/zmq.c index de8e430..6c95627 100644 --- a/zmq.c +++ b/zmq.c @@ -1696,6 +1696,14 @@ PHP_METHOD(zmqzyre, setHeader) return; } + if (name_len == 0) { + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Header name can not be empty"); + } + + if (value_len == 0) { + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Header value can not be empty"); + } + zyre_set_header(this->zyre, name, value); ZMQ_RETURN_THIS; @@ -1763,6 +1771,10 @@ PHP_METHOD(zmqzyre, join) return; } + if (group_len == 0) { + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Group name can not be empty"); + } + zyre_join(this->zyre, group); ZMQ_RETURN_THIS; @@ -1786,6 +1798,10 @@ PHP_METHOD(zmqzyre, leave) return; } + if (group_len == 0) { + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Group name can not be empty"); + } + zyre_leave(this->zyre, group); ZMQ_RETURN_THIS; @@ -1941,12 +1957,12 @@ PHP_METHOD(zmqzyre, sendGroup) } if (group_len == 0) { - RETURN_FALSE; + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Group name can not be empty"); } zyre_shouts (this->zyre, group, data); - RETURN_TRUE; + ZMQ_RETURN_THIS; } ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendGroup_args, 0, 0, 2) @@ -1968,12 +1984,12 @@ PHP_METHOD(zmqzyre, sendPeer) } if (peer_len == 0) { - RETURN_FALSE; + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Peer ID can not be empty"); } zyre_whispers(this->zyre, peer, data); - RETURN_TRUE; + ZMQ_RETURN_THIS; } ZEND_BEGIN_ARG_INFO_EX(zmqzyre_sendPeer_args, 0, 0, 2) From 89a391138e9686d59377e22efc118491b75f9cda Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 8 Jul 2014 15:28:51 +0200 Subject: [PATCH 18/40] ecalloc, do not need null check --- zmq.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/zmq.c b/zmq.c index 6c95627..14b8982 100644 --- a/zmq.c +++ b/zmq.c @@ -2019,9 +2019,6 @@ PHP_METHOD(zmqzyre, getSocket) // Create internal socket php_zmq_socket *socket = (php_zmq_socket *) ecalloc(1, sizeof(php_zmq_socket)); - if (socket == NULL) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Memory allocation fail"); - } socket->z_socket = zyre_sock; socket->ctx = this->shadow_context; socket->pid = getpid(); From 0955820ccfd227eeb2f2d241476e6938584574a1 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 8 Jul 2014 15:38:32 +0200 Subject: [PATCH 19/40] Fix memory leak --- zmq.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/zmq.c b/zmq.c index 14b8982..9f98532 100644 --- a/zmq.c +++ b/zmq.c @@ -1828,7 +1828,7 @@ void zhash_to_object(const char *key, void *item, void *argument) PHP_METHOD(zmqzyre, recv) { PHP_ZMQ_ZYRE_OBJECT; - zmsg_t *msg; + zmsg_t *msg = NULL; char *command = NULL, *peerid = NULL; if (zend_parse_parameters_none() == FAILURE) { @@ -1842,16 +1842,16 @@ PHP_METHOD(zmqzyre, recv) object_init(return_value); - // All frame start by a command + // All frame start by a command command = zmsg_popstr(msg); if (command == NULL) { - RETURN_NULL(); + goto cleanup; } // 2nd parameter is always the peerid of the emiter peerid = zmsg_popstr(msg); if (peerid == NULL) { - RETURN_NULL(); + goto cleanup; } // Parse commands with additional content @@ -1930,12 +1930,17 @@ PHP_METHOD(zmqzyre, recv) } zend_update_property_string(NULL, return_value, "command", strlen("command"), command TSRMLS_CC); - free(command); - zend_update_property_string(NULL, return_value, "peer", strlen("peer"), peerid TSRMLS_CC); - free(peerid); - zmsg_destroy(&msg); +cleanup: + if (command != NULL) + free(command); + + if (peerid != NULL) + free(peerid); + + if (msg != NULL) + zmsg_destroy(&msg); } /* }}} */ From 40ed1b50ef680d5143d4ec191c2202b1fd5de2da Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 16 Jul 2014 17:14:25 +0200 Subject: [PATCH 20/40] Use zsys_version to find libczmq version at execution Add return after zend_throw_exception_ex Remove errno use in zend_throw_exception_ex Remove inline variable declaration --- zmq.c | 73 +++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/zmq.c b/zmq.c index 9f98532..9969d8b 100644 --- a/zmq.c +++ b/zmq.c @@ -107,7 +107,9 @@ static void php_zmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) */ static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) { - (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", CZMQ_VERSION_MAJOR, CZMQ_VERSION_MINOR, CZMQ_VERSION_PATCH); + int major = 0, minor = 0, patch = 0; + zsys_version(&major, &minor, &patch); + (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", major, minor, patch); } /* }}} */ @@ -1619,8 +1621,13 @@ static void php_zmq_zyre_free_storage(void *object TSRMLS_DC) zval_ptr_dtor (&zmq_zyre->internal_socket); } - zyre_destroy(&zmq_zyre->zyre); - zctx_destroy(&zmq_zyre->shadow_context); + if (zmq_zyre->zyre != NULL) { + zyre_destroy(&zmq_zyre->zyre); + } + + if (zmq_zyre->shadow_context != NULL) { + zctx_destroy(&zmq_zyre->shadow_context); + } zend_object_std_dtor(&zmq_zyre->zend_object TSRMLS_CC); efree(zmq_zyre); @@ -1667,12 +1674,14 @@ PHP_METHOD(zmqzyre, __construct) this->shadow_context = zctx_shadow_zmq_ctx(context_object->context->z_ctx); if (this->shadow_context == NULL) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Failed to create the underlying shadow context object."); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Failed to create the underlying shadow context object."); + return; } this->zyre = zyre_new(this->shadow_context); if (this->zyre == NULL) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Failed to create the underlying zbeacon object."); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Failed to create the underlying zbeacon object."); + return; } return; @@ -1697,11 +1706,13 @@ PHP_METHOD(zmqzyre, setHeader) } if (name_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Header name can not be empty"); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Header name can not be empty"); + return; } if (value_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Header value can not be empty"); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Header value can not be empty"); + return; } zyre_set_header(this->zyre, name, value); @@ -1772,7 +1783,8 @@ PHP_METHOD(zmqzyre, join) } if (group_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Group name can not be empty"); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); + return; } zyre_join(this->zyre, group); @@ -1799,7 +1811,8 @@ PHP_METHOD(zmqzyre, leave) } if (group_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Group name can not be empty"); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); + return; } zyre_leave(this->zyre, group); @@ -1885,7 +1898,9 @@ PHP_METHOD(zmqzyre, recv) } } else if (strcmp(command, "JOIN") == 0) { - char *group = zmsg_popstr(msg); + char *group; + + group = zmsg_popstr(msg); if (group == NULL) { zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); } else { @@ -1894,7 +1909,9 @@ PHP_METHOD(zmqzyre, recv) } } else if (strcmp(command, "LEAVE") == 0) { - char *group = zmsg_popstr(msg); + char *group; + + group = zmsg_popstr(msg); if (group == NULL) { zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); } else { @@ -1903,7 +1920,9 @@ PHP_METHOD(zmqzyre, recv) } } else if (strcmp(command, "SHOUT") == 0) { - char *group = zmsg_popstr(msg); + char *group, *data; + + group = zmsg_popstr(msg); if (group == NULL) { zend_update_property_null(NULL, return_value, "group", strlen("group") TSRMLS_CC); } else { @@ -1911,7 +1930,7 @@ PHP_METHOD(zmqzyre, recv) free(group); } - char *data = zmsg_popstr(msg); + data = zmsg_popstr(msg); if (data == NULL) { zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); } else { @@ -1920,7 +1939,9 @@ PHP_METHOD(zmqzyre, recv) } } else if (strcmp(command, "WHISPER") == 0) { - char *data = zmsg_popstr(msg); + char *data; + + data = zmsg_popstr(msg); if (data == NULL) { zend_update_property_null(NULL, return_value, "data", strlen("data") TSRMLS_CC); } else { @@ -1962,7 +1983,8 @@ PHP_METHOD(zmqzyre, sendGroup) } if (group_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Group name can not be empty"); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); + return; } zyre_shouts (this->zyre, group, data); @@ -1989,7 +2011,8 @@ PHP_METHOD(zmqzyre, sendPeer) } if (peer_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, errno TSRMLS_CC, "Peer ID can not be empty"); + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Peer ID can not be empty"); + return; } zyre_whispers(this->zyre, peer, data); @@ -2713,21 +2736,21 @@ PHP_MSHUTDOWN_FUNCTION(zmq) PHP_MINFO_FUNCTION(zmq) { - char zmq[PHP_ZMQ_VERSION_LEN]; - char czmq[PHP_ZMQ_VERSION_LEN]; - char zyre[PHP_ZMQ_VERSION_LEN]; + char zmq_version[PHP_ZMQ_VERSION_LEN]; + char czmq_version[PHP_ZMQ_VERSION_LEN]; + char zyre_version[PHP_ZMQ_VERSION_LEN]; - php_zmq_get_lib_version(zmq); - php_czmq_get_lib_version(czmq); - php_zyre_get_lib_version(zyre); + php_zmq_get_lib_version(zmq_version); + php_czmq_get_lib_version(czmq_version); + php_zyre_get_lib_version(zyre_version); php_info_print_table_start(); php_info_print_table_header(2, "ZMQ extension", "enabled"); php_info_print_table_row(2, "ZMQ extension version", PHP_ZMQ_VERSION); - php_info_print_table_row(2, "libzmq version", zmq); - php_info_print_table_row(2, "czmq version", czmq); - php_info_print_table_row(2, "libzyre version", zyre); + php_info_print_table_row(2, "libzmq version", zmq_version); + php_info_print_table_row(2, "czmq version", czmq_version); + php_info_print_table_row(2, "libzyre version", zyre_version); php_info_print_table_end(); DISPLAY_INI_ENTRIES(); From 2d5e18c1a30761fcc4ff80506ad2b6fea0d4e692 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 16 Jul 2014 17:14:34 +0200 Subject: [PATCH 21/40] Add gitignore --- .gitignore | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f1bf8f --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +*~ +*.lo +*.la + +build/ +.libs/ +autom4te.cache/ +modules/ + +tests/*.diff +tests/*.exp +tests/*.log +tests/*.out +tests/*.php +tests/*.sh + +Makefile* +configure* +libtool +ltmain.sh +missing +mkinstalldirs +install-sh +aclocal.m4 +acinclude.m4 +.deps + +config* +!config.m4 +!config.w32 + From db1245495beb06a1bec8fb466f48bbffef6e6989 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 16 Jul 2014 18:56:24 +0200 Subject: [PATCH 22/40] Display the CZMQ & Zyre librairy version, only if detected by configure script --- zmq.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/zmq.c b/zmq.c index 9969d8b..8b852bb 100644 --- a/zmq.c +++ b/zmq.c @@ -103,16 +103,19 @@ static void php_zmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) } /* }}} */ +#ifdef HAVE_CZMQ /** {{{ static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) */ static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) { int major = 0, minor = 0, patch = 0; zsys_version(&major, &minor, &patch); - (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", major, minor, patch); + (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", major, minor, patch); } /* }}} */ +#endif +#ifdef HAVE_ZYRE /** {{{ static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) */ static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) @@ -120,6 +123,7 @@ static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", ZYRE_VERSION_MAJOR, ZYRE_VERSION_MINOR, ZYRE_VERSION_PATCH); } /* }}} */ +#endif /** {{{ static int php_zmq_socket_list_entry(void) */ @@ -2737,20 +2741,32 @@ PHP_MSHUTDOWN_FUNCTION(zmq) PHP_MINFO_FUNCTION(zmq) { char zmq_version[PHP_ZMQ_VERSION_LEN]; +#ifdef HAVE_CZMQ char czmq_version[PHP_ZMQ_VERSION_LEN]; +#endif +#ifdef HAVE_ZYRE char zyre_version[PHP_ZMQ_VERSION_LEN]; +#endif php_zmq_get_lib_version(zmq_version); +#ifdef HAVE_CZMQ php_czmq_get_lib_version(czmq_version); +#endif +#ifdef HAVE_ZYRE php_zyre_get_lib_version(zyre_version); +#endif php_info_print_table_start(); php_info_print_table_header(2, "ZMQ extension", "enabled"); php_info_print_table_row(2, "ZMQ extension version", PHP_ZMQ_VERSION); php_info_print_table_row(2, "libzmq version", zmq_version); +#ifdef HAVE_CZMQ php_info_print_table_row(2, "czmq version", czmq_version); +#endif +#ifdef HAVE_ZYRE php_info_print_table_row(2, "libzyre version", zyre_version); +#endif php_info_print_table_end(); DISPLAY_INI_ENTRIES(); From 2c2e5640e028e76d0c227d567a7046a470aabf24 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Thu, 17 Jul 2014 08:33:44 +0200 Subject: [PATCH 23/40] Fix build if zyre is not available --- zmq.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zmq.c b/zmq.c index 8b852bb..79c8184 100644 --- a/zmq.c +++ b/zmq.c @@ -2715,6 +2715,7 @@ PHP_MINIT_FUNCTION(zmq) #undef PHP_ZMQ_REGISTER_CONST_LONG #undef PHP_ZMQ_REGISTER_CONST_STRING +#ifdef HAVE_ZYRE_1 #define PHP_ZYRE_REGISTER_CONST_STRING(const_name, value) \ zend_declare_class_constant_string (php_zmq_zyre_sc_entry, const_name, sizeof(const_name)-1, value TSRMLS_CC); @@ -2722,7 +2723,7 @@ PHP_MINIT_FUNCTION(zmq) PHP_ZYRE_REGISTER_CONST_STRING("LIBZYRE_VERSION", version); #undef PHP_ZYRE_REGISTER_CONST_STRING - +#endif return SUCCESS; } From 104e90861e5600895844dd58f831b2a188244811 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 10:13:15 +0200 Subject: [PATCH 24/40] Add install from bianary repo of czmq & zyre --- .travis.yml | 11 +++++- travis/script.sh | 96 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 92 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3fbb599..a280900 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,10 @@ language: php + php: - 5.5 - 5.4 - 5.3 + env: - ZEROMQ_VERSION=v2.2.0 - ZEROMQ_VERSION=v3.1.0 @@ -13,7 +15,14 @@ env: - ZEROMQ_VERSION=v3.2.4 - ZEROMQ_VERSION=v4.0.0 - ZEROMQ_VERSION=v4.0.1 + - ZEROMQ_VERSION=v4.0.1 + - ZEROMQ_VERSION=v4.0.1 CZMQ_VERSION=2.2.0 ZYRE_VERSION=1.0.0 + before_install: - sudo apt-get update - sudo apt-get install uuid-dev -script: travis/script.sh $ZEROMQ_VERSION + - sudo su -c "echo '/tmp/zeromq/lib' > /etc/ld.so.conf.d/zmq-travis.conf" + - sudo su -c "echo '/tmp/czmq/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" + - sudo su -c "echo '/tmp/zyre/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" + +script: travis/script.sh $ZEROMQ_VERSION $CZMQ_VERSION $ZYRE_VERSION diff --git a/travis/script.sh b/travis/script.sh index 9753d54..c742306 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -1,5 +1,23 @@ #!/bin/bash +# NOTE (phuedx, 2014/07/07): This must be kept in sync with the prefix used in +# configure command used to build ØMQ in phuedx/php-zmq-travis-support. +zeromq_dir=/tmp/zeromq +czmq_dir=/tmp/czmq +zyre_dir=/tmp/zyre +# + +build_dir=/tmp/build +binary_repository_local_path=/tmp/php-zmq-travis-support +binary_repository_git_url=https://github.com/phuedx/php-zmq-travis-support + +# Clone a repository with prebuild version of zmq, czmq, and zyre. +init_binary_repo() { + if test ! -d "$binary_repository_local_path" + then + git clone $binary_repository_git_url $binary_repository_local_path + fi +} # Installs the specified version of ØMQ. # @@ -11,18 +29,15 @@ install_zeromq() { local zeromq_version=$1 local zeromq_dir=$2 - if test ! -d "/tmp/php-zmq-travis-support" + # Try to install from precompiled + if test -d "$binary_repository_local_path/zeromq/zeromq-${zeromq_version}" then - git clone https://github.com/phuedx/php-zmq-travis-support /tmp/php-zmq-travis-support - fi - - if test -d "/tmp/php-zmq-travis-support/zeromq/zeromq-${zeromq_version}" - then - ln -s "/tmp/php-zmq-travis-support/zeromq/zeromq-${zeromq_version}" $zeromq_dir - + ln -s "$binary_repository_local_path/zeromq/zeromq-${zeromq_version}" $zeromq_dir + sudo ldconfig return fi + # Install from source case $zeromq_version in v2.2.0) wget http://download.zeromq.org/zeromq-2.2.0.tar.gz @@ -44,10 +59,55 @@ install_zeromq() { ./configure --prefix=$zeromq_dir make -j 8 sudo make install + sudo ldconfig cd .. } +# Installs czmq +# +# Parameters: +# +# 1 - The version of CZMQ to install, in the form "x.y.z" +# 2 - The directory to install CZMQ to +install_czmq() { + local czmq_version=$1 + local czmq_dir=$2 + + # Try to install from precompiled + if test -d "$binary_repository_local_path/czmq/czmq-${czmq_version}" + then + ln -s "$binary_repository_local_path/czmq/czmq-${czmq_version}" $czmq_dir + sudo ldconfig + return + fi + + # Install from source + printf "CZMQ install from source not supported, yet\n" + exit 1 +} +# Installs zyre +# +# Parameters: +# +# 1 - The version of CZMQ to install, in the form "x.y.z" +# 2 - The directory to install CZMQ to +install_zyre() { + local zyre_version=$1 + local zyre_dir=$2 + + # Try to install from precompiled + if test -d "$binary_repository_local_path/zyre/zyre-${zyre_version}" + then + ln -s "$binary_repository_local_path/zyre/zyre-${zyre_version}" $zyre_dir + sudo ldconfig + return + fi + + # Install from source + printf "Zyre install from source not supported, yet\n" + exit 1 +} # Ensures that the build directory exists and contains the extension and its # tests by packaging and then extracting it to the build directory. # @@ -120,15 +180,23 @@ for test_file in tests/*.phpt; do fi done +# Get precompiled libs to speedup install +init_binary_repo + zeromq_version=$1 +install_zeromq $zeromq_version $zeromq_dir -# NOTE (phuedx, 2014/07/07): This must be kept in sync with the configure -# command used to build ØMQ in phuedx/php-zmq-travis-support. -zeromq_dir=/tmp/zeromq +if test "$#" -ge 2 +then + czmq_version=$2 + install_czmq $czmq_version $czmq_dir +fi -build_dir=/tmp/build +if test "$#" -ge 3 +then + zyre_version=$3 + install_zyre $zyre_version $zyre_dir +fi -install_zeromq $zeromq_version $zeromq_dir init_build_dir $build_dir - make_test $build_dir $zeromq_dir From bb5f512196c452e1b0a85f462f20ad07a1251b81 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 10:34:51 +0200 Subject: [PATCH 25/40] Reduce travis test matrix for test, will be revert --- .travis.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index a280900..01693c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,20 +2,8 @@ language: php php: - 5.5 - - 5.4 - - 5.3 env: - - ZEROMQ_VERSION=v2.2.0 - - ZEROMQ_VERSION=v3.1.0 - - ZEROMQ_VERSION=v3.2.0 - - ZEROMQ_VERSION=v3.2.1 - - ZEROMQ_VERSION=v3.2.2 - - ZEROMQ_VERSION=v3.2.3 - - ZEROMQ_VERSION=v3.2.4 - - ZEROMQ_VERSION=v4.0.0 - - ZEROMQ_VERSION=v4.0.1 - - ZEROMQ_VERSION=v4.0.1 - ZEROMQ_VERSION=v4.0.1 CZMQ_VERSION=2.2.0 ZYRE_VERSION=1.0.0 before_install: From b087ddb02bea8fe267de849327be050e1e0d0935 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 10:35:21 +0200 Subject: [PATCH 26/40] be verbose on link creation for travis log --- travis/script.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/travis/script.sh b/travis/script.sh index c742306..a74ea62 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -32,7 +32,7 @@ install_zeromq() { # Try to install from precompiled if test -d "$binary_repository_local_path/zeromq/zeromq-${zeromq_version}" then - ln -s "$binary_repository_local_path/zeromq/zeromq-${zeromq_version}" $zeromq_dir + ln -sv "$binary_repository_local_path/zeromq/zeromq-${zeromq_version}" $zeromq_dir sudo ldconfig return fi @@ -76,7 +76,7 @@ install_czmq() { # Try to install from precompiled if test -d "$binary_repository_local_path/czmq/czmq-${czmq_version}" then - ln -s "$binary_repository_local_path/czmq/czmq-${czmq_version}" $czmq_dir + ln -sv "$binary_repository_local_path/czmq/czmq-${czmq_version}" $czmq_dir sudo ldconfig return fi @@ -99,7 +99,7 @@ install_zyre() { # Try to install from precompiled if test -d "$binary_repository_local_path/zyre/zyre-${zyre_version}" then - ln -s "$binary_repository_local_path/zyre/zyre-${zyre_version}" $zyre_dir + ln -sv "$binary_repository_local_path/zyre/zyre-${zyre_version}" $zyre_dir sudo ldconfig return fi @@ -121,7 +121,7 @@ init_build_dir() { pear package tar xfz "zmq-${php_zmq_version}.tgz" -C /tmp - ln -s "/tmp/zmq-${php_zmq_version}" $build_dir + ln -sv "/tmp/zmq-${php_zmq_version}" $build_dir } From 0ec97911fcce52541e4bc742cbeb71e721b41e48 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 10:46:19 +0200 Subject: [PATCH 27/40] configure PKG_CONFIG_PATH in travis bootstrap --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 01693c0..463cea9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,5 +12,6 @@ before_install: - sudo su -c "echo '/tmp/zeromq/lib' > /etc/ld.so.conf.d/zmq-travis.conf" - sudo su -c "echo '/tmp/czmq/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" - sudo su -c "echo '/tmp/zyre/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" + - sudo su -c "echo 'export PKG_CONFIG_PATH="/tmp/zeromq/lib/pkgconfig:/tmp/czmq/lib/pkgconfig:/tmp/zyre/lib/pkgconfig' >> /etc/profile" script: travis/script.sh $ZEROMQ_VERSION $CZMQ_VERSION $ZYRE_VERSION From c4b9fc2e4aa288cce49d4e1788d9714fbb5716a4 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 10:50:51 +0200 Subject: [PATCH 28/40] typo --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 463cea9..472ab0b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,6 @@ before_install: - sudo su -c "echo '/tmp/zeromq/lib' > /etc/ld.so.conf.d/zmq-travis.conf" - sudo su -c "echo '/tmp/czmq/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" - sudo su -c "echo '/tmp/zyre/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" - - sudo su -c "echo 'export PKG_CONFIG_PATH="/tmp/zeromq/lib/pkgconfig:/tmp/czmq/lib/pkgconfig:/tmp/zyre/lib/pkgconfig' >> /etc/profile" + - sudo su -c "echo 'export PKG_CONFIG_PATH=/tmp/zeromq/lib/pkgconfig:/tmp/czmq/lib/pkgconfig:/tmp/zyre/lib/pkgconfig' >> /etc/profile" script: travis/script.sh $ZEROMQ_VERSION $CZMQ_VERSION $ZYRE_VERSION From 05f8a3f16812380f0410c8798f2e4edbb222c519 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 11:24:19 +0200 Subject: [PATCH 29/40] Try direct export, configure script do not detect czmq/zyre --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 472ab0b..d78174a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,6 @@ before_install: - sudo su -c "echo '/tmp/zeromq/lib' > /etc/ld.so.conf.d/zmq-travis.conf" - sudo su -c "echo '/tmp/czmq/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" - sudo su -c "echo '/tmp/zyre/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" - - sudo su -c "echo 'export PKG_CONFIG_PATH=/tmp/zeromq/lib/pkgconfig:/tmp/czmq/lib/pkgconfig:/tmp/zyre/lib/pkgconfig' >> /etc/profile" + - export PKG_CONFIG_PATH="/tmp/zeromq/lib/pkgconfig:/tmp/czmq/lib/pkgconfig:/tmp/zyre/lib/pkgconfig" script: travis/script.sh $ZEROMQ_VERSION $CZMQ_VERSION $ZYRE_VERSION From 1f220e182fd66d9f2e48593b0f68916a7f2ff6c7 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 11:30:39 +0200 Subject: [PATCH 30/40] add debugs --- travis/script.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/travis/script.sh b/travis/script.sh index a74ea62..21d0e16 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -199,4 +199,9 @@ then fi init_build_dir $build_dir + +# Some verbose debug about libs +pkg-config --list-all +sudo ldconfig -v + make_test $build_dir $zeromq_dir From cfcc299a2b1037e7eb499ec8ff7da190818bdccd Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 11:47:08 +0200 Subject: [PATCH 31/40] Test autodetection of libzmq in configure script --- travis/script.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/travis/script.sh b/travis/script.sh index 21d0e16..4118635 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -143,7 +143,7 @@ make_test() { pushd $build_dir phpize - ./configure --with-zmq="$zeromq_dir" + ./configure #--with-zmq="$zeromq_dir" make NO_INTERACTION=1 \ @@ -201,7 +201,9 @@ fi init_build_dir $build_dir # Some verbose debug about libs -pkg-config --list-all -sudo ldconfig -v +printf "Verbose ZMQ stuff from pkg-config\n" +pkg-config --list-all | egrep "(zmq|zyre)" +printf "Verbose ZMQ stuff from ldconfig\n" +ldconfig -p | egrep "(zmq|zyre)" make_test $build_dir $zeromq_dir From 1a188272e1c552e453bd83afe0aa30ec0b574cdd Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 12:04:44 +0200 Subject: [PATCH 32/40] Ensure the php extension build is OK, before running test Avoid travis output OK, if the project do not build --- travis/script.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/travis/script.sh b/travis/script.sh index 4118635..a89ef80 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -143,9 +143,15 @@ make_test() { pushd $build_dir phpize - ./configure #--with-zmq="$zeromq_dir" + ./configure make + if test ! -e modules/zmq.so + then + printf "PHP extension build failed\n" + exit 1 + fi + NO_INTERACTION=1 \ REPORT_EXIT_STATUS=1 \ TEST_PHP_EXECUTABLE=$(which php) \ From 6a96e403921283216b9e07ea513c08e53b848241 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 16:01:40 +0200 Subject: [PATCH 33/40] Pass TSRMLS_C into zhash_foreach callback --- zmq.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/zmq.c b/zmq.c index 79c8184..a76a585 100644 --- a/zmq.c +++ b/zmq.c @@ -1831,9 +1831,13 @@ ZEND_END_ARG_INFO(); // Helper function to convert zhash_t to php object -void zhash_to_object(const char *key, void *item, void *argument) +void zhash_to_object(const char *key, void *item, void **argument) { - zval *obj = (zval *)argument; + zval *obj = (zval *)argument[0]; +#ifdef ZTS + TSRMLS_D = argument[1]; +#endif + zend_update_property_string(NULL, obj, key, strlen(key), (char *)item TSRMLS_CC); } @@ -1887,7 +1891,12 @@ PHP_METHOD(zmqzyre, recv) MAKE_STD_ZVAL(h); object_init(h); - zhash_foreach(headers, zhash_to_object, h); + void *args[2]; + args[0] = h; +#ifdef ZTS + args[1] = TSRMLS_C; +#endif + zhash_foreach(headers, zhash_to_object, args); zhash_destroy(&headers); zend_update_property(NULL, return_value, "headers", strlen("headers"), h TSRMLS_CC); From 45190b8c422b9445ef9d161c965a52e16004f399 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 16:17:10 +0200 Subject: [PATCH 34/40] Remove pre-installed version of zmq by travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index d78174a..56b2dd9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ env: before_install: - sudo apt-get update + - sudo apt-get remove libzmq3-dev libzmq3 - sudo apt-get install uuid-dev - sudo su -c "echo '/tmp/zeromq/lib' > /etc/ld.so.conf.d/zmq-travis.conf" - sudo su -c "echo '/tmp/czmq/lib' >> /etc/ld.so.conf.d/zmq-travis.conf" From c99745fb0b58f7b2b60677e9c017a75cf5612a6c Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Tue, 22 Jul 2014 16:39:12 +0200 Subject: [PATCH 35/40] Be more verbose on pkg-config --- travis/script.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/travis/script.sh b/travis/script.sh index a89ef80..4820959 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -209,6 +209,9 @@ init_build_dir $build_dir # Some verbose debug about libs printf "Verbose ZMQ stuff from pkg-config\n" pkg-config --list-all | egrep "(zmq|zyre)" +pkg-config --libs --cflags libzmq +pkg-config --libs --cflags libczmq +pkg-config --libs --cflags libzyre printf "Verbose ZMQ stuff from ldconfig\n" ldconfig -p | egrep "(zmq|zyre)" From 141ff43cad13faed17fcd93429300622eb78b29e Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 23 Jul 2014 09:06:18 +0200 Subject: [PATCH 36/40] Restore with-zmq option on configure --- travis/script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis/script.sh b/travis/script.sh index 4820959..1054f1b 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -143,7 +143,7 @@ make_test() { pushd $build_dir phpize - ./configure + ./configure --with-zmq="$zeromq_dir" make if test ! -e modules/zmq.so From af91e6ad5df6c9c45a5672f395b77b436f03eebb Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 23 Jul 2014 09:43:53 +0200 Subject: [PATCH 37/40] Test build from source for czmq/zyre ibs with the same prefix as zmq libs --- travis/script.sh | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/travis/script.sh b/travis/script.sh index 1054f1b..d504afc 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -74,16 +74,24 @@ install_czmq() { local czmq_dir=$2 # Try to install from precompiled - if test -d "$binary_repository_local_path/czmq/czmq-${czmq_version}" - then - ln -sv "$binary_repository_local_path/czmq/czmq-${czmq_version}" $czmq_dir - sudo ldconfig - return - fi + # if test -d "$binary_repository_local_path/czmq/czmq-${czmq_version}" + # then + # ln -sv "$binary_repository_local_path/czmq/czmq-${czmq_version}" $czmq_dir + # sudo ldconfig + # return + # fi # Install from source - printf "CZMQ install from source not supported, yet\n" - exit 1 + git clone https://github.com/zeromq/czmq + cd czmq + git checkout "tags/v${czmq_version}" + + ./autogen.sh + ./configure --prefix=$zeromq_dir + make -j 8 + sudo make install + sudo ldconfig + cd .. } # Installs zyre @@ -97,16 +105,24 @@ install_zyre() { local zyre_dir=$2 # Try to install from precompiled - if test -d "$binary_repository_local_path/zyre/zyre-${zyre_version}" - then - ln -sv "$binary_repository_local_path/zyre/zyre-${zyre_version}" $zyre_dir - sudo ldconfig - return - fi + # if test -d "$binary_repository_local_path/zyre/zyre-${zyre_version}" + # then + # ln -sv "$binary_repository_local_path/zyre/zyre-${zyre_version}" $zyre_dir + # sudo ldconfig + # return + # fi # Install from source - printf "Zyre install from source not supported, yet\n" - exit 1 + git clone https://github.com/zeromq/czmq + cd czmq + git checkout "tags/v${czmq_version}" + + ./autogen.sh + ./configure --prefix=$zeromq_dir + make -j 8 + sudo make install + sudo ldconfig + cd .. } # Ensures that the build directory exists and contains the extension and its # tests by packaging and then extracting it to the build directory. From 3ecd03116af2710aa5df71662e8d229e8fa6ab61 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 23 Jul 2014 09:47:23 +0200 Subject: [PATCH 38/40] typo --- travis/script.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/travis/script.sh b/travis/script.sh index d504afc..c0d94b0 100755 --- a/travis/script.sh +++ b/travis/script.sh @@ -113,9 +113,9 @@ install_zyre() { # fi # Install from source - git clone https://github.com/zeromq/czmq - cd czmq - git checkout "tags/v${czmq_version}" + git clone https://github.com/zeromq/zyre + cd zyre + git checkout "tags/v${zyre_version}" ./autogen.sh ./configure --prefix=$zeromq_dir From ae15fc2826a916838a5b33aee02f6dbd20dd74e3 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Wed, 8 Oct 2014 13:39:18 +0200 Subject: [PATCH 39/40] typo --- php_zmq_private.h | 2 +- zmq.c | 40 +++++++++++++++++++++------------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/php_zmq_private.h b/php_zmq_private.h index 1501a72..522fe3c 100644 --- a/php_zmq_private.h +++ b/php_zmq_private.h @@ -37,7 +37,7 @@ #include -#ifdef HAVE_CZMQ && HAVE_ZYRE +#if defined(HAVE_CZMQ) && defined(HAVE_ZYRE) # include # include # if ZYRE_VERSION_MAJOR == 1 diff --git a/zmq.c b/zmq.c index a76a585..0bf5226 100644 --- a/zmq.c +++ b/zmq.c @@ -120,6 +120,8 @@ static void php_czmq_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) */ static void php_zyre_get_lib_version(char buffer[PHP_ZMQ_VERSION_LEN]) { + // FFS: This is the zyre version read from include during build time + // libzyre will add a method to get the real version of the lib (void) snprintf(buffer, PHP_ZMQ_VERSION_LEN - 1, "%d.%d.%d", ZYRE_VERSION_MAJOR, ZYRE_VERSION_MINOR, ZYRE_VERSION_PATCH); } /* }}} */ @@ -1787,8 +1789,8 @@ PHP_METHOD(zmqzyre, join) } if (group_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); - return; + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); + return; } zyre_join(this->zyre, group); @@ -1815,8 +1817,8 @@ PHP_METHOD(zmqzyre, leave) } if (group_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); - return; + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); + return; } zyre_leave(this->zyre, group); @@ -1996,8 +1998,8 @@ PHP_METHOD(zmqzyre, sendGroup) } if (group_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); - return; + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Group name can not be empty"); + return; } zyre_shouts (this->zyre, group, data); @@ -2024,8 +2026,8 @@ PHP_METHOD(zmqzyre, sendPeer) } if (peer_len == 0) { - zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Peer ID can not be empty"); - return; + zend_throw_exception_ex(php_zmq_zyre_exception_sc_entry, 0 TSRMLS_CC, "Peer ID can not be empty"); + return; } zyre_whispers(this->zyre, peer, data); @@ -2085,16 +2087,16 @@ ZEND_END_ARG_INFO() static zend_function_entry php_zmq_zyre_class_methods[] = { - PHP_ME(zmqzyre, __construct, zmqzyre___construct_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR | ZEND_ACC_FINAL) - PHP_ME(zmqzyre, setHeader, zmqzyre_setHeader_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, start, zmqzyre_start_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, stop, zmqzyre_stop_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, join, zmqzyre_join_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, leave, zmqzyre_leave_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, recv, zmqzyre_recv_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, sendPeer, zmqzyre_sendPeer_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, sendGroup, zmqzyre_sendGroup_args, ZEND_ACC_PUBLIC) - PHP_ME(zmqzyre, getSocket, zmqzyre_getSocket_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, __construct, zmqzyre___construct_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR | ZEND_ACC_FINAL) + PHP_ME(zmqzyre, setHeader, zmqzyre_setHeader_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, start, zmqzyre_start_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, stop, zmqzyre_stop_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, join, zmqzyre_join_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, leave, zmqzyre_leave_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, recv, zmqzyre_recv_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, sendPeer, zmqzyre_sendPeer_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, sendGroup, zmqzyre_sendGroup_args, ZEND_ACC_PUBLIC) + PHP_ME(zmqzyre, getSocket, zmqzyre_getSocket_args, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -2242,7 +2244,7 @@ static zend_function_entry php_zmq_socket_class_methods[] = { PHP_ME(zmqsocket, getsockopt, zmq_socket_getsockopt_args, ZEND_ACC_PUBLIC) PHP_ME(zmqsocket, __clone, zmq_socket_clone_args, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) PHP_MALIAS(zmqsocket, sendmsg, send, zmq_socket_send_args, ZEND_ACC_PUBLIC) - PHP_MALIAS(zmqsocket, recvmsg, recv, zmq_socket_recv_args, ZEND_ACC_PUBLIC) + PHP_MALIAS(zmqsocket, recvmsg, recv, zmq_socket_recv_args, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; From 6ce250fbef1c113006e6c07f8eb3569defcdfec8 Mon Sep 17 00:00:00 2001 From: William MARTIN Date: Mon, 13 Oct 2014 10:48:24 +0200 Subject: [PATCH 40/40] Reduce tests matrix, will be revert --- .travis.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 927f894..2e7693d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,20 +1,9 @@ language: php php: - - 5.6 - 5.5 - - 5.4 - - 5.3 env: - - ZEROMQ_VERSION=v2.2.0 - - ZEROMQ_VERSION=v3.1.0 - - ZEROMQ_VERSION=v3.2.0 - - ZEROMQ_VERSION=v3.2.1 - - ZEROMQ_VERSION=v3.2.2 - - ZEROMQ_VERSION=v3.2.3 - - ZEROMQ_VERSION=v3.2.4 - - ZEROMQ_VERSION=v4.0.0 - ZEROMQ_VERSION=v4.0.1 - ZEROMQ_VERSION=v4.0.1 WITH_CZMQ=true - ZEROMQ_VERSION=v4.0.1 WITH_CZMQ=true WITH_ZYRE=true