From 98e7d3506f019d396db16a3598437e76ab508922 Mon Sep 17 00:00:00 2001 From: Micheil Smith Date: Sun, 31 Oct 2010 04:01:46 +1100 Subject: [PATCH] Rewrite libeio After callback to use req->result instead of req->errorno for error checking --- src/node_file.cc | 92 ++++++++++++++++++++++++-------------------------------- 1 file changed, 39 insertions(+), 53 deletions(-) diff --git a/src/node_file.cc b/src/node_file.cc index efdc64c..7c154b4 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -43,33 +43,28 @@ static int After(eio_req *req) { ev_unref(EV_DEFAULT_UC); - int argc = 0; - Local argv[6]; // 6 is the maximum number of args - - if (req->errorno != 0) { - argc = 1; - switch (req->type) { - case EIO_STAT: - case EIO_LSTAT: - case EIO_LINK: - case EIO_UNLINK: - case EIO_RMDIR: - case EIO_RENAME: - case EIO_READLINK: - case EIO_OPEN: - case EIO_CHMOD: - case EIO_CHOWN: - case EIO_MKDIR: - argv[0] = ErrnoException(req->errorno, NULL, "", static_cast(req->ptr1)); - break; - default: - argv[0] = ErrnoException(req->errorno); + // there is always at least one argument. "error" + int argc = 1; + Local argv[2]; // 6 is the maximum number of args + + // NOTE: This may be needed to be changed if something returns a -1 + // for a success, which is possible. + if (req->result == -1) { + // If the request doesn't have a path parameter set. + if (!req->ptr1) { + argv[0] = ErrnoException(req->errorno); + } else { + argv[0] = ErrnoException(req->errorno, NULL, "", static_cast(req->ptr1)); } } else { - // Note: the error is always given the first argument of the callback. - // If there is no error then then the first argument is null. + // error value is empty or null for non-error. argv[0] = Local::New(Null()); + + // All have at least two args now. + argc = 2; + switch (req->type) { + // These all have no data to pass. case EIO_CLOSE: case EIO_RENAME: case EIO_UNLINK: @@ -82,68 +77,59 @@ static int After(eio_req *req) { case EIO_SYMLINK: case EIO_CHMOD: case EIO_CHOWN: - argc = 0; + // These, however, don't. + argc = 1; break; case EIO_OPEN: case EIO_SENDFILE: - argc = 2; argv[1] = Integer::New(req->result); break; case EIO_WRITE: - argc = 2; argv[1] = Integer::New(req->result); break; case EIO_STAT: case EIO_LSTAT: case EIO_FSTAT: - { - struct stat *s = reinterpret_cast(req->ptr2); - argc = 2; - argv[1] = BuildStatsObject(s); + { + struct stat *s = reinterpret_cast(req->ptr2); + argv[1] = BuildStatsObject(s); + } break; - } case EIO_READLINK: - { - argc = 2; argv[1] = String::New(static_cast(req->ptr2), req->result); break; - } case EIO_READ: - { // Buffer interface argv[1] = Integer::New(req->result); - argc = 2; break; - } case EIO_READDIR: - { - char *namebuf = static_cast(req->ptr2); - int nnames = req->result; + { + char *namebuf = static_cast(req->ptr2); + int nnames = req->result; - Local names = Array::New(nnames); + Local names = Array::New(nnames); - for (int i = 0; i < nnames; i++) { - Local name = String::New(namebuf); - names->Set(Integer::New(i), name); + for (int i = 0; i < nnames; i++) { + Local name = String::New(namebuf); + names->Set(Integer::New(i), name); #ifndef NDEBUG - namebuf += strlen(namebuf); - assert(*namebuf == '\0'); - namebuf += 1; + namebuf += strlen(namebuf); + assert(*namebuf == '\0'); + namebuf += 1; #else - namebuf += strlen(namebuf) + 1; + namebuf += strlen(namebuf) + 1; #endif - } + } - argc = 2; - argv[1] = names; + argv[1] = names; + } break; - } default: assert(0 && "Unhandled eio response"); @@ -626,7 +612,7 @@ static Handle Write(const Arguments& args) { return ThrowException(Exception::Error( String::New("Second argument needs to be a buffer"))); } - + Local buffer_obj = args[1]->ToObject(); char *buffer_data = Buffer::Data(buffer_obj); size_t buffer_length = Buffer::Length(buffer_obj); -- 2.7.4