From: ian Date: Thu, 30 Mar 2006 15:53:38 +0000 (+0000) Subject: fix up opening and closing X-Git-Tag: debian/1.1.1~59 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=commitdiff_plain;h=4622d557f2b46f6a6538cf7e1f17b54f81ef93a1 fix up opening and closing --- diff --git a/cdb/readonly.c b/cdb/readonly.c index 4cf8e22..3bfa98b 100644 --- a/cdb/readonly.c +++ b/cdb/readonly.c @@ -2,17 +2,25 @@ #include "chiark_tcl_cdb.h" -static void destroy_cdb_idtabcb(Tcl_Interp *ip, void *val) { abort(); } - -const IdDataSpec cdbtcl_databases= { - "cdb-db", "cdb-opendatabases-table", destroy_cdb_idtabcb -}; - typedef struct Ro { int ix, fd; struct cdb cdb; } Ro; +static void ro_close(Ro *ro) { + cdb_free(&ro->cdb); + close(ro->fd); +} + +static void destroy_cdb_idtabcb(Tcl_Interp *ip, void *ro_v) { + ro_close(ro_v); + TFREE(ro_v); +} + +const IdDataSpec cdbtcl_databases= { + "cdb-db", "cdb-opendatabases-table", destroy_cdb_idtabcb +}; + int cht_do_cdb_open(ClientData cd, Tcl_Interp *ip, const char *path, void **result) { Ro *ro; @@ -33,10 +41,9 @@ int cht_do_cdb_open(ClientData cd, Tcl_Interp *ip, } int cht_do_cdb_close(ClientData cd, Tcl_Interp *ip, void *ro_v) { - Ro *ro= ro_v; - cdb_free(&ro->cdb); - close(ro->fd); - TFREE(ro); + ro_close(ro_v); + cht_tabledataid_disposing(ip, ro_v, &cdbtcl_databases); + TFREE(ro_v); return TCL_OK; } diff --git a/cdb/writeable.c b/cdb/writeable.c index d5c5c5b..94a7f76 100644 --- a/cdb/writeable.c +++ b/cdb/writeable.c @@ -168,9 +168,9 @@ static int rw_close(Tcl_Interp *ip, Rw *rw) { return rc; } -static void destroy_cdbrw_idtabcb(Tcl_Interp *ip, void *rw) { - rw_close(0,rw); - TFREE(rw); +static void destroy_cdbrw_idtabcb(Tcl_Interp *ip, void *rw_v) { + rw_close(0,rw_v); + TFREE(rw_v); } const IdDataSpec cdbtcl_rwdatabases= { "cdb-rwdb", "cdb-openrwdatabases-table", destroy_cdbrw_idtabcb @@ -746,7 +746,7 @@ int cht_do_cdbwr_close(ClientData cd, Tcl_Interp *ip, void *rw_v) { else rc= TCL_OK; if (!rc) { - if (!rw->logfile) { + if (rw->logfile) { logsz= ftello(rw->logfile); if (logsz < 0) rc= cht_posixerr(ip, errno, "ftell logfile during close info"); @@ -754,7 +754,8 @@ int cht_do_cdbwr_close(ClientData cd, Tcl_Interp *ip, void *rw_v) { rc= infocb(ip, rw, "close", "main=%luby log=%luby", rw->mainsz, logsz); } else if (reccount>=0) { - rc= infocb(ip, rw, "close", "main=%luby nrecs=%l", rw->mainsz, reccount); + rc= infocb(ip, rw, "close", "main=%luby nrecs=%ld", + rw->mainsz, reccount); } else { rc= infocb(ip, rw, "close", "main=%luby", rw->mainsz); }