From ece5c6450425ee6e08d96117e3b1e1cfd4414715 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Mon, 5 Sep 2011 00:32:15 -0700 Subject: [PATCH] Upgrade libuv to a8017fd --- deps/uv/include/uv-private/uv-win.h | 2 +- deps/uv/src/win/fs.c | 134 +++++++++++++--------------- deps/uv/test/test-fs.c | 10 ++- 3 files changed, 68 insertions(+), 78 deletions(-) diff --git a/deps/uv/include/uv-private/uv-win.h b/deps/uv/include/uv-private/uv-win.h index 35c9c1943d..01acc01f7f 100644 --- a/deps/uv/include/uv-private/uv-win.h +++ b/deps/uv/include/uv-private/uv-win.h @@ -248,7 +248,7 @@ RB_HEAD(uv_timer_tree_s, uv_timer_s); #define UV_FS_PRIVATE_FIELDS \ int flags; \ int last_error; \ - struct _stat stat; \ + struct _stati64 stat; \ void* arg0; \ union { \ struct { \ diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c index 4cc597c392..71ae451fa5 100644 --- a/deps/uv/src/win/fs.c +++ b/deps/uv/src/win/fs.c @@ -88,7 +88,7 @@ void uv_fs_init() { static void uv_fs_req_init_async(uv_loop_t* loop, uv_fs_t* req, - uv_fs_type fs_type, uv_fs_cb cb) { + uv_fs_type fs_type, const char* path, uv_fs_cb cb) { uv_req_init(loop, (uv_req_t*) req); req->type = UV_FS; req->loop = loop; @@ -97,7 +97,7 @@ static void uv_fs_req_init_async(uv_loop_t* loop, uv_fs_t* req, req->cb = cb; req->result = 0; req->ptr = NULL; - req->path = NULL; /* TODO https://github.com/joyent/libuv/issues/177 */ + req->path = path ? strdup(path) : NULL; req->errorno = 0; req->last_error = 0; memset(&req->overlapped, 0, sizeof(req->overlapped)); @@ -113,6 +113,7 @@ static void uv_fs_req_init_sync(uv_loop_t* loop, uv_fs_t* req, req->fs_type = fs_type; req->result = 0; req->ptr = NULL; + req->path = NULL; req->errorno = 0; } @@ -356,7 +357,7 @@ done: void fs__stat(uv_fs_t* req, const char* path) { int result; - result = _stat(path, &req->stat); + result = _stati64(path, &req->stat); if (result == -1) { req->ptr = NULL; } else { @@ -370,7 +371,7 @@ void fs__stat(uv_fs_t* req, const char* path) { void fs__fstat(uv_fs_t* req, uv_file file) { int result; - result = _fstat(file, &req->stat); + result = _fstati64(file, &req->stat); if (result == -1) { req->ptr = NULL; } else { @@ -644,7 +645,7 @@ static DWORD WINAPI uv_fs_thread_proc(void* parameter) { switch (req->fs_type) { case UV_FS_OPEN: - fs__open(req, (const char*)req->arg0, (int)req->arg1, (int)req->arg2); + fs__open(req, req->path, (int)req->arg0, (int)req->arg1); break; case UV_FS_CLOSE: fs__close(req, (uv_file)req->arg0); @@ -664,26 +665,26 @@ static DWORD WINAPI uv_fs_thread_proc(void* parameter) { (off_t) req->arg3); break; case UV_FS_UNLINK: - fs__unlink(req, (const char*)req->arg0); + fs__unlink(req, req->path); break; case UV_FS_MKDIR: - fs__mkdir(req, (const char*)req->arg0, (int)req->arg1); + fs__mkdir(req, req->path, (int)req->arg0); break; case UV_FS_RMDIR: - fs__rmdir(req, (const char*)req->arg0); + fs__rmdir(req, req->path); break; case UV_FS_READDIR: - fs__readdir(req, (const char*)req->arg0, (int)req->arg1); + fs__readdir(req, req->path, (int)req->arg0); break; case UV_FS_STAT: case UV_FS_LSTAT: - fs__stat(req, (const char*)req->arg0); + fs__stat(req, req->path); break; case UV_FS_FSTAT: fs__fstat(req, (uv_file)req->arg0); break; case UV_FS_RENAME: - fs__rename(req, (const char*)req->arg0, (const char*)req->arg1); + fs__rename(req, req->path, (const char*)req->arg0); break; case UV_FS_FSYNC: case UV_FS_FDATASYNC: @@ -700,25 +701,25 @@ static DWORD WINAPI uv_fs_thread_proc(void* parameter) { (size_t) req->arg3); break; case UV_FS_CHMOD: - fs__chmod(req, (const char*)req->arg0, (int)req->arg1); + fs__chmod(req, req->path, (int)req->arg0); break; case UV_FS_FCHMOD: fs__fchmod(req, (uv_file)req->arg0, (int)req->arg1); break; case UV_FS_UTIME: - fs__utime(req, (const char*)req->arg0, req->arg4, req->arg5); + fs__utime(req, req->path, req->arg4, req->arg5); break; case UV_FS_FUTIME: fs__futime(req, (uv_file)req->arg0, req->arg4, req->arg5); break; case UV_FS_LINK: - fs__link(req, (const char*)req->arg0, (const char*)req->arg1); + fs__link(req, req->path, (const char*)req->arg0); break; case UV_FS_SYMLINK: - fs__symlink(req, (const char*)req->arg0, (const char*)req->arg1, (int)req->arg2); + fs__symlink(req, req->path, (const char*)req->arg0, (int)req->arg1); break; case UV_FS_READLINK: - fs__readlink(req, (const char*)req->arg0); + fs__readlink(req, req->path); break; case UV_FS_CHOWN: case UV_FS_FCHOWN: @@ -737,9 +738,8 @@ static DWORD WINAPI uv_fs_thread_proc(void* parameter) { int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_OPEN, cb); - WRAP_REQ_ARGS3(req, path, flags, mode); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_OPEN, path, cb); + WRAP_REQ_ARGS2(req, flags, mode); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_OPEN); @@ -753,7 +753,7 @@ int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_CLOSE, cb); + uv_fs_req_init_async(loop, req, UV_FS_CLOSE, NULL, cb); WRAP_REQ_ARGS1(req, file); QUEUE_FS_TP_JOB(loop, req); } else { @@ -769,7 +769,7 @@ int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf, size_t length, off_t offset, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_READ, cb); + uv_fs_req_init_async(loop, req, UV_FS_READ, NULL, cb); WRAP_REQ_ARGS4(req, file, buf, length, offset); QUEUE_FS_TP_JOB(loop, req); } else { @@ -785,7 +785,7 @@ int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf, int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf, size_t length, off_t offset, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_WRITE, cb); + uv_fs_req_init_async(loop, req, UV_FS_WRITE, NULL, cb); WRAP_REQ_ARGS4(req, file, buf, length, offset); QUEUE_FS_TP_JOB(loop, req); } else { @@ -801,9 +801,7 @@ int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf, int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_UNLINK, cb); - WRAP_REQ_ARGS1(req, path); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_UNLINK, path, cb); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_UNLINK); @@ -818,9 +816,8 @@ int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_MKDIR, cb); - WRAP_REQ_ARGS2(req, path, mode); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_MKDIR, path, cb); + WRAP_REQ_ARGS1(req, mode); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_MKDIR); @@ -834,9 +831,7 @@ int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_RMDIR, cb); - WRAP_REQ_ARGS1(req, path); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_RMDIR, path, cb); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_RMDIR); @@ -851,9 +846,8 @@ int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_READDIR, cb); - WRAP_REQ_ARGS2(req, path, flags); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_READDIR, path, cb); + WRAP_REQ_ARGS1(req, flags); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_READDIR); @@ -868,10 +862,9 @@ int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_LINK, cb); - WRAP_REQ_ARGS2(req, path, new_path); + uv_fs_req_init_async(loop, req, UV_FS_LINK, path, cb); + WRAP_REQ_ARGS1(req, new_path); STRDUP_ARG(req, 0); - STRDUP_ARG(req, 1); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_LINK); @@ -886,10 +879,9 @@ int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, int flags, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_SYMLINK, cb); - WRAP_REQ_ARGS3(req, path, new_path, flags); + uv_fs_req_init_async(loop, req, UV_FS_SYMLINK, path, cb); + WRAP_REQ_ARGS2(req, new_path, flags); STRDUP_ARG(req, 0); - STRDUP_ARG(req, 1); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_SYMLINK); @@ -904,9 +896,7 @@ int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_READLINK, cb); - WRAP_REQ_ARGS1(req, path); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_READLINK, path, cb); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_READLINK); @@ -921,9 +911,8 @@ int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, int uid, int gid, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_CHOWN, cb); - WRAP_REQ_ARGS3(req, path, uid, gid); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_CHOWN, path, cb); + WRAP_REQ_ARGS2(req, uid, gid); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_CHOWN); @@ -938,7 +927,7 @@ int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, int uid, int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file file, int uid, int gid, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_FCHOWN, cb); + uv_fs_req_init_async(loop, req, UV_FS_FCHOWN, NULL, cb); WRAP_REQ_ARGS3(req, file, uid, gid); QUEUE_FS_TP_JOB(loop, req); } else { @@ -966,13 +955,11 @@ int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { } if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_STAT, cb); + uv_fs_req_init_async(loop, req, UV_FS_STAT, NULL, cb); if (path2) { - WRAP_REQ_ARGS1(req, path2); - req->flags |= UV_FS_FREE_ARG0; + req->path = path2; } else { - WRAP_REQ_ARGS1(req, path); - STRDUP_ARG(req, 0); + req->path = strdup(path); } QUEUE_FS_TP_JOB(loop, req); @@ -1005,13 +992,11 @@ int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { } if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_LSTAT, cb); - if (path2) { - WRAP_REQ_ARGS1(req, path2); - req->flags |= UV_FS_FREE_ARG0; + uv_fs_req_init_async(loop, req, UV_FS_LSTAT, NULL, cb); + if (path2) { + req->path = path2; } else { - WRAP_REQ_ARGS1(req, path); - STRDUP_ARG(req, 0); + req->path = strdup(path); } QUEUE_FS_TP_JOB(loop, req); @@ -1030,7 +1015,7 @@ int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_FSTAT, cb); + uv_fs_req_init_async(loop, req, UV_FS_FSTAT, NULL, cb); WRAP_REQ_ARGS1(req, file); QUEUE_FS_TP_JOB(loop, req); } else { @@ -1046,10 +1031,9 @@ int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_RENAME, cb); - WRAP_REQ_ARGS2(req, path, new_path); + uv_fs_req_init_async(loop, req, UV_FS_RENAME, path, cb); + WRAP_REQ_ARGS1(req, new_path); STRDUP_ARG(req, 0); - STRDUP_ARG(req, 1); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_RENAME); @@ -1063,7 +1047,7 @@ int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_FDATASYNC, cb); + uv_fs_req_init_async(loop, req, UV_FS_FDATASYNC, NULL, cb); WRAP_REQ_ARGS1(req, file); QUEUE_FS_TP_JOB(loop, req); } else { @@ -1078,7 +1062,7 @@ int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_FSYNC, cb); + uv_fs_req_init_async(loop, req, UV_FS_FSYNC, NULL, cb); WRAP_REQ_ARGS1(req, file); QUEUE_FS_TP_JOB(loop, req); } else { @@ -1094,7 +1078,7 @@ int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, off_t offset, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_FTRUNCATE, cb); + uv_fs_req_init_async(loop, req, UV_FS_FTRUNCATE, NULL, cb); WRAP_REQ_ARGS2(req, file, offset); QUEUE_FS_TP_JOB(loop, req); } else { @@ -1110,7 +1094,7 @@ int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd, off_t in_offset, size_t length, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_SENDFILE, cb); + uv_fs_req_init_async(loop, req, UV_FS_SENDFILE, NULL, cb); WRAP_REQ_ARGS4(req, out_fd, in_fd, in_offset, length); QUEUE_FS_TP_JOB(loop, req); } else { @@ -1126,9 +1110,8 @@ int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_CHMOD, cb); - WRAP_REQ_ARGS2(req, path, mode); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_CHMOD, path, cb); + WRAP_REQ_ARGS1(req, mode); QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_CHMOD); @@ -1143,7 +1126,7 @@ int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_FCHMOD, cb); + uv_fs_req_init_async(loop, req, UV_FS_FCHMOD, NULL, cb); WRAP_REQ_ARGS2(req, file, mode); QUEUE_FS_TP_JOB(loop, req); } else { @@ -1159,9 +1142,7 @@ int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_UTIME, cb); - WRAP_REQ_ARGS1(req, path); - STRDUP_ARG(req, 0); + uv_fs_req_init_async(loop, req, UV_FS_UTIME, path, cb); req->arg4 = (ssize_t)atime; req->arg5 = (ssize_t)mtime; QUEUE_FS_TP_JOB(loop, req); @@ -1178,7 +1159,7 @@ int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb) { if (cb) { - uv_fs_req_init_async(loop, req, UV_FS_FUTIME, cb); + uv_fs_req_init_async(loop, req, UV_FS_FUTIME, NULL, cb); WRAP_REQ_ARGS1(req, file); req->arg4 = (ssize_t)atime; req->arg5 = (ssize_t)mtime; @@ -1223,6 +1204,11 @@ void uv_fs_req_cleanup(uv_fs_t* req) { req->ptr = NULL; + if (req->path) { + free(req->path); + req->path = NULL; + } + if (req->flags & UV_FS_ASYNC_QUEUED) { uv_unref(loop); } diff --git a/deps/uv/test/test-fs.c b/deps/uv/test/test-fs.c index 1e119b6aea..ef3b3b9e6a 100644 --- a/deps/uv/test/test-fs.c +++ b/deps/uv/test/test-fs.c @@ -36,7 +36,7 @@ # include # define unlink _unlink # define rmdir _rmdir -# define stat _stat +# define stat _stati64 # define open _open # define write _write # define lseek _lseek @@ -550,8 +550,12 @@ TEST_IMPL(fs_async_dir) { /* sync uv_fs_readdir */ r = uv_fs_readdir(loop, &readdir_req, "test_dir", 0, NULL); - readdir_cb(&readdir_req); - + ASSERT(readdir_req.result == 2); + ASSERT(readdir_req.ptr); + ASSERT(memcmp(readdir_req.ptr, "file1\0file2\0", 12) == 0 + || memcmp(readdir_req.ptr, "file2\0file1\0", 12) == 0); + uv_fs_req_cleanup(&readdir_req); + ASSERT(!readdir_req.ptr); r = uv_fs_stat(loop, &stat_req, "test_dir", stat_cb); ASSERT(r == 0);