X-Git-Url: http://git.csclub.uwaterloo.ca/?p=kopensolaris-gnu%2Fglibc.git;a=blobdiff_plain;f=db2%2Flog%2Flog_rec.c;h=5deac46298f79b73ce269800bdbcd0f0400f3afd;hp=f49a7f16ead5564cc596a886de2ab49080aa7240;hb=db40eb3dd943d60ce7470958329720f94ba25158;hpb=f00167b3681f81ce890c005d057cf464b222bfcf diff --git a/db2/log/log_rec.c b/db2/log/log_rec.c index f49a7f16ea..5deac46298 100644 --- a/db2/log/log_rec.c +++ b/db2/log/log_rec.c @@ -1,7 +1,7 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997 + * Copyright (c) 1996, 1997, 1998 * Sleepycat Software. All rights reserved. */ /* @@ -40,16 +40,13 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)log_rec.c 10.13 (Sleepycat) 8/27/97"; +static const char sccsid[] = "@(#)log_rec.c 10.20 (Sleepycat) 4/28/98"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES #include #include -#include -#include -#include #include #endif @@ -80,77 +77,58 @@ __log_register_recover(logp, dbtp, lsnp, redo, info) #ifdef DEBUG_RECOVER __log_register_print(logp, dbtp, lsnp, redo, info); #endif - info = info; /* XXX: Shut the compiler up. */ - lsnp = lsnp; + COMPQUIET(info, NULL); + COMPQUIET(lsnp, NULL); F_SET(logp, DB_AM_RECOVER); if ((ret = __log_register_read(dbtp->data, &argp)) != 0) goto out; - ret = __log_open_file(logp, - argp->uid.data, argp->name.data, argp->ftype, argp->id); - if (ret == ENOENT) { - if (redo == TXN_OPENFILES) - __db_err(logp->dbenv, - "warning: file %s not found", argp->name.data); - ret = 0; - } - -out: F_CLR(logp, DB_AM_RECOVER); - if (argp != NULL) - free(argp); - return (ret); -} - -/* - * PUBLIC: int __log_unregister_recover - * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); - */ -int -__log_unregister_recover(logp, dbtp, lsnp, redo, info) - DB_LOG *logp; - DBT *dbtp; - DB_LSN *lsnp; - int redo; - void *info; -{ - __log_unregister_args *argp; - int ret; - -#ifdef DEBUG_RECOVER - __log_unregister_print(logp, dbtp, lsnp, redo, info); -#endif - info = info; /* XXX: Shut the compiler up. */ - lsnp = lsnp; - - if (redo == TXN_OPENFILES || - redo == TXN_BACKWARD_ROLL || redo == TXN_UNDO) - return (0); - - F_SET(logp, DB_AM_RECOVER); - if ((ret = __log_unregister_read(dbtp->data, &argp)) != 0) - goto out; - - /* - * If the file is deleted, then we can just ignore this close. - * Otherwise, we'd better have a valid dbp that we should either - * close or whose reference count should be decremented. - */ - LOCK_LOGTHREAD(logp); - if (logp->dbentry[argp->id].dbp == NULL) { - if (!logp->dbentry[argp->id].deleted) - ret = EINVAL; - } else if (--logp->dbentry[argp->id].refcount == 0) { - ret = logp->dbentry[argp->id].dbp->close( - logp->dbentry[argp->id].dbp, 0); - logp->dbentry[argp->id].dbp = NULL; + if ((argp->opcode == LOG_CHECKPOINT && redo == TXN_OPENFILES) || + (argp->opcode == LOG_OPEN && + (redo == TXN_REDO || redo == TXN_OPENFILES || + redo == TXN_FORWARD_ROLL)) || + (argp->opcode == LOG_CLOSE && + (redo == TXN_UNDO || redo == TXN_BACKWARD_ROLL))) { + /* + * If we are redoing an open or undoing a close, then we need + * to open a file. + */ + ret = __log_open_file(logp, + argp->uid.data, argp->name.data, argp->ftype, argp->id); + if (ret == ENOENT) { + if (redo == TXN_OPENFILES) + __db_err(logp->dbenv, + "warning: file %s not found", + argp->name.data); + ret = 0; + } + } else if (argp->opcode != LOG_CHECKPOINT) { + /* + * If we are redoing a close or undoing an open, then we need + * to close the file. + * + * If the file is deleted, then we can just ignore this close. + * Otherwise, we'd better have a valid dbp that we should either + * close or whose reference count should be decremented. + */ + LOCK_LOGTHREAD(logp); + if (logp->dbentry[argp->id].dbp == NULL) { + if (!logp->dbentry[argp->id].deleted) + ret = EINVAL; + } else if (--logp->dbentry[argp->id].refcount == 0) { + F_SET(logp->dbentry[argp->id].dbp, DB_AM_RECOVER); + ret = logp->dbentry[argp->id].dbp->close( + logp->dbentry[argp->id].dbp, 0); + logp->dbentry[argp->id].dbp = NULL; + } + UNLOCK_LOGTHREAD(logp); } - UNLOCK_LOGTHREAD(logp); out: F_CLR(logp, DB_AM_RECOVER); if (argp != NULL) - free(argp); + __db_free(argp); return (ret); } @@ -227,14 +205,14 @@ __log_add_logid(logp, dbp, ndx) */ if (logp->dbentry_cnt <= ndx) { if (logp->dbentry_cnt == 0) { - logp->dbentry = - (DB_ENTRY *)malloc(DB_GROW_SIZE * sizeof(DB_ENTRY)); + logp->dbentry = (DB_ENTRY *) + __db_malloc(DB_GROW_SIZE * sizeof(DB_ENTRY)); if (logp->dbentry == NULL) { ret = ENOMEM; goto err; } } else { - temp_entryp = (DB_ENTRY *)realloc(logp->dbentry, + temp_entryp = (DB_ENTRY *)__db_realloc(logp->dbentry, (DB_GROW_SIZE + logp->dbentry_cnt) * sizeof(DB_ENTRY)); if (temp_entryp == NULL) {