Browse Source

Added posix fsync and fdatasync to fs module

v0.7.4-release
Andrew Johnston 15 years ago
committed by Ryan Dahl
parent
commit
9599607065
  1. 16
      lib/fs.js
  2. 44
      src/node_file.cc
  3. 37
      test/simple/test-fs-fsync.js
  4. 16
      wscript

16
lib/fs.js

@ -187,6 +187,22 @@ fs.rmdirSync = function (path) {
return binding.rmdir(path);
};
fs.fdatasync = function (fd, callback) {
binding.fdatasync(fd, callback || noop);
};
fs.fdatasyncSync = function (fd) {
return binding.fdatasync(fd);
};
fs.fsync = function (fd, callback) {
binding.fsync(fd, callback || noop);
};
fs.fsyncSync = function (fd) {
return binding.fsync(fd);
};
fs.mkdir = function (path, mode, callback) {
binding.mkdir(path, mode, callback || noop);
};

44
src/node_file.cc

@ -54,6 +54,8 @@ static int After(eio_req *req) {
case EIO_RMDIR:
case EIO_MKDIR:
case EIO_FTRUNCATE:
case EIO_FSYNC:
case EIO_FDATASYNC:
case EIO_LINK:
case EIO_SYMLINK:
case EIO_CHMOD:
@ -330,6 +332,46 @@ static Handle<Value> Truncate(const Arguments& args) {
}
}
static Handle<Value> Fdatasync(const Arguments& args) {
HandleScope scope;
if (args.Length() < 1 || !args[0]->IsInt32()) {
return THROW_BAD_ARGS;
}
int fd = args[0]->Int32Value();
if (args[1]->IsFunction()) {
ASYNC_CALL(fdatasync, args[1], fd)
} else {
#if HAVE_FDATASYNC
int ret = fdatasync(fd);
#else
int ret = fsync(fd);
#endif
if (ret != 0) return ThrowException(ErrnoException(errno));
return Undefined();
}
}
static Handle<Value> Fsync(const Arguments& args) {
HandleScope scope;
if (args.Length() < 1 || !args[0]->IsInt32()) {
return THROW_BAD_ARGS;
}
int fd = args[0]->Int32Value();
if (args[1]->IsFunction()) {
ASYNC_CALL(fsync, args[1], fd)
} else {
int ret = fsync(fd);
if (ret != 0) return ThrowException(ErrnoException(errno));
return Undefined();
}
}
static Handle<Value> Unlink(const Arguments& args) {
HandleScope scope;
@ -756,6 +798,8 @@ void File::Initialize(Handle<Object> target) {
NODE_SET_METHOD(target, "close", Close);
NODE_SET_METHOD(target, "open", Open);
NODE_SET_METHOD(target, "read", Read);
NODE_SET_METHOD(target, "fdatasync", Fdatasync);
NODE_SET_METHOD(target, "fsync", Fsync);
NODE_SET_METHOD(target, "rename", Rename);
NODE_SET_METHOD(target, "truncate", Truncate);
NODE_SET_METHOD(target, "rmdir", RMDir);

37
test/simple/test-fs-fsync.js

@ -0,0 +1,37 @@
require("../common");
var path = require('path');
var fs = require('fs');
var successes = 0;
var file = path.join(fixturesDir, "a.js");
error("open " + file);
fs.open(file, "a", 0777, function (err, fd) {
error("fd " + fd);
if (err) throw err;
fs.fdatasyncSync(fd);
error("fdatasync SYNC: ok");
successes++;
fs.fsyncSync(fd);
error("fsync SYNC: ok");
successes++;
fs.fdatasync(fd, function (err) {
if (err) throw err;
error("fdatasync ASYNC: ok");
successes++;
fs.fsync(fd, function(err) {
if (err) throw err;
error("fsync ASYNC: ok");
successes++;
});
});
});
process.addListener("exit", function () {
assert.equal(4, successes);
});

16
wscript

@ -133,6 +133,22 @@ def configure(conf):
conf.env.append_value('CCFLAGS', '-D_FILE_OFFSET_BITS=64')
conf.env.append_value('CXXFLAGS', '-D_FILE_OFFSET_BITS=64')
## needed for node_file.cc fdatasync
## Strangely on OSX 10.6 the g++ doesn't see fdatasync but gcc does?
code = """
#include <unistd.h>
int main(void)
{
int fd = 0;
fdatasync (fd);
return 0;
}
"""
if conf.check_cxx(msg="Checking for fdatasync(2) with c++", fragment=code):
conf.env.append_value('CXXFLAGS', '-DHAVE_FDATASYNC=1')
else:
conf.env.append_value('CXXFLAGS', '-DHAVE_FDATASYNC=0')
# platform
platform_def = '-DPLATFORM=' + sys.platform
conf.env.append_value('CCFLAGS', platform_def)

Loading…
Cancel
Save