Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Added ZMQ_FD as resource so that it can be used with external polling…

… system
  • Loading branch information...
commit 1822f4da61f0180f0140fbe0a9060fa1cb24a9ca 1 parent 4beea33
Mikko Koppanen authored
2  config.m4
View
@@ -44,7 +44,7 @@ if test "$PHP_ZMQ" != "no"; then
PHP_ADD_EXTENSION_DEP(zmq, spl)
PHP_SUBST(ZMQ_SHARED_LIBADD)
- PHP_NEW_EXTENSION(zmq, zmq.c zmq_pollset.c zmq_device.c zmq_sockopt.c, $ext_shared)
+ PHP_NEW_EXTENSION(zmq, zmq.c zmq_pollset.c zmq_device.c zmq_sockopt.c zmq_fd_stream.c, $ext_shared)
PKG_CONFIG_PATH="$ORIG_PKG_CONFIG_PATH"
fi
11 options/generate.xslt
View
@@ -110,6 +110,17 @@ PHP_METHOD(zmqsocket, getsockopt)
</xsl:template>
<xsl:template name="getsockopt-footer">
+
+ case ZMQ_FD:
+ {
+ php_stream *stm = php_zmq_create_zmq_fd(getThis() TSRMLS_CC);
+ if (stm) {
+ php_stream_to_zval(stm, return_value);
+ return;
+ }
+ RETURN_FALSE;
+ }
+ break;
case ZMQ_IDENTITY:
{
2  php_zmq_private.h
View
@@ -231,4 +231,6 @@ int php_zmq_device(php_zmq_device_object *intern TSRMLS_DC);
zend_class_entry *php_zmq_socket_exception_sc_entry_get ();
zend_class_entry *php_zmq_device_exception_sc_entry_get ();
+php_stream *php_zmq_create_zmq_fd(zval *obj TSRMLS_DC);
+
#endif /* _PHP_ZMQ_PRIVATE_H_ */
3  zmq.c
View
@@ -1720,6 +1720,7 @@ PHP_MINIT_FUNCTION(zmq)
/* Socket options */
#if ZMQ_VERSION_MAJOR == 2
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_HWM", ZMQ_HWM);
+ PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_FD", ZMQ_FD);
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_SWAP", ZMQ_SWAP);
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_AFFINITY", ZMQ_AFFINITY);
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_IDENTITY", ZMQ_IDENTITY);
@@ -1743,7 +1744,7 @@ PHP_MINIT_FUNCTION(zmq)
#if ZMQ_VERSION_MAJOR == 3
/* Backwards compatibility */
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_HWM", ZMQ_HWM);
-
+ PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_FD", ZMQ_FD);
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_SNDHWM", ZMQ_SNDHWM);
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_RCVHWM", ZMQ_RCVHWM);
PHP_ZMQ_REGISTER_CONST_LONG("SOCKOPT_AFFINITY", ZMQ_AFFINITY);
105 zmq_fd_stream.c
View
@@ -0,0 +1,105 @@
+/*
++-----------------------------------------------------------------------------------+
+| ZMQ extension for PHP |
+| Copyright (c) 2010, Mikko Koppanen <mkoppanen@php.net> |
+| All rights reserved. |
++-----------------------------------------------------------------------------------+
+| Redistribution and use in source and binary forms, with or without |
+| modification, are permitted provided that the following conditions are met: |
+| * Redistributions of source code must retain the above copyright |
+| notice, this list of conditions and the following disclaimer. |
+| * Redistributions in binary form must reproduce the above copyright |
+| notice, this list of conditions and the following disclaimer in the |
+| documentation and/or other materials provided with the distribution. |
+| * Neither the name of the copyright holder nor the |
+| names of its contributors may be used to endorse or promote products |
+| derived from this software without specific prior written permission. |
++-----------------------------------------------------------------------------------+
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
+| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
+| DISCLAIMED. IN NO EVENT SHALL MIKKO KOPPANEN BE LIABLE FOR ANY |
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
++-----------------------------------------------------------------------------------+
+*/
+
+#include "php_zmq.h"
+#include "php_zmq_private.h"
+
+static size_t php_zmq_fd_read(php_stream *stream, char *buf, size_t count TSRMLS_DC)
+{
+ return 0;
+}
+
+static size_t php_zmq_fd_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC)
+{
+ return 0;
+}
+
+static int php_zmq_fd_seek(php_stream *stream, off_t offset, int whence, off_t *newoffs TSRMLS_DC)
+{
+ return -1;
+}
+
+static int php_zmq_fd_close(php_stream *stream, int close_handle TSRMLS_DC)
+{
+ zval *obj = (zval *) stream->abstract;
+ zend_objects_store_del_ref(obj TSRMLS_CC);
+ Z_DELREF_P(obj);
+ return EOF;
+}
+
+static int php_zmq_fd_flush(php_stream *stream TSRMLS_DC)
+{
+ return FAILURE;
+}
+
+static int php_zmq_fd_cast(php_stream *stream, int cast_as, void **ret TSRMLS_DC)
+{
+ zval *obj = (zval *) stream->abstract;
+ php_zmq_socket_object *intern = (php_zmq_socket_object *) zend_object_store_get_object(obj TSRMLS_CC);
+
+ switch (cast_as) {
+ case PHP_STREAM_AS_FD_FOR_SELECT:
+ case PHP_STREAM_AS_FD:
+ case PHP_STREAM_AS_SOCKETD:
+ if (ret) {
+ size_t optsiz = sizeof (int);
+ if (zmq_getsockopt(intern->socket->z_socket, ZMQ_FD, (int*) ret, &optsiz) != 0) {
+ return FAILURE;
+ }
+ }
+ return SUCCESS;
+ default:
+ return FAILURE;
+ }
+}
+
+static php_stream_ops php_stream_zmq_fd_ops = {
+ php_zmq_fd_write, php_zmq_fd_read,
+ php_zmq_fd_close, php_zmq_fd_flush,
+ "ZMQ_FD",
+ NULL, /* seek */
+ php_zmq_fd_cast, /* cast */
+ NULL, /* stat */
+ NULL /* set_option */
+};
+
+php_stream *php_zmq_create_zmq_fd(zval *obj TSRMLS_DC)
+{
+ php_stream *stream;
+ stream = php_stream_alloc(&php_stream_zmq_fd_ops, obj, NULL, "r");
+
+ if (stream) {
+ zend_objects_store_add_ref(obj TSRMLS_CC);
+ Z_ADDREF_P(obj);
+ return stream;
+ }
+ return NULL;
+}
+/* }}} */
22 zmq_sockopt.c
View
@@ -279,6 +279,17 @@ PHP_METHOD(zmqsocket, getsockopt)
}
break;
+
+ case ZMQ_FD:
+ {
+ php_stream *stm = php_zmq_create_zmq_fd(getThis() TSRMLS_CC);
+ if (stm) {
+ php_stream_to_zval(stm, return_value);
+ return;
+ }
+ RETURN_FALSE;
+ }
+ break;
case ZMQ_IDENTITY:
{
@@ -879,6 +890,17 @@ PHP_METHOD(zmqsocket, getsockopt)
}
break;
+
+ case ZMQ_FD:
+ {
+ php_stream *stm = php_zmq_create_zmq_fd(getThis() TSRMLS_CC);
+ if (stm) {
+ php_stream_to_zval(stm, return_value);
+ return;
+ }
+ RETURN_FALSE;
+ }
+ break;
case ZMQ_IDENTITY:
{
Please sign in to comment.
Something went wrong with that request. Please try again.