unix, windows: stat: never pass NULL to cb

Never pass NULL to the fs_poll callback, use a zeroed out statbuf instead.

Makes the interface a little more convenient to use.
This commit is contained in:
Ben Noordhuis 2012-06-20 16:22:18 +02:00
parent 6e8eb33249
commit 14ffaa668d
3 changed files with 23 additions and 22 deletions

View File

@ -316,8 +316,8 @@ typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename,
typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle,
int status,
uv_statbuf_t* prev,
uv_statbuf_t* curr);
const uv_statbuf_t* prev,
const uv_statbuf_t* curr);
typedef enum {
UV_LEAVE_GROUP = 0,

View File

@ -30,6 +30,8 @@ static int statbuf_eq(const uv_statbuf_t* a, const uv_statbuf_t* b);
static void timer_cb(uv_timer_t* timer, int status);
static void poll_cb(uv_fs_t* req);
static uv_statbuf_t zero_statbuf;
int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle) {
/* TODO(bnoordhuis) Mark fs_req internal. */
@ -141,7 +143,7 @@ static void poll_cb(uv_fs_t* req) {
if (req->result != 0) {
if (handle->busy_polling != -req->errorno) {
uv__set_artificial_error(handle->loop, req->errorno);
handle->poll_cb(handle, -1, NULL, NULL);
handle->poll_cb(handle, -1, &handle->statbuf, &zero_statbuf);
handle->busy_polling = -req->errorno;
}
goto out;

View File

@ -30,8 +30,8 @@ static void timer_cb(uv_timer_t* handle, int status);
static void close_cb(uv_handle_t* handle);
static void poll_cb(uv_fs_poll_t* handle,
int status,
uv_statbuf_t* prev,
uv_statbuf_t* curr);
const uv_statbuf_t* prev,
const uv_statbuf_t* curr);
static uv_fs_poll_t poll_handle;
static uv_timer_t timer_handle;
@ -74,50 +74,49 @@ static void timer_cb(uv_timer_t* handle, int status) {
static void poll_cb(uv_fs_poll_t* handle,
int status,
uv_statbuf_t* prev,
uv_statbuf_t* curr) {
const uv_statbuf_t* prev,
const uv_statbuf_t* curr) {
const static uv_statbuf_t zero_statbuf;
ASSERT(handle == &poll_handle);
ASSERT(uv_is_active((uv_handle_t*)handle));
ASSERT(prev != NULL);
ASSERT(curr != NULL);
switch (poll_cb_called++) {
case 0:
ASSERT(status == -1);
ASSERT(prev == NULL);
ASSERT(curr == NULL);
ASSERT(uv_last_error(loop).code == UV_ENOENT);
ASSERT(0 == memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(0 == memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
touch_file(FIXTURE);
break;
case 1:
ASSERT(status == 0);
ASSERT(prev != NULL);
ASSERT(curr != NULL);
{
uv_statbuf_t buf;
memset(&buf, 0, sizeof(buf));
ASSERT(0 == memcmp(&buf, prev, sizeof(buf)));
}
ASSERT(0 == memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 20, 0));
break;
case 2:
ASSERT(status == 0);
ASSERT(prev != NULL);
ASSERT(curr != NULL);
ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 200, 0));
break;
case 3:
ASSERT(status == 0);
ASSERT(prev != NULL);
ASSERT(curr != NULL);
ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
remove(FIXTURE);
break;
case 4:
ASSERT(status == -1);
ASSERT(prev == NULL);
ASSERT(curr == NULL);
ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(0 == memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
ASSERT(uv_last_error(loop).code == UV_ENOENT);
uv_close((uv_handle_t*)handle, close_cb);
break;