projects
/
tedtools.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
55caa79
)
cleanup code, remove possible freespace leak on close
author
teodor
<teodor>
Mon, 4 Oct 2004 19:59:37 +0000
(19:59 +0000)
committer
teodor
<teodor>
Mon, 4 Oct 2004 19:59:37 +0000
(19:59 +0000)
flatdb.c
patch
|
blob
|
history
diff --git
a/flatdb.c
b/flatdb.c
index
d633744
..
b591041
100644
(file)
--- a/
flatdb.c
+++ b/
flatdb.c
@@
-51,6
+51,19
@@
findFreeSpace(FDB *db, size_t length) {
return NULL;
}
return NULL;
}
+static void
+addFreeSpace(FDB *db, off_t offset, size_t length) {
+ if ( db->listcur >= db->listlen ) {
+ db->listlen *= 2;
+ db->space = (FDBFreeSpace*) trealloc( db->space, db->listlen * sizeof(FDBFreeSpace) );
+ }
+
+ db->space[ db->listcur ].offset=offset;
+ db->space[ db->listcur ].length=length;
+
+ db->listcur++;
+}
+
static int
cmpFS(const void* a, const void* b) {
if ( ((FDBFreeSpace*)a)->offset == ((FDBFreeSpace*)b)->offset )
static int
cmpFS(const void* a, const void* b) {
if ( ((FDBFreeSpace*)a)->offset == ((FDBFreeSpace*)b)->offset )
@@
-131,6
+144,7
@@
FDBOpen(FDB *db, char *file, int readonly) {
tlog(TL_CRIT,"FDBOpen: free space read failed: %s", strerror(errno));
return FDB_ERROR;
}
tlog(TL_CRIT,"FDBOpen: free space read failed: %s", strerror(errno));
return FDB_ERROR;
}
+ FDBVacuumFreeSpace(db);
} else {
db->listlen = 8;
db->space = (FDBFreeSpace*)tmalloc( db->listlen*sizeof(FDBFreeSpace) );
} else {
db->listlen = 8;
db->space = (FDBFreeSpace*)tmalloc( db->listlen*sizeof(FDBFreeSpace) );
@@
-140,7
+154,9
@@
FDBOpen(FDB *db, char *file, int readonly) {
header.lenfreespace = 0;
header.isopened = 1;
header.lenfreespace = 0;
header.isopened = 1;
- if ( lseek(db->fd, 0, SEEK_SET)!=0 || write(db->fd, &header, sizeof(FDBHeader)) != sizeof(FDBHeader) ) {
+ if ( lseek(db->fd, 0, SEEK_SET)!=0 ||
+ write(db->fd, &header, sizeof(FDBHeader)) != sizeof(FDBHeader) ||
+ fsync(db->fd) ) {
close(db->fd);
if ( db->space ) tfree( db->space );
tlog(TL_CRIT,"FDBOpen: can't modify header: %s", strerror(errno));
close(db->fd);
if ( db->space ) tfree( db->space );
tlog(TL_CRIT,"FDBOpen: can't modify header: %s", strerror(errno));
@@
-163,6
+179,7
@@
FDBClose(FDB *db) {
FDBFreeSpace *ptr;
FDBVacuumFreeSpace(db);
FDBFreeSpace *ptr;
FDBVacuumFreeSpace(db);
+
header.lenfreespace = sizeof(FDBFreeSpace)*db->listcur;
ptr = findFreeSpace( db, header.lenfreespace );
header.lenfreespace = sizeof(FDBFreeSpace)*db->listcur;
ptr = findFreeSpace( db, header.lenfreespace );
@@
-172,7
+189,9
@@
FDBClose(FDB *db) {
tlog(TL_CRIT|TL_EXIT,"FDBClose: lseek failed: %s", strerror(errno));
} else {
if ( (header.freespace = lseek(db->fd, 0, SEEK_END)) < 0 )
tlog(TL_CRIT|TL_EXIT,"FDBClose: lseek failed: %s", strerror(errno));
} else {
if ( (header.freespace = lseek(db->fd, 0, SEEK_END)) < 0 )
- tlog(TL_CRIT|TL_EXIT,"FDBClose: lseek failed: %s", strerror(errno));
+ tlog(TL_CRIT|TL_EXIT,"FDBClose: lseek failed: %s", strerror(errno));
+ header.lenfreespace += sizeof(FDBFreeSpace);
+ addFreeSpace(db, header.freespace, header.lenfreespace);
}
if ( write(db->fd, db->space, header.lenfreespace) != header.lenfreespace )
}
if ( write(db->fd, db->space, header.lenfreespace) != header.lenfreespace )
@@
-181,7
+200,9
@@
FDBClose(FDB *db) {
header.isopened=0;
header.isopened=0;
- if ( lseek(db->fd,0,SEEK_SET)!=0 || write(db->fd, &header, sizeof(FDBHeader)) != sizeof(FDBHeader) )
+ if ( lseek(db->fd,0,SEEK_SET)!=0 ||
+ write(db->fd, &header, sizeof(FDBHeader)) != sizeof(FDBHeader) ||
+ fsync(db->fd))
tlog(TL_CRIT|TL_EXIT,"FDBClose: header write failed: %s", strerror(errno));
}
tlog(TL_CRIT|TL_EXIT,"FDBClose: header write failed: %s", strerror(errno));
}
@@
-204,6
+225,7
@@
readLen(FDB *db, off_t offset, size_t *size) {
return FDB_OK;
}
return FDB_OK;
}
+
int
FDBDelete(FDB *db, off_t offset, size_t length) {
if ( db->readonly )
int
FDBDelete(FDB *db, off_t offset, size_t length) {
if ( db->readonly )
@@
-213,15
+235,7
@@
FDBDelete(FDB *db, off_t offset, size_t length) {
if ( readLen(db, offset, &length) != FDB_OK )
return FDB_ERROR;
if ( readLen(db, offset, &length) != FDB_OK )
return FDB_ERROR;
- if ( db->listcur >= db->listlen ) {
- db->listlen *= 2;
- db->space = (FDBFreeSpace*) trealloc( db->space, db->listlen * sizeof(FDBFreeSpace) );
- }
-
- db->space[ db->listcur ].offset=offset;
- db->space[ db->listcur ].length=length;
-
- db->listcur++;
+ addFreeSpace(db, offset, length);
return FDB_OK;
}
return FDB_OK;
}
@@
-286,7
+300,7
@@
FDBPut(FDB *db, FDBRecord *record, off_t *offset ) {
}
if ( write(db->fd, record, record->length) != record->length )
}
if ( write(db->fd, record, record->length) != record->length )
- tlog(TL_CRIT|TL_EXIT,"FDBPut: write
lseek
failed: %s", strerror(errno));
+ tlog(TL_CRIT|TL_EXIT,"FDBPut: write failed: %s", strerror(errno));
return FDB_OK;
return FDB_OK;