actually close files

SVN revision: 23535
This commit is contained in:
Carsten Haitzler 2006-06-22 19:21:31 +00:00
parent cce1b3b586
commit ba54808ee8
1 changed files with 15 additions and 12 deletions

View File

@ -160,7 +160,7 @@ eet_cache_add(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc)
int new_cache_alloc; int new_cache_alloc;
new_cache_num = *cache_num; new_cache_num = *cache_num;
if (new_cache_num > 128) /* avoid fd overruns - limit to 128 (most recent) in the cache */ if (new_cache_num >= 64) /* avoid fd overruns - limit to 128 (most recent) in the cache */
{ {
Eet_File *del_ef = NULL; Eet_File *del_ef = NULL;
int i; int i;
@ -188,7 +188,7 @@ eet_cache_add(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc)
new_cache_num++; new_cache_num++;
if (new_cache_num > new_cache_alloc) if (new_cache_num > new_cache_alloc)
{ {
new_cache_alloc += 64; new_cache_alloc += 16;
new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *)); new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *));
if (!new_cache) if (!new_cache)
{ {
@ -229,9 +229,9 @@ eet_cache_del(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc)
for (j = i; j < new_cache_num; j++) for (j = i; j < new_cache_num; j++)
new_cache[j] = new_cache[j + 1]; new_cache[j] = new_cache[j + 1];
if (new_cache_num < (new_cache_alloc - 64)) if (new_cache_num < (new_cache_alloc - 16))
{ {
new_cache_alloc -= 64; new_cache_alloc -= 16;
if (new_cache_num > 0) if (new_cache_num > 0)
{ {
new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *)); new_cache = realloc(new_cache, new_cache_alloc * sizeof(Eet_File *));
@ -362,8 +362,6 @@ eet_flush(Eet_File *ef)
/* no more writes pending */ /* no more writes pending */
ef->writes_pending = 0; ef->writes_pending = 0;
fclose(ef->fp);
ef->fp = NULL;
return EET_ERROR_NONE; return EET_ERROR_NONE;
@ -413,13 +411,13 @@ eet_clearcache(void)
*/ */
for (i = 0; i < eet_writers_num; i++) for (i = 0; i < eet_writers_num; i++)
{ {
if (eet_writers[i]->references == 0) if (eet_writers[i]->references <= 0)
num++; num++;
} }
for (i = 0; i < eet_readers_num; i++) for (i = 0; i < eet_readers_num; i++)
{ {
if (eet_readers[i]->references == 0) if (eet_readers[i]->references <= 0)
num++; num++;
} }
@ -431,18 +429,20 @@ eet_clearcache(void)
num = 0; num = 0;
for (i = 0; i < eet_writers_num; i++) for (i = 0; i < eet_writers_num; i++)
{ {
if (eet_writers[i]->references == 0) if (eet_writers[i]->references <= 0)
{ {
closelist[num] = eet_writers[i]; closelist[num] = eet_writers[i];
eet_writers[i]->delete_me_now = 1;
num++; num++;
} }
} }
for (i = 0; i < eet_readers_num; i++) for (i = 0; i < eet_readers_num; i++)
{ {
if (eet_readers[i]->references == 0) if (eet_readers[i]->references <= 0)
{ {
closelist[num] = eet_readers[i]; closelist[num] = eet_readers[i];
eet_readers[i]->delete_me_now = 1;
num++; num++;
} }
} }
@ -545,6 +545,7 @@ eet_open(const char *file, Eet_File_Mode mode)
ef->data = NULL; ef->data = NULL;
ef->data_size = 0; ef->data_size = 0;
fcntl(fileno(ef->fp), F_SETFD, FD_CLOEXEC);
/* if we opened for read or read-write */ /* if we opened for read or read-write */
if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE)) if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE))
{ {
@ -751,6 +752,7 @@ eet_close(Eet_File *ef)
/* if not urgent to delete it - dont free it - leave it in cache */ /* if not urgent to delete it - dont free it - leave it in cache */
if ((!ef->delete_me_now) && (ef->mode == EET_FILE_MODE_READ)) if ((!ef->delete_me_now) && (ef->mode == EET_FILE_MODE_READ))
return EET_ERROR_NONE; return EET_ERROR_NONE;
/* remove from cache */ /* remove from cache */
if (ef->mode == EET_FILE_MODE_READ) if (ef->mode == EET_FILE_MODE_READ)
eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc); eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
@ -790,11 +792,12 @@ eet_close(Eet_File *ef)
} }
free(ef->header); free(ef->header);
} }
if (ef->data) if (ef->data) munmap(ef->data, ef->data_size);
munmap(ef->data, ef->data_size); if (ef->fp) fclose(ef->fp);
/* zero out ram for struct - caution tactic against stale memory use */ /* zero out ram for struct - caution tactic against stale memory use */
memset(ef, 0, sizeof(Eet_File)); memset(ef, 0, sizeof(Eet_File));
/* free it */ /* free it */
free(ef); free(ef);
return err; return err;