|
|
@ -129,7 +129,7 @@ static void uv__fs_event_rearm(uv_fs_event_t *handle) { |
|
|
|
|
|
|
|
|
|
|
|
static void uv__fs_event_read(EV_P_ ev_io* w, int revents) { |
|
|
|
uv_fs_event_t *handle; |
|
|
|
uv_fs_event_t *handle = NULL; |
|
|
|
uv_loop_t *loop_; |
|
|
|
timespec_t timeout; |
|
|
|
port_event_t pe; |
|
|
@ -139,15 +139,25 @@ static void uv__fs_event_read(EV_P_ ev_io* w, int revents) { |
|
|
|
loop_ = container_of(w, uv_loop_t, fs_event_watcher); |
|
|
|
|
|
|
|
do { |
|
|
|
/* TODO use port_getn() */ |
|
|
|
uint_t n = 1; |
|
|
|
|
|
|
|
/*
|
|
|
|
* Note that our use of port_getn() here (and not port_get()) is deliberate: |
|
|
|
* there is a bug in event ports (Sun bug 6456558) whereby a zeroed timeout |
|
|
|
* causes port_get() to return success instead of ETIME when there aren't |
|
|
|
* actually any events (!); by using port_getn() in lieu of port_get(), |
|
|
|
* we can at least workaround the bug by checking for zero returned events |
|
|
|
* and treating it as we would ETIME. |
|
|
|
*/ |
|
|
|
do { |
|
|
|
memset(&timeout, 0, sizeof timeout); |
|
|
|
r = port_get(loop_->fs_fd, &pe, &timeout); |
|
|
|
r = port_getn(loop_->fs_fd, &pe, 1, &n, &timeout); |
|
|
|
} |
|
|
|
while (r == -1 && errno == EINTR); |
|
|
|
|
|
|
|
if (r == -1 && errno == ETIME) |
|
|
|
if ((r == -1 && errno == ETIME) || n == 0) |
|
|
|
break; |
|
|
|
|
|
|
|
handle = (uv_fs_event_t *)pe.portev_user; |
|
|
|
assert((r == 0) && "unexpected port_get() error"); |
|
|
|
|
|
|
@ -162,7 +172,7 @@ static void uv__fs_event_read(EV_P_ ev_io* w, int revents) { |
|
|
|
} |
|
|
|
while (handle->fd != PORT_DELETED); |
|
|
|
|
|
|
|
if (handle->fd != PORT_DELETED) |
|
|
|
if (handle != NULL && handle->fd != PORT_DELETED) |
|
|
|
uv__fs_event_rearm(handle); |
|
|
|
} |
|
|
|
|
|
|
|