diff options
Diffstat (limited to 'bdb/os/os_fsync.c')
-rw-r--r-- | bdb/os/os_fsync.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/bdb/os/os_fsync.c b/bdb/os/os_fsync.c new file mode 100644 index 00000000000..f5fd5f56abd --- /dev/null +++ b/bdb/os/os_fsync.c @@ -0,0 +1,90 @@ +/*- + * See the file LICENSE for redistribution information. + * + * Copyright (c) 1997, 1998, 1999, 2000 + * Sleepycat Software. All rights reserved. + */ + +#include "db_config.h" + +#ifndef lint +static const char revid[] = "$Id: os_fsync.c,v 11.9 2000/04/04 23:29:20 ubell Exp $"; +#endif /* not lint */ + +#ifndef NO_SYSTEM_INCLUDES +#include <sys/types.h> + +#include <fcntl.h> /* XXX: Required by __hp3000s900 */ +#include <unistd.h> +#include <string.h> +#endif + +#include "db_int.h" +#include "os_jump.h" + +#ifdef HAVE_VXWORKS +#include "ioLib.h" + +#define fsync(fd) __vx_fsync(fd); + +int +__vx_fsync(fd) + int fd; +{ + int ret; + + /* + * The results of ioctl are driver dependent. Some will return the + * number of bytes sync'ed. Only if it returns 'ERROR' should we + * flag it. + */ + if ((ret = ioctl(fd, FIOSYNC, 0)) != ERROR) + return (0); + return (ret); +} +#endif + +#ifdef __hp3000s900 +#define fsync(fd) __mpe_fsync(fd); + +int +__mpe_fsync(fd) + int fd; +{ + extern FCONTROL(short, short, void *); + + FCONTROL(_MPE_FILENO(fd), 2, NULL); /* Flush the buffers */ + FCONTROL(_MPE_FILENO(fd), 6, NULL); /* Write the EOF */ + return (0); +} +#endif + +/* + * __os_fsync -- + * Flush a file descriptor. + * + * PUBLIC: int __os_fsync __P((DB_ENV *, DB_FH *)); + */ +int +__os_fsync(dbenv, fhp) + DB_ENV *dbenv; + DB_FH *fhp; +{ + int ret; + + /* + * Do nothing if the file descriptor has been marked as not requiring + * any sync to disk. + */ + if (F_ISSET(fhp, DB_FH_NOSYNC)) + return (0); + + ret = __db_jump.j_fsync != NULL ? + __db_jump.j_fsync(fhp->fd) : fsync(fhp->fd); + + if (ret != 0) { + ret = __os_get_errno(); + __db_err(dbenv, "fsync %s", strerror(ret)); + } + return (ret); +} |