mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
streams: refactor implementation of stream_select()
This commit is contained in:
parent
c50a715a5c
commit
b46c5e6186
1 changed files with 8 additions and 18 deletions
|
@ -595,17 +595,13 @@ PHP_FUNCTION(stream_get_wrappers)
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ stream_select related functions */
|
/* {{{ stream_select related functions */
|
||||||
static int stream_array_to_fd_set(zval *stream_array, fd_set *fds, php_socket_t *max_fd)
|
static int stream_array_to_fd_set(const HashTable *stream_array, fd_set *fds, php_socket_t *max_fd)
|
||||||
{
|
{
|
||||||
zval *elem;
|
zval *elem;
|
||||||
php_stream *stream;
|
php_stream *stream;
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
|
||||||
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
|
ZEND_HASH_FOREACH_VAL(stream_array, elem) {
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(stream_array), elem) {
|
|
||||||
/* Temporary int fd is needed for the STREAM data type on windows, passing this_fd directly to php_stream_cast()
|
/* Temporary int fd is needed for the STREAM data type on windows, passing this_fd directly to php_stream_cast()
|
||||||
would eventually bring a wrong result on x64. php_stream_cast() casts to int internally, and this will leave
|
would eventually bring a wrong result on x64. php_stream_cast() casts to int internally, and this will leave
|
||||||
the higher bits of a SOCKET variable uninitialized on systems with little endian. */
|
the higher bits of a SOCKET variable uninitialized on systems with little endian. */
|
||||||
|
@ -634,7 +630,7 @@ static int stream_array_to_fd_set(zval *stream_array, fd_set *fds, php_socket_t
|
||||||
return cnt ? 1 : 0;
|
return cnt ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stream_array_from_fd_set(zval *stream_array, fd_set *fds)
|
static int stream_array_from_fd_set(zval *stream_array, const fd_set *fds)
|
||||||
{
|
{
|
||||||
zval *elem, *dest_elem;
|
zval *elem, *dest_elem;
|
||||||
HashTable *ht;
|
HashTable *ht;
|
||||||
|
@ -643,9 +639,7 @@ static int stream_array_from_fd_set(zval *stream_array, fd_set *fds)
|
||||||
zend_string *key;
|
zend_string *key;
|
||||||
zend_ulong num_ind;
|
zend_ulong num_ind;
|
||||||
|
|
||||||
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
|
ZEND_ASSERT(Z_TYPE_P(stream_array) == IS_ARRAY);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ht = zend_new_array(zend_hash_num_elements(Z_ARRVAL_P(stream_array)));
|
ht = zend_new_array(zend_hash_num_elements(Z_ARRVAL_P(stream_array)));
|
||||||
|
|
||||||
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
|
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
|
||||||
|
@ -671,7 +665,6 @@ static int stream_array_from_fd_set(zval *stream_array, fd_set *fds)
|
||||||
|
|
||||||
zval_add_ref(dest_elem);
|
zval_add_ref(dest_elem);
|
||||||
ret++;
|
ret++;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ZEND_HASH_FOREACH_END();
|
} ZEND_HASH_FOREACH_END();
|
||||||
|
@ -692,9 +685,7 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
|
||||||
zend_ulong num_ind;
|
zend_ulong num_ind;
|
||||||
zend_string *key;
|
zend_string *key;
|
||||||
|
|
||||||
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
|
ZEND_ASSERT(Z_TYPE_P(stream_array) == IS_ARRAY);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ht = zend_new_array(zend_hash_num_elements(Z_ARRVAL_P(stream_array)));
|
ht = zend_new_array(zend_hash_num_elements(Z_ARRVAL_P(stream_array)));
|
||||||
|
|
||||||
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
|
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(stream_array), num_ind, key, elem) {
|
||||||
|
@ -717,7 +708,6 @@ static int stream_array_emulate_read_fd_set(zval *stream_array)
|
||||||
}
|
}
|
||||||
zval_add_ref(dest_elem);
|
zval_add_ref(dest_elem);
|
||||||
ret++;
|
ret++;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
} ZEND_HASH_FOREACH_END();
|
} ZEND_HASH_FOREACH_END();
|
||||||
|
|
||||||
|
@ -760,21 +750,21 @@ PHP_FUNCTION(stream_select)
|
||||||
FD_ZERO(&efds);
|
FD_ZERO(&efds);
|
||||||
|
|
||||||
if (r_array != NULL) {
|
if (r_array != NULL) {
|
||||||
set_count = stream_array_to_fd_set(r_array, &rfds, &max_fd);
|
set_count = stream_array_to_fd_set(Z_ARR_P(r_array), &rfds, &max_fd);
|
||||||
if (set_count > max_set_count)
|
if (set_count > max_set_count)
|
||||||
max_set_count = set_count;
|
max_set_count = set_count;
|
||||||
sets += set_count;
|
sets += set_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w_array != NULL) {
|
if (w_array != NULL) {
|
||||||
set_count = stream_array_to_fd_set(w_array, &wfds, &max_fd);
|
set_count = stream_array_to_fd_set(Z_ARR_P(w_array), &wfds, &max_fd);
|
||||||
if (set_count > max_set_count)
|
if (set_count > max_set_count)
|
||||||
max_set_count = set_count;
|
max_set_count = set_count;
|
||||||
sets += set_count;
|
sets += set_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e_array != NULL) {
|
if (e_array != NULL) {
|
||||||
set_count = stream_array_to_fd_set(e_array, &efds, &max_fd);
|
set_count = stream_array_to_fd_set(Z_ARR_P(e_array), &efds, &max_fd);
|
||||||
if (set_count > max_set_count)
|
if (set_count > max_set_count)
|
||||||
max_set_count = set_count;
|
max_set_count = set_count;
|
||||||
sets += set_count;
|
sets += set_count;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue