Changeset: 0ad335a21373 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0ad335a21373
Modified Files:
gdk/gdk_heap.c
gdk/gdk_private.h
gdk/gdk_storage.c
Branch: Feb2013
Log Message:
Slightly reduce number of system calls used.
GDKfilelocate() returns a FILE*, but to get one, fdopen calls fstat
and mmap, and fclose calls close and munmap. If we only need to know
whether a file exists, we can instead use GDKfdlocate which just calls
open, and then use only close to close the file again.
diffs (121 lines):
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -212,10 +212,10 @@ HEAPcacheFind(size_t *maxsz, char *fn, s
MT_lock_unset(&HEAPcacheLock, "HEAPcache_init");
}
if (!base) {
- FILE *fp = GDKfilelocate(fn, "wb", NULL);
+ int fd = GDKfdlocate(fn, "wb", NULL);
- if (fp) {
- fclose(fp);
+ if (fd >= 0) {
+ close(fd);
return GDKload(fn, NULL, *maxsz, *maxsz, mode);
}
} else
@@ -301,7 +301,6 @@ HEAPalloc(Heap *h, size_t nitems, size_t
}
if (h->filename && h->base == NULL) {
char *of = h->filename;
- FILE *fp;
h->filename = NULL;
@@ -311,13 +310,14 @@ HEAPalloc(Heap *h, size_t nitems, size_t
h->filename = of;
} else {
char *ext;
+ int fd;
strncpy(nme, of, sizeof(nme));
nme[sizeof(nme) - 1] = 0;
ext = decompose_filename(nme);
- fp = GDKfilelocate(nme, "wb", ext);
- if (fp != NULL) {
- fclose(fp);
+ fd = GDKfdlocate(nme, "wb", ext);
+ if (fd >= 0) {
+ close(fd);
h->newstorage = STORE_MMAP;
HEAPload(h, nme, ext, FALSE);
}
@@ -408,7 +408,7 @@ HEAPextend(Heap *h, size_t size)
}
/* too big: convert it to a disk-based temporary heap */
if (can_mmap) {
- FILE *fp;
+ int fd;
char *of = h->filename;
int existing = 0;
@@ -417,15 +417,15 @@ HEAPextend(Heap *h, size_t size)
* mapped files), but if the heap file doesn't
* exist yet, the BAT is new and we can use
* STORE_MMAP */
- fp = GDKfilelocate(nme, "rb", ext);
- if (fp != NULL) {
+ fd = GDKfdlocate(nme, "rb", ext);
+ if (fd >= 0) {
existing = 1;
- fclose(fp);
+ close(fd);
}
h->filename = NULL;
- fp = GDKfilelocate(nme, "wb", ext);
- if (fp != NULL) {
- fclose(fp);
+ fd = GDKfdlocate(nme, "wb", ext);
+ if (fd >= 0) {
+ close(fd);
if (h->storage == STORE_MEM) {
storage_t newmode = h->newstorage ==
STORE_MMAP && existing && !h->forcemap ? STORE_PRIV : h->newstorage;
/* make sure we really MMAP */
@@ -627,7 +627,6 @@ HEAPload_intern(Heap *h, const char *nme
{
size_t truncsize = (1 + (((size_t) (h->free * 1.05)) >>
REMAP_PAGE_MAXBITS)) << REMAP_PAGE_MAXBITS;
size_t minsize = (1 + ((h->size - 1) >> REMAP_PAGE_MAXBITS)) <<
REMAP_PAGE_MAXBITS;
- FILE *fp = NULL;
int ret = 0, desc_status = 0;
long_str srcpath, dstpath;
struct stat st;
@@ -650,11 +649,11 @@ HEAPload_intern(Heap *h, const char *nme
/* when a bat is made read-only, we can truncate any unused
* space at the end of the heap */
if (trunc && truncsize < h->size) {
- fp = (FILE *) GDKfilelocate(nme, "mrb+", ext);
- if (fp) {
- ret = ftruncate(fileno(fp), (off_t) truncsize);
+ int fd = GDKfdlocate(nme, "mrb+", ext);
+ if (fd >= 0) {
+ ret = ftruncate(fd, (off_t) truncsize);
HEAPDEBUG fprintf(stderr, "#ftruncate(file=%s.%s,
size=" SZFMT ") = %d\n", nme, ext, truncsize, ret);
- fclose(fp);
+ close(fd);
if (ret == 0) {
h->size = h->maxsize = truncsize;
desc_status = 1;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -59,6 +59,7 @@ void BBPreleaselref(bat i);
void BBPtrim(size_t delta);
void BBPunshare(bat b);
void GDKclrerr(void);
+int GDKfdlocate(const char *nme, const char *mode, const char *ext);
FILE *GDKfilelocate(const char *nme, const char *mode, const char *ext);
char *GDKload(const char *nme, const char *ext, size_t size, size_t chunk,
storage_t mode);
void GDKlockHome(void);
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -133,7 +133,7 @@ GDKremovedir(const char *dirname)
#define _FWRTHR 0x080000
#define _FRDSEQ 0x100000
-static int
+int
GDKfdlocate(const char *nme, const char *mode, const char *extension)
{
char buf[PATHLENGTH], *path = buf;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list