Move view open/close into src/lib/common/file.c

Really belongs there, because it manipulates empfile[].

New ef_open_view() to replace ef_init_view().  Make ef_close() cope
with views, and remove ef_fina_view().  Make ef_extend() and
ef_truncate() oops on views.
This commit is contained in:
Markus Armbruster 2008-09-01 10:38:48 -04:00
parent d929aa8b82
commit 62076fbed7
3 changed files with 50 additions and 37 deletions

View file

@ -197,6 +197,7 @@ extern void *ef_ptr(int, int);
extern char *ef_nameof(int);
extern time_t ef_mtime(int);
extern int ef_open(int, int, int);
extern int ef_open_view(int, int);
extern int ef_close(int);
extern int ef_flush(int);
extern void ef_blank(int, int, void *);

View file

@ -193,6 +193,32 @@ ef_realloc_cache(struct empfile *ep, int count)
return 1;
}
/*
* Open the table TYPE as view of table BASE.
* Return non-zero on success, zero on failure.
* Beware: views work only as long as BASE doesn't change size!
* You must call ef_close(TYPE) before closing BASE.
*/
int
ef_open_view(int type, int base)
{
struct empfile *ep;
if (CANT_HAPPEN(!EF_IS_VIEW(type)))
return -1;
ep = &empfile[type];
if (CANT_HAPPEN(!(ef_flags(base) & EFF_MEM)))
return -1;
ep->cache = empfile[base].cache;
ep->csize = empfile[base].csize;
ep->flags |= EFF_MEM;
ep->baseid = empfile[base].baseid;
ep->cids = empfile[base].cids;
ep->fids = empfile[base].fids;
return 0;
}
/*
* Close the file-backed table TYPE (EF_SECTOR, ...).
* Return non-zero on success, zero on failure.
@ -201,25 +227,33 @@ int
ef_close(int type)
{
struct empfile *ep;
int retval;
int retval = 1;
retval = ef_flush(type);
if (ef_check(type) < 0)
return 0;
ep = &empfile[type];
ep->flags &= EFF_IMMUTABLE;
if (!(ep->flags & EFF_STATIC)) {
free(ep->cache);
if (EF_IS_VIEW(type))
ep->cache = NULL;
else {
if (!ef_flush(type))
retval = 0;
ep->flags &= EFF_IMMUTABLE;
if (!(ep->flags & EFF_STATIC)) {
free(ep->cache);
ep->cache = NULL;
}
if (close(ep->fd) < 0) {
logerror("Error closing %s (%s)", ep->file, strerror(errno));
retval = 0;
}
ep->fd = -1;
}
if (close(ep->fd) < 0) {
logerror("Error closing %s (%s)", ep->file, strerror(errno));
retval = 0;
}
ep->fd = -1;
return retval;
}
/*
* Flush table TYPE (EF_SECTOR, ...) to disk.
* Flush file-backed table TYPE (EF_SECTOR, ...) to its backing file.
* Do nothing if the table is privately mapped.
* Update timestamps of written elements if table is EFF_TYPED.
* Return non-zero on success, zero on failure.
@ -557,7 +591,7 @@ ef_extend(int type, int count)
char *p;
int need_sentinel, i, id;
if (ef_check(type) < 0)
if (ef_check(type) < 0 || CANT_HAPPEN(EF_IS_VIEW(type)))
return 0;
ep = &empfile[type];
if (CANT_HAPPEN(count < 0))
@ -652,7 +686,7 @@ ef_truncate(int type, int count)
struct empfile *ep;
int need_sentinel;
if (ef_check(type) < 0)
if (ef_check(type) < 0 || CANT_HAPPEN(EF_IS_VIEW(type)))
return 0;
ep = &empfile[type];
if (CANT_HAPPEN(count < 0 || count > ep->fids))

View file

@ -55,8 +55,6 @@ static struct fileinit fileinit[] = {
static void ef_open_srv(void);
static void ef_close_srv(void);
static int ef_init_view(int, int);
static void ef_fina_view(int);
/*
* Initialize empfile for full server operations.
@ -107,7 +105,7 @@ ef_open_srv(void)
failed |= !ef_open(EF_LOST, 0, -1);
failed |= !ef_open(EF_REALM, EFF_MEM, MAXNOC * MAXNOR);
if (!failed)
failed |= ef_init_view(EF_COUNTRY, EF_NATION);
failed |= ef_open_view(EF_COUNTRY, EF_NATION);
if (failed) {
logerror("Missing files, giving up");
exit(EXIT_FAILURE);
@ -117,7 +115,7 @@ ef_open_srv(void)
static void
ef_close_srv(void)
{
ef_fina_view(EF_COUNTRY);
ef_close(EF_COUNTRY);
ef_close(EF_NATION);
ef_close(EF_SECTOR);
ef_close(EF_SHIP);
@ -136,23 +134,3 @@ ef_close_srv(void)
ef_close(EF_LOST);
ef_close(EF_REALM);
}
static int
ef_init_view(int type, int base)
{
if (CANT_HAPPEN(!(empfile[base].flags & EFF_MEM)))
return -1;
empfile[type].cache = empfile[base].cache;
empfile[type].csize = empfile[base].csize;
empfile[type].flags |= EFF_MEM;
empfile[type].baseid = empfile[base].baseid;
empfile[type].cids = empfile[base].cids;
empfile[type].fids = empfile[base].fids;
return 0;
}
static void
ef_fina_view(int type)
{
empfile[type].cache = NULL;
}