summaryrefslogtreecommitdiff
path: root/db-4.8.30/mutex/mut_failchk.c
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2016-12-17 21:28:53 -0800
committerJesse Morgan <jesse@jesterpm.net>2016-12-17 21:28:53 -0800
commit54df2afaa61c6a03cbb4a33c9b90fa572b6d07b8 (patch)
tree18147b92b969d25ffbe61935fb63035cac820dd0 /db-4.8.30/mutex/mut_failchk.c
Berkeley DB 4.8 with rust build script for linux.
Diffstat (limited to 'db-4.8.30/mutex/mut_failchk.c')
-rw-r--r--db-4.8.30/mutex/mut_failchk.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/db-4.8.30/mutex/mut_failchk.c b/db-4.8.30/mutex/mut_failchk.c
new file mode 100644
index 0000000..6fbebde
--- /dev/null
+++ b/db-4.8.30/mutex/mut_failchk.c
@@ -0,0 +1,69 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 2005-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+#include "db_config.h"
+
+#include "db_int.h"
+
+/*
+ * __mut_failchk --
+ * Check for mutexes held by dead processes.
+ *
+ * PUBLIC: int __mut_failchk __P((ENV *));
+ */
+int
+__mut_failchk(env)
+ ENV *env;
+{
+ DB_ENV *dbenv;
+ DB_MUTEX *mutexp;
+ DB_MUTEXMGR *mtxmgr;
+ DB_MUTEXREGION *mtxregion;
+ db_mutex_t i;
+ int ret;
+ char buf[DB_THREADID_STRLEN];
+
+ dbenv = env->dbenv;
+ mtxmgr = env->mutex_handle;
+ mtxregion = mtxmgr->reginfo.primary;
+ ret = 0;
+
+ MUTEX_SYSTEM_LOCK(env);
+ for (i = 1; i <= mtxregion->stat.st_mutex_cnt; ++i, ++mutexp) {
+ mutexp = MUTEXP_SET(mtxmgr, i);
+
+ /*
+ * We're looking for per-process mutexes where the process
+ * has died.
+ */
+ if (!F_ISSET(mutexp, DB_MUTEX_ALLOCATED) ||
+ !F_ISSET(mutexp, DB_MUTEX_PROCESS_ONLY))
+ continue;
+
+ /*
+ * The thread that allocated the mutex may have exited, but
+ * we cannot reclaim the mutex if the process is still alive.
+ */
+ if (dbenv->is_alive(
+ dbenv, mutexp->pid, 0, DB_MUTEX_PROCESS_ONLY))
+ continue;
+
+ __db_msg(env, "Freeing mutex for process: %s",
+ dbenv->thread_id_string(dbenv, mutexp->pid, 0, buf));
+
+ /* Unlock and free the mutex. */
+ if (F_ISSET(mutexp, DB_MUTEX_LOCKED))
+ MUTEX_UNLOCK(env, i);
+
+ if ((ret = __mutex_free_int(env, 0, &i)) != 0)
+ break;
+ }
+ MUTEX_SYSTEM_UNLOCK(env);
+
+ return (ret);
+}