summaryrefslogtreecommitdiffstats
path: root/sys/dev/raidframe/rf_mcpair.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/raidframe/rf_mcpair.c')
-rw-r--r--sys/dev/raidframe/rf_mcpair.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/sys/dev/raidframe/rf_mcpair.c b/sys/dev/raidframe/rf_mcpair.c
new file mode 100644
index 0000000..ff233fe
--- /dev/null
+++ b/sys/dev/raidframe/rf_mcpair.c
@@ -0,0 +1,141 @@
+/* $FreeBSD$ */
+/* $NetBSD: rf_mcpair.c,v 1.4 2000/09/11 02:23:14 oster Exp $ */
+/*
+ * Copyright (c) 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Author: Jim Zelenka
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/* rf_mcpair.c
+ * an mcpair is a structure containing a mutex and a condition variable.
+ * it's used to block the current thread until some event occurs.
+ */
+
+#include <dev/raidframe/rf_types.h>
+#include <dev/raidframe/rf_threadstuff.h>
+#include <dev/raidframe/rf_mcpair.h>
+#include <dev/raidframe/rf_debugMem.h>
+#include <dev/raidframe/rf_freelist.h>
+#include <dev/raidframe/rf_shutdown.h>
+
+#include <sys/proc.h>
+
+static RF_FreeList_t *rf_mcpair_freelist;
+
+#define RF_MAX_FREE_MCPAIR 128
+#define RF_MCPAIR_INC 16
+#define RF_MCPAIR_INITIAL 24
+
+static int init_mcpair(RF_MCPair_t *);
+static void clean_mcpair(RF_MCPair_t *);
+static void rf_ShutdownMCPair(void *);
+
+
+
+static int
+init_mcpair(t)
+ RF_MCPair_t *t;
+{
+ int rc;
+
+ rc = rf_mutex_init(&t->mutex, __FUNCTION__);
+ if (rc) {
+ RF_ERRORMSG3("Unable to init mutex file %s line %d rc=%d\n", __FILE__,
+ __LINE__, rc);
+ return (rc);
+ }
+ rc = rf_cond_init(&t->cond);
+ if (rc) {
+ RF_ERRORMSG3("Unable to init cond file %s line %d rc=%d\n", __FILE__,
+ __LINE__, rc);
+ rf_mutex_destroy(&t->mutex);
+ return (rc);
+ }
+ return (0);
+}
+
+static void
+clean_mcpair(t)
+ RF_MCPair_t *t;
+{
+ rf_mutex_destroy(&t->mutex);
+ rf_cond_destroy(&t->cond);
+}
+
+static void
+rf_ShutdownMCPair(ignored)
+ void *ignored;
+{
+ RF_FREELIST_DESTROY_CLEAN(rf_mcpair_freelist, next, (RF_MCPair_t *), clean_mcpair);
+}
+
+int
+rf_ConfigureMCPair(listp)
+ RF_ShutdownList_t **listp;
+{
+ int rc;
+
+ RF_FREELIST_CREATE(rf_mcpair_freelist, RF_MAX_FREE_MCPAIR,
+ RF_MCPAIR_INC, sizeof(RF_MCPair_t));
+ rc = rf_ShutdownCreate(listp, rf_ShutdownMCPair, NULL);
+ if (rc) {
+ RF_ERRORMSG3("Unable to add to shutdown list file %s line %d rc=%d\n",
+ __FILE__, __LINE__, rc);
+ rf_ShutdownMCPair(NULL);
+ return (rc);
+ }
+ RF_FREELIST_PRIME_INIT(rf_mcpair_freelist, RF_MCPAIR_INITIAL, next,
+ (RF_MCPair_t *), init_mcpair);
+ return (0);
+}
+
+RF_MCPair_t *
+rf_AllocMCPair()
+{
+ RF_MCPair_t *t;
+
+ RF_FREELIST_GET_INIT(rf_mcpair_freelist, t, next, (RF_MCPair_t *), init_mcpair);
+ if (t) {
+ t->flag = 0;
+ t->next = NULL;
+ }
+ return (t);
+}
+
+void
+rf_FreeMCPair(t)
+ RF_MCPair_t *t;
+{
+ RF_FREELIST_FREE_CLEAN(rf_mcpair_freelist, t, next, clean_mcpair);
+}
+/* the callback function used to wake you up when you use an mcpair to wait for something */
+void
+rf_MCPairWakeupFunc(mcpair)
+ RF_MCPair_t *mcpair;
+{
+ RF_LOCK_MUTEX(mcpair->mutex);
+ mcpair->flag = 1;
+ wakeup(&(mcpair->cond));
+ RF_UNLOCK_MUTEX(mcpair->mutex);
+}
OpenPOWER on IntegriCloud