only store fd in javascript (not in c++)
authorRyan <ry@tinyclouds.org>
Thu, 16 Apr 2009 11:42:34 +0000 (13:42 +0200)
committerRyan <ry@tinyclouds.org>
Thu, 16 Apr 2009 11:42:34 +0000 (13:42 +0200)
src/file.cc
test/simple.js

index 3b1f212..f395a64 100644 (file)
@@ -6,11 +6,10 @@
 #include <fcntl.h>
 #include <stdlib.h>
 
-
 using namespace v8;
 
-#define ON_OPEN v8::String::NewSymbol("onOpen")
-
+#define ON_OPEN_SYMBOL v8::String::NewSymbol("onOpen")
+#define FD_SYMBOL v8::String::NewSymbol("fd")
 
 class File;
 class Callback {
@@ -171,14 +170,12 @@ public:
 
 private:
   static void MakeWeak (Persistent<Value> _, void *data);
-  int fd_;
   Persistent<Object> handle_;
 };
 
 File::File (Handle<Object> handle)
 {
   HandleScope scope;
-  fd_ = -1;
   handle_ = Persistent<Object>::New(handle);
   Handle<External> external = External::New(this);
   handle_->SetInternalField(0, external);
@@ -215,8 +212,7 @@ File::AfterClose (eio_req *req)
   File *file = static_cast<File*>(req->data);
 
   if (req->result == 0) {
-    file->fd_ = -1;
-    file->handle_->Delete(String::NewSymbol("fd"));
+    file->handle_->Delete(FD_SYMBOL);
   }
 
   // TODO
@@ -227,7 +223,10 @@ File::AfterClose (eio_req *req)
 void
 File::Close () 
 {
-  eio_req *req = eio_close (fd_, EIO_PRI_DEFAULT, File::AfterClose, this);
+  Handle<Value> fd_value = handle_->Get(FD_SYMBOL);
+  int fd = fd_value->IntegerValue();
+
+  eio_req *req = eio_close (fd, EIO_PRI_DEFAULT, File::AfterClose, this);
   node_eio_submit(req);
 }
 
@@ -238,15 +237,14 @@ File::AfterOpen (eio_req *req)
   HandleScope scope;
 
   if(req->result >= 0) {
-    file->fd_ = static_cast<int>(req->result);
-    file->handle_->Set(String::NewSymbol("fd"), Integer::New(file->fd_));
+    file->handle_->Set(FD_SYMBOL, Integer::New(req->result));
   }
 
-  Handle<Value> callback_value = file->handle_->Get(ON_OPEN);
+  Handle<Value> callback_value = file->handle_->Get(ON_OPEN_SYMBOL);
   if (!callback_value->IsFunction())
     return 0; 
   Handle<Function> callback = Handle<Function>::Cast(callback_value);
-  file->handle_->Delete(ON_OPEN);
+  file->handle_->Delete(ON_OPEN_SYMBOL);
 
   const int argc = 1;
   Handle<Value> argv[argc];
@@ -264,11 +262,11 @@ Handle<Value>
 File::Open (const char *path, const char *mode, Handle<Value> callback)
 {
   // make sure that we don't already have a pending open
-  if (handle_->Has(ON_OPEN)) {
+  if (handle_->Has(ON_OPEN_SYMBOL)) {
     return ThrowException(String::New("File object is already being opened."));
   }
 
-  if (callback->IsFunction()) handle_->Set(ON_OPEN, callback);
+  if (callback->IsFunction()) handle_->Set(ON_OPEN_SYMBOL, callback);
 
   // Get the current umask
   mode_t mask = umask(0); 
@@ -324,11 +322,14 @@ File::Write (char *buf, size_t length, Callback *callback)
   if (callback) 
     callback->file = this;
   // NOTE: -1 offset in eio_write() invokes write() instead of pwrite()
-  if (fd_ < 0) {
+  if (handle_->Has(FD_SYMBOL) == false) {
     printf("trying to write to a bad fd!\n");  
     return;
   }
-  eio_req *req = eio_write(fd_, buf, length, -1, EIO_PRI_DEFAULT, File::AfterWrite, callback);
+  Handle<Value> fd_value = handle_->Get(FD_SYMBOL);
+  int fd = fd_value->IntegerValue();
+
+  eio_req *req = eio_write(fd, buf, length, -1, EIO_PRI_DEFAULT, File::AfterWrite, callback);
   node_eio_submit(req);
 }
 
index 6920f88..b9981c0 100644 (file)
@@ -1,6 +1,6 @@
 var f = new File;
 
-f.open("/tmp/world", "r+", function (status) {
+f.open("/tmp/world", "a+", function (status) {
   if (status == 0) {
     node.blocking.print("file opened");
     f.write("hello world\n", function (status, written) {