#include "db_config.h"
#include "db_int.h"
#include "dbinc/lock.h"
#include "dbinc/txn.h"
int
__lock_failchk(dbenv)
DB_ENV *dbenv;
{
DB_LOCKER *lip;
DB_LOCKREGION *lrp;
DB_LOCKREQ request;
DB_LOCKTAB *lt;
u_int32_t i;
int ret;
char buf[DB_THREADID_STRLEN];
lt = dbenv->lk_handle;
lrp = lt->reginfo.primary;
retry: LOCK_SYSTEM_LOCK(dbenv);
LOCK_LOCKERS(dbenv, lrp);
ret = 0;
for (i = 0; i < lrp->locker_t_size; i++)
SH_TAILQ_FOREACH(lip, <->locker_tab[i], links, __db_locker) {
if (lip->id >= TXN_MINIMUM)
continue;
if (dbenv->is_alive(dbenv, lip->pid, lip->tid, 0))
continue;
if (lip->nwrites != 0) {
ret = __db_failed(dbenv,
"locker has write locks",
lip->pid, lip->tid);
break;
}
__db_msg(dbenv, "Freeing locks for locker %#lx: %s",
(u_long)lip->id, dbenv->thread_id_string(
dbenv, lip->pid, lip->tid, buf));
LOCK_SYSTEM_UNLOCK(dbenv);
UNLOCK_LOCKERS(dbenv, lrp);
memset(&request, 0, sizeof(request));
request.op = DB_LOCK_PUT_ALL;
if ((ret = __lock_vec(dbenv,
lip, 0, &request, 1, NULL)) != 0)
return (ret);
if ((ret = __lock_freefamilylocker(lt, lip)) != 0)
return (ret);
goto retry;
}
LOCK_SYSTEM_UNLOCK(dbenv);
UNLOCK_LOCKERS(dbenv, lrp);
return (ret);
}