summaryrefslogtreecommitdiff
path: root/bdb/tcl/tcl_mp.c
diff options
context:
space:
mode:
Diffstat (limited to 'bdb/tcl/tcl_mp.c')
-rw-r--r--bdb/tcl/tcl_mp.c194
1 files changed, 118 insertions, 76 deletions
diff --git a/bdb/tcl/tcl_mp.c b/bdb/tcl/tcl_mp.c
index b424deea242..0c4411cb58a 100644
--- a/bdb/tcl/tcl_mp.c
+++ b/bdb/tcl/tcl_mp.c
@@ -1,14 +1,14 @@
/*-
* See the file LICENSE for redistribution information.
*
- * Copyright (c) 1999, 2000
+ * Copyright (c) 1999-2001
* Sleepycat Software. All rights reserved.
*/
#include "db_config.h"
#ifndef lint
-static const char revid[] = "$Id: tcl_mp.c,v 11.24 2001/01/09 16:13:59 sue Exp $";
+static const char revid[] = "$Id: tcl_mp.c,v 11.39 2002/08/06 06:21:27 bostic Exp $";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
@@ -20,7 +20,7 @@ static const char revid[] = "$Id: tcl_mp.c,v 11.24 2001/01/09 16:13:59 sue Exp $
#endif
#include "db_int.h"
-#include "tcl_db.h"
+#include "dbinc/tcl_db.h"
/*
* Prototypes for procedures defined later in this file:
@@ -45,7 +45,7 @@ static int tcl_PgIsset __P((Tcl_Interp *, int, Tcl_Obj * CONST*,
*/
void
_MpInfoDelete(interp, mpip)
- Tcl_Interp *interp; /* Interpreter */
+ Tcl_Interp *interp; /* Interpreter */
DBTCL_INFO *mpip; /* Info for mp */
{
DBTCL_INFO *nextp, *p;
@@ -63,6 +63,7 @@ _MpInfoDelete(interp, mpip)
}
}
+#if CONFIG_TEST
/*
* tcl_MpSync --
*
@@ -76,25 +77,28 @@ tcl_MpSync(interp, objc, objv, envp)
DB_ENV *envp; /* Environment pointer */
{
- DB_LSN lsn;
+ DB_LSN lsn, *lsnp;
int result, ret;
result = TCL_OK;
+ lsnp = NULL;
/*
* No flags, must be 3 args.
*/
- if (objc != 3) {
+ if (objc == 3) {
+ result = _GetLsn(interp, objv[2], &lsn);
+ if (result == TCL_ERROR)
+ return (result);
+ lsnp = &lsn;
+ }
+ else if (objc != 2) {
Tcl_WrongNumArgs(interp, 2, objv, "lsn");
return (TCL_ERROR);
}
- result = _GetLsn(interp, objv[2], &lsn);
- if (result == TCL_ERROR)
- return (result);
-
_debug_check();
- ret = memp_sync(envp, &lsn);
- result = _ReturnSetup(interp, ret, "memp sync");
+ ret = envp->memp_sync(envp, lsnp);
+ result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret), "memp sync");
return (result);
}
@@ -132,8 +136,8 @@ tcl_MpTrickle(interp, objc, objv, envp)
return (result);
_debug_check();
- ret = memp_trickle(envp, percent, &pages);
- result = _ReturnSetup(interp, ret, "memp trickle");
+ ret = envp->memp_trickle(envp, percent, &pages);
+ result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret), "memp trickle");
if (result == TCL_ERROR)
return (result);
@@ -264,29 +268,39 @@ tcl_Mp(interp, objc, objv, envp, envip)
TCL_STATIC);
return (TCL_ERROR);
}
+
+ _debug_check();
+ if ((ret = envp->memp_fcreate(envp, &mpf, 0)) != 0) {
+ result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret), "mpool");
+ _DeleteInfo(ip);
+ goto error;
+ }
+
/*
- * XXX finfop is NULL here. Interface currently doesn't
- * have all the stuff. Should expand interface.
+ * XXX
+ * Interface doesn't currently support DB_MPOOLFILE configuration.
*/
- _debug_check();
- ret = memp_fopen(envp, file, flag, mode, (size_t)pgsize, NULL, &mpf);
- if (ret != 0) {
- result = _ReturnSetup(interp, ret, "mpool");
+ if ((ret = mpf->open(mpf, file, flag, mode, (size_t)pgsize)) != 0) {
+ result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret), "mpool");
_DeleteInfo(ip);
- } else {
- /*
- * Success. Set up return. Set up new info
- * and command widget for this mpool.
- */
- envip->i_envmpid++;
- ip->i_parent = envip;
- ip->i_pgsz = pgsize;
- _SetInfoData(ip, mpf);
- Tcl_CreateObjCommand(interp, newname,
- (Tcl_ObjCmdProc *)mp_Cmd, (ClientData)mpf, NULL);
- res = Tcl_NewStringObj(newname, strlen(newname));
- Tcl_SetObjResult(interp, res);
+
+ (void)mpf->close(mpf, 0);
+ goto error;
}
+
+ /*
+ * Success. Set up return. Set up new info and command widget for
+ * this mpool.
+ */
+ envip->i_envmpid++;
+ ip->i_parent = envip;
+ ip->i_pgsz = pgsize;
+ _SetInfoData(ip, mpf);
+ Tcl_CreateObjCommand(interp, newname,
+ (Tcl_ObjCmdProc *)mp_Cmd, (ClientData)mpf, NULL);
+ res = Tcl_NewStringObj(newname, strlen(newname));
+ Tcl_SetObjResult(interp, res);
+
error:
return (result);
}
@@ -320,8 +334,8 @@ tcl_MpStat(interp, objc, objv, envp)
return (TCL_ERROR);
}
_debug_check();
- ret = memp_stat(envp, &sp, &fsp, NULL);
- result = _ReturnSetup(interp, ret, "memp stat");
+ ret = envp->memp_stat(envp, &sp, &fsp, 0);
+ result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret), "memp stat");
if (result == TCL_ERROR)
return (result);
@@ -333,35 +347,48 @@ tcl_MpStat(interp, objc, objv, envp)
/*
* MAKE_STAT_LIST assumes 'res' and 'error' label.
*/
- MAKE_STAT_LIST("Region size", sp->st_regsize);
MAKE_STAT_LIST("Cache size (gbytes)", sp->st_gbytes);
MAKE_STAT_LIST("Cache size (bytes)", sp->st_bytes);
- MAKE_STAT_LIST("Cache hits", sp->st_cache_hit);
- MAKE_STAT_LIST("Cache misses", sp->st_cache_miss);
MAKE_STAT_LIST("Number of caches", sp->st_ncache);
+ MAKE_STAT_LIST("Region size", sp->st_regsize);
MAKE_STAT_LIST("Pages mapped into address space", sp->st_map);
+ MAKE_STAT_LIST("Cache hits", sp->st_cache_hit);
+ MAKE_STAT_LIST("Cache misses", sp->st_cache_miss);
MAKE_STAT_LIST("Pages created", sp->st_page_create);
MAKE_STAT_LIST("Pages read in", sp->st_page_in);
MAKE_STAT_LIST("Pages written", sp->st_page_out);
MAKE_STAT_LIST("Clean page evictions", sp->st_ro_evict);
MAKE_STAT_LIST("Dirty page evictions", sp->st_rw_evict);
+ MAKE_STAT_LIST("Dirty pages trickled", sp->st_page_trickle);
+ MAKE_STAT_LIST("Cached pages", sp->st_pages);
+ MAKE_STAT_LIST("Cached clean pages", sp->st_page_clean);
+ MAKE_STAT_LIST("Cached dirty pages", sp->st_page_dirty);
MAKE_STAT_LIST("Hash buckets", sp->st_hash_buckets);
MAKE_STAT_LIST("Hash lookups", sp->st_hash_searches);
MAKE_STAT_LIST("Longest hash chain found", sp->st_hash_longest);
MAKE_STAT_LIST("Hash elements examined", sp->st_hash_examined);
- MAKE_STAT_LIST("Cached clean pages", sp->st_page_clean);
- MAKE_STAT_LIST("Cached dirty pages", sp->st_page_dirty);
- MAKE_STAT_LIST("Dirty pages trickled", sp->st_page_trickle);
- MAKE_STAT_LIST("Number of region lock waits", sp->st_region_wait);
+ MAKE_STAT_LIST("Number of hash bucket nowaits", sp->st_hash_nowait);
+ MAKE_STAT_LIST("Number of hash bucket waits", sp->st_hash_wait);
+ MAKE_STAT_LIST("Maximum number of hash bucket waits",
+ sp->st_hash_max_wait);
MAKE_STAT_LIST("Number of region lock nowaits", sp->st_region_nowait);
+ MAKE_STAT_LIST("Number of region lock waits", sp->st_region_wait);
+ MAKE_STAT_LIST("Page allocations", sp->st_alloc);
+ MAKE_STAT_LIST("Buckets examined during allocation",
+ sp->st_alloc_buckets);
+ MAKE_STAT_LIST("Maximum buckets examined during allocation",
+ sp->st_alloc_max_buckets);
+ MAKE_STAT_LIST("Pages examined during allocation", sp->st_alloc_pages);
+ MAKE_STAT_LIST("Maximum pages examined during allocation",
+ sp->st_alloc_max_pages);
+
/*
* Save global stat list as res1. The MAKE_STAT_LIST
* macro assumes 'res' so we'll use that to build up
* our per-file sublist.
*/
res1 = res;
- savefsp = fsp;
- for (; fsp != NULL && *fsp != NULL; fsp++) {
+ for (savefsp = fsp; fsp != NULL && *fsp != NULL; fsp++) {
res = Tcl_NewObj();
result = _SetListElem(interp, res, "File Name",
strlen("File Name"), (*fsp)->file_name,
@@ -369,16 +396,16 @@ tcl_MpStat(interp, objc, objv, envp)
if (result != TCL_OK)
goto error;
MAKE_STAT_LIST("Page size", (*fsp)->st_pagesize);
- MAKE_STAT_LIST("Cache Hits", (*fsp)->st_cache_hit);
- MAKE_STAT_LIST("Cache Misses", (*fsp)->st_cache_miss);
MAKE_STAT_LIST("Pages mapped into address space",
(*fsp)->st_map);
+ MAKE_STAT_LIST("Cache hits", (*fsp)->st_cache_hit);
+ MAKE_STAT_LIST("Cache misses", (*fsp)->st_cache_miss);
MAKE_STAT_LIST("Pages created", (*fsp)->st_page_create);
MAKE_STAT_LIST("Pages read in", (*fsp)->st_page_in);
MAKE_STAT_LIST("Pages written", (*fsp)->st_page_out);
/*
- * Now that we have a complete "per-file" stat
- * list, append that to the other list.
+ * Now that we have a complete "per-file" stat list, append
+ * that to the other list.
*/
result = Tcl_ListObjAppendElement(interp, res1, res);
if (result != TCL_OK)
@@ -386,9 +413,9 @@ tcl_MpStat(interp, objc, objv, envp)
}
Tcl_SetObjResult(interp, res1);
error:
- __os_free(sp, sizeof(*sp));
+ free(sp);
if (savefsp != NULL)
- __os_free(savefsp, 0);
+ free(savefsp);
return (result);
}
@@ -398,17 +425,21 @@ error:
*/
static int
mp_Cmd(clientData, interp, objc, objv)
- ClientData clientData; /* Mp handle */
- Tcl_Interp *interp; /* Interpreter */
- int objc; /* How many arguments? */
- Tcl_Obj *CONST objv[]; /* The argument objects */
+ ClientData clientData; /* Mp handle */
+ Tcl_Interp *interp; /* Interpreter */
+ int objc; /* How many arguments? */
+ Tcl_Obj *CONST objv[]; /* The argument objects */
{
static char *mpcmds[] = {
- "close", "fsync", "get",
+ "close",
+ "fsync",
+ "get",
NULL
};
enum mpcmds {
- MPCLOSE, MPFSYNC, MPGET
+ MPCLOSE,
+ MPFSYNC,
+ MPGET
};
DB_MPOOLFILE *mp;
int cmdindex, length, result, ret;
@@ -447,8 +478,9 @@ mp_Cmd(clientData, interp, objc, objv)
return (TCL_ERROR);
}
_debug_check();
- ret = memp_fclose(mp);
- result = _ReturnSetup(interp, ret, "mp close");
+ ret = mp->close(mp, 0);
+ result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),
+ "mp close");
_MpInfoDelete(interp, mpip);
(void)Tcl_DeleteCommand(interp, mpip->i_name);
_DeleteInfo(mpip);
@@ -459,7 +491,7 @@ mp_Cmd(clientData, interp, objc, objv)
return (TCL_ERROR);
}
_debug_check();
- ret = memp_fsync(mp);
+ ret = mp->sync(mp);
res = Tcl_NewIntObj(ret);
break;
case MPGET:
@@ -487,11 +519,15 @@ tcl_MpGet(interp, objc, objv, mp, mpip)
DBTCL_INFO *mpip; /* mp info pointer */
{
static char *mpget[] = {
- "-create", "-last", "-new",
+ "-create",
+ "-last",
+ "-new",
NULL
};
enum mpget {
- MPGET_CREATE, MPGET_LAST, MPGET_NEW
+ MPGET_CREATE,
+ MPGET_LAST,
+ MPGET_NEW
};
DBTCL_INFO *ip;
@@ -559,8 +595,8 @@ tcl_MpGet(interp, objc, objv, mp, mpip)
}
_debug_check();
pgno = ipgno;
- ret = memp_fget(mp, &pgno, flag, &page);
- result = _ReturnSetup(interp, ret, "mpool get");
+ ret = mp->get(mp, &pgno, flag, &page);
+ result = _ReturnSetup(interp, ret, DB_RETOK_MPGET(ret), "mpool get");
if (result == TCL_ERROR)
_DeleteInfo(ip);
else {
@@ -588,10 +624,10 @@ error:
*/
static int
pg_Cmd(clientData, interp, objc, objv)
- ClientData clientData; /* Page handle */
- Tcl_Interp *interp; /* Interpreter */
- int objc; /* How many arguments? */
- Tcl_Obj *CONST objv[]; /* The argument objects */
+ ClientData clientData; /* Page handle */
+ Tcl_Interp *interp; /* Interpreter */
+ int objc; /* How many arguments? */
+ Tcl_Obj *CONST objv[]; /* The argument objects */
{
static char *pgcmds[] = {
"init",
@@ -648,7 +684,7 @@ pg_Cmd(clientData, interp, objc, objv)
res = NULL;
switch ((enum pgcmds)cmdindex) {
case PGNUM:
- res = Tcl_NewIntObj(pgip->i_pgno);
+ res = Tcl_NewLongObj((long)pgip->i_pgno);
break;
case PGSIZE:
res = Tcl_NewLongObj(pgip->i_pgsz);
@@ -685,11 +721,15 @@ tcl_Pg(interp, objc, objv, page, mp, pgip, putop)
int putop; /* Operation */
{
static char *pgopt[] = {
- "-clean", "-dirty", "-discard",
+ "-clean",
+ "-dirty",
+ "-discard",
NULL
};
enum pgopt {
- PGCLEAN, PGDIRTY, PGDISCARD
+ PGCLEAN,
+ PGDIRTY,
+ PGDISCARD
};
u_int32_t flag;
int i, optindex, result, ret;
@@ -717,11 +757,11 @@ tcl_Pg(interp, objc, objv, page, mp, pgip, putop)
_debug_check();
if (putop)
- ret = memp_fput(mp, page, flag);
+ ret = mp->put(mp, page, flag);
else
- ret = memp_fset(mp, page, flag);
+ ret = mp->set(mp, page, flag);
- result = _ReturnSetup(interp, ret, "page");
+ result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret), "page");
if (putop) {
(void)Tcl_DeleteCommand(interp, pgip->i_name);
@@ -756,7 +796,8 @@ tcl_PgInit(interp, objc, objv, page, pgip)
s = Tcl_GetByteArrayFromObj(objv[2], &length);
if (s == NULL)
return (TCL_ERROR);
- memcpy(page, s, ((size_t)length < pgsz) ? length : pgsz);
+ memcpy(page, s,
+ ((size_t)length < pgsz) ? (size_t)length : pgsz);
result = TCL_OK;
} else {
p = (long *)page;
@@ -795,8 +836,8 @@ tcl_PgIsset(interp, objc, objv, page, pgip)
return (TCL_ERROR);
result = TCL_OK;
- if (memcmp(page,
- s, ((size_t)length < pgsz) ? length : pgsz ) != 0) {
+ if (memcmp(page, s,
+ ((size_t)length < pgsz) ? (size_t)length : pgsz ) != 0) {
res = Tcl_NewIntObj(0);
Tcl_SetObjResult(interp, res);
return (result);
@@ -820,3 +861,4 @@ tcl_PgIsset(interp, objc, objv, page, pgip)
Tcl_SetObjResult(interp, res);
return (result);
}
+#endif