mirror of
https://github.com/danog/ext-uv.git
synced 2024-11-26 20:14:47 +01:00
WIP: fixing fs event
This commit is contained in:
parent
01c508816c
commit
302d9ae0a1
39
php_uv.c
39
php_uv.c
@ -349,10 +349,15 @@ void static destruct_uv(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
|||||||
int base_id = -1;
|
int base_id = -1;
|
||||||
php_uv_t *obj = (php_uv_t *)rsrc->ptr;
|
php_uv_t *obj = (php_uv_t *)rsrc->ptr;
|
||||||
|
|
||||||
PHP_UV_DEBUG_PRINT("# will be free: (resource_id: %d)", obj->resource_id);
|
PHP_UV_DEBUG_PRINT("# will be free: (resource_id: %d)\n", obj->resource_id);
|
||||||
|
|
||||||
|
|
||||||
|
if (obj->in_free == 1) {
|
||||||
|
PHP_UV_DEBUG_PRINT("# resource_id: %d is freeing. prevent double free.\n", obj->resource_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
obj->in_free = 1;
|
obj->in_free = 1;
|
||||||
|
|
||||||
if (obj->address) {
|
if (obj->address) {
|
||||||
//fprintf(stderr, "address: %d\n", Z_REFCOUNT_P(obj->read_cb));
|
//fprintf(stderr, "address: %d\n", Z_REFCOUNT_P(obj->read_cb));
|
||||||
zval_ptr_dtor(&obj->address);
|
zval_ptr_dtor(&obj->address);
|
||||||
@ -1059,14 +1064,14 @@ static void php_uv_fs_cb(uv_fs_t* req)
|
|||||||
|
|
||||||
static void php_uv_fs_event_cb(uv_fs_event_t* req, const char* filename, int events, int status)
|
static void php_uv_fs_event_cb(uv_fs_event_t* req, const char* filename, int events, int status)
|
||||||
{
|
{
|
||||||
zval *retval_ptr = NULL;
|
|
||||||
php_uv_t *uv = (php_uv_t*)req->data;
|
|
||||||
zval **params[3];
|
zval **params[3];
|
||||||
zval *name,*ev,*stat;
|
zval *name,*ev,*stat,*rsc,*retval_ptr = NULL;
|
||||||
|
php_uv_t *uv = (php_uv_t*)req->data;
|
||||||
TSRMLS_FETCH_FROM_CTX(uv->thread_ctx);
|
TSRMLS_FETCH_FROM_CTX(uv->thread_ctx);
|
||||||
|
|
||||||
PHP_UV_DEBUG_PRINT("fs_event_cb: %s, %d\n", filename, status);
|
PHP_UV_DEBUG_PRINT("fs_event_cb: %s, %d\n", filename, status);
|
||||||
|
|
||||||
|
MAKE_STD_ZVAL(rsc);
|
||||||
MAKE_STD_ZVAL(name);
|
MAKE_STD_ZVAL(name);
|
||||||
MAKE_STD_ZVAL(ev);
|
MAKE_STD_ZVAL(ev);
|
||||||
MAKE_STD_ZVAL(stat);
|
MAKE_STD_ZVAL(stat);
|
||||||
@ -1077,18 +1082,24 @@ static void php_uv_fs_event_cb(uv_fs_event_t* req, const char* filename, int eve
|
|||||||
}
|
}
|
||||||
ZVAL_LONG(ev, events);
|
ZVAL_LONG(ev, events);
|
||||||
ZVAL_LONG(stat, status);
|
ZVAL_LONG(stat, status);
|
||||||
|
ZVAL_RESOURCE(rsc, uv->resource_id);
|
||||||
|
zend_list_addref(uv->resource_id);
|
||||||
|
|
||||||
params[0] = &name;
|
params[0] = &rsc;
|
||||||
params[1] = &ev;
|
params[1] = &name;
|
||||||
params[2] = &stat;
|
params[2] = &ev;
|
||||||
|
params[3] = &stat;
|
||||||
|
|
||||||
|
php_uv_do_callback(&retval_ptr, uv->fs_event_cb, params, 4 TSRMLS_CC);
|
||||||
|
|
||||||
php_uv_do_callback(&retval_ptr, uv->fs_event_cb, params, 3 TSRMLS_CC);
|
|
||||||
if (retval_ptr != NULL) {
|
if (retval_ptr != NULL) {
|
||||||
zval_ptr_dtor(&retval_ptr);
|
zval_ptr_dtor(&retval_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
zval_ptr_dtor(params[0]);
|
zval_ptr_dtor(params[0]);
|
||||||
zval_ptr_dtor(params[1]);
|
zval_ptr_dtor(params[1]);
|
||||||
zval_ptr_dtor(params[2]);
|
zval_ptr_dtor(params[2]);
|
||||||
|
zval_ptr_dtor(params[3]);
|
||||||
PHP_UV_DEBUG_RESOURCE_REFCOUNT(uv_fs_event_cb, uv->resource_id);
|
PHP_UV_DEBUG_RESOURCE_REFCOUNT(uv_fs_event_cb, uv->resource_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1303,6 +1314,9 @@ static inline uv_stream_t* php_uv_get_current_stream(php_uv_t *uv)
|
|||||||
case IS_UV_CHECK:
|
case IS_UV_CHECK:
|
||||||
stream = (uv_stream_t*)&uv->uv.check;
|
stream = (uv_stream_t*)&uv->uv.check;
|
||||||
break;
|
break;
|
||||||
|
case IS_UV_FS_EVENT:
|
||||||
|
stream = (uv_stream_t*)&uv->uv.fs_event;
|
||||||
|
break;
|
||||||
default: {
|
default: {
|
||||||
TSRMLS_FETCH();
|
TSRMLS_FETCH();
|
||||||
php_error_docref(NULL TSRMLS_CC, E_ERROR, "unexpected type found");
|
php_error_docref(NULL TSRMLS_CC, E_ERROR, "unexpected type found");
|
||||||
@ -2191,7 +2205,7 @@ PHP_FUNCTION(uv_tcp_bind)
|
|||||||
|
|
||||||
ZEND_FETCH_RESOURCE(uv, php_uv_t *, &resource, -1, PHP_UV_RESOURCE_NAME, uv_resource_handle);
|
ZEND_FETCH_RESOURCE(uv, php_uv_t *, &resource, -1, PHP_UV_RESOURCE_NAME, uv_resource_handle);
|
||||||
ZEND_FETCH_RESOURCE(addr, php_uv_sockaddr_t *, &address, -1, PHP_UV_SOCKADDR_RESOURCE_NAME, uv_sockaddr_handle);
|
ZEND_FETCH_RESOURCE(addr, php_uv_sockaddr_t *, &address, -1, PHP_UV_SOCKADDR_RESOURCE_NAME, uv_sockaddr_handle);
|
||||||
\
|
|
||||||
r = uv_tcp_bind((uv_tcp_t*)&uv->uv.tcp, addr->addr.ipv4);
|
r = uv_tcp_bind((uv_tcp_t*)&uv->uv.tcp, addr->addr.ipv4);
|
||||||
if (r) {
|
if (r) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_ERROR, "bind failed");
|
php_error_docref(NULL TSRMLS_CC, E_ERROR, "bind failed");
|
||||||
@ -5106,12 +5120,13 @@ PHP_FUNCTION(uv_fs_event_init)
|
|||||||
|
|
||||||
PHP_UV_INIT_UV(uv, IS_UV_FS_EVENT);
|
PHP_UV_INIT_UV(uv, IS_UV_FS_EVENT);
|
||||||
PHP_UV_FETCH_UV_DEFAULT_LOOP(loop, zloop);
|
PHP_UV_FETCH_UV_DEFAULT_LOOP(loop, zloop);
|
||||||
|
PHP_UV_LIST_INSERT(uv, uv_resource_handle);
|
||||||
|
|
||||||
uv->fs_event_cb = callback;
|
uv->fs_event_cb = callback;
|
||||||
Z_ADDREF_P(callback);
|
Z_ADDREF_P(callback);
|
||||||
uv->uv.fs_event.data = uv;
|
uv->uv.fs_event.data = uv;
|
||||||
|
|
||||||
error = uv_fs_event_init(loop, (uv_fs_event_t*)&uv->uv.fs_event, path, php_uv_fs_event_cb, flags); \
|
error = uv_fs_event_init(loop, (uv_fs_event_t*)&uv->uv.fs_event, path, php_uv_fs_event_cb, flags);
|
||||||
if (error) {
|
if (error) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_ERROR, "uv_fs_event_init failed"); \
|
php_error_docref(NULL TSRMLS_CC, E_ERROR, "uv_fs_event_init failed"); \
|
||||||
return;
|
return;
|
||||||
|
@ -3,7 +3,7 @@ Check for fs mkdir
|
|||||||
--FILE--
|
--FILE--
|
||||||
<?php
|
<?php
|
||||||
define("DIRECTORY_PATH", dirname(__FILE__) . "/fixtures/example_directory");
|
define("DIRECTORY_PATH", dirname(__FILE__) . "/fixtures/example_directory");
|
||||||
|
@rmdir(DIRECTORY_PATH);
|
||||||
uv_fs_mkdir(uv_default_loop(), DIRECTORY_PATH, 0755, function($result){
|
uv_fs_mkdir(uv_default_loop(), DIRECTORY_PATH, 0755, function($result){
|
||||||
echo $result . PHP_EOL;
|
echo $result . PHP_EOL;
|
||||||
|
|
||||||
|
23
tests/320-fs-event.phpt
Normal file
23
tests/320-fs-event.phpt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
--TEST--
|
||||||
|
Check for fs event
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
/* WIP
|
||||||
|
$ev = uv_fs_event_init(uv_default_loop(),dirname(DIRECTORY_PATH), function($rsc, $name, $event, $stat) {
|
||||||
|
echo "stat: " . $stat . PHP_EOL;
|
||||||
|
var_dump($rsc);
|
||||||
|
|
||||||
|
uv_close($rsc, function(){
|
||||||
|
});
|
||||||
|
sleep(1);
|
||||||
|
},0);
|
||||||
|
|
||||||
|
uv_fs_mkdir(uv_default_loop(), DIRECTORY_PATH, 0755, function($result){
|
||||||
|
var_dump($result);
|
||||||
|
echo "finished" . PHP_EOL;
|
||||||
|
@rmdir(DIRECTORY_PATH);
|
||||||
|
});
|
||||||
|
|
||||||
|
uv_run();
|
||||||
|
*/
|
||||||
|
--EXPECT--
|
Loading…
Reference in New Issue
Block a user