From 47c7c8177df177cfc433fd4919d362d21d8548e5 Mon Sep 17 00:00:00 2001
From: mpc <mpc>
Date: Fri, 25 Jun 2004 22:22:48 +0000
Subject: [PATCH] Mutex code (untested)

---
 apps/enclave/Makefile      |   7 +++
 apps/enclave/src/mutex.cpp | 100 +++++++++++++++++++++++++++++++++++++
 apps/enclave/src/mutex.hpp |  49 ++++++++++++++++++
 3 files changed, 156 insertions(+)
 create mode 100644 apps/enclave/src/mutex.cpp
 create mode 100644 apps/enclave/src/mutex.hpp

diff --git a/apps/enclave/Makefile b/apps/enclave/Makefile
index c3e5b5527b..948eaa9aa9 100644
--- a/apps/enclave/Makefile
+++ b/apps/enclave/Makefile
@@ -3,6 +3,12 @@
 # (Tested on Debian 3.0)
 #
 
+#
+# Your operating environment
+#
+
+OS = CYGWIN
+
 #
 # Directories
 #
@@ -27,6 +33,7 @@ CC = g++
 #
 
 CFLAGS = -g -march=i486 -pipe -Wall
+CFLAGS += -DOS=$(OS)
 
 #
 # Libraries
diff --git a/apps/enclave/src/mutex.cpp b/apps/enclave/src/mutex.cpp
new file mode 100644
index 0000000000..8d8d2cc3aa
--- /dev/null
+++ b/apps/enclave/src/mutex.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the author nor the names of any contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "platform.hpp"
+#include "mutex.hpp"
+
+Mutex::Mutex(void)
+{
+#ifdef WINTHREADS
+	mutex = CreateMutex(NULL, false, NULL);
+	if (mutex == NULL) {
+		LERROR << strerror(rc) << '\n';
+		throw runtime_error(strerror(rc));
+	}
+#else
+	int rc = pthread_mutex_init(&mutex, NULL);
+	if (rc != 0) {
+		LERROR << strerror(rc) << '\n';
+		throw runtime_error(strerror(rc));
+	}
+#endif
+}
+
+Mutex::~Mutex(void)
+{
+#ifdef WINTHREADS
+	if (!CloseHandle(mutex)) {
+		TCHAR str[80];
+		LERROR << win_strerror(str, sizeof str) << '\n';
+		throw runtime_error(str);
+	}
+#else
+	int rc = pthread_mutex_destroy(&mutex);
+	if (rc != 0) {
+		LERROR << strerror(rc) << '\n';
+		throw runtime_error(strerror(rc));
+	}
+#endif
+}
+
+void Mutex::lock(void)
+{
+#ifdef WINTHREADS
+	if (WaitForSingleObject(mutex, INFINITE) == WAIT_FAILED) {
+		TCHAR str[80];
+		LERROR << win_strerror(str, sizeof str) << '\n';
+		throw runtime_error(str);
+	}
+#else
+	int rc = pthread_mutex_lock(&mutex);
+	if (rc != 0) {
+		LERROR << strerror(rc) << '\n';
+		throw runtime_error(strerror(rc));
+	}
+#endif
+}
+
+void Mutex::unlock(void)
+{
+#ifdef WINTHREADS
+	if (!ReleaseMutex(mutex)) {
+		TCHAR str[80];
+		LERROR << win_strerror(str, sizeof str) << '\n';
+		throw runtime_error(str);
+	}
+#else
+	int rc = pthread_mutex_unlock(&mutex);
+	if (rc != 0) {
+		LERROR << strerror(rc) << '\n';
+		throw runtime_error(strerror(rc));
+	}
+#endif
+}
diff --git a/apps/enclave/src/mutex.hpp b/apps/enclave/src/mutex.hpp
new file mode 100644
index 0000000000..8085139b01
--- /dev/null
+++ b/apps/enclave/src/mutex.hpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the author nor the names of any contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MUTEX_HPP
+#define MUTEX_HPP
+
+class Mutex {
+	public:
+		Mutex(void);
+		~Mutex(void);
+
+		void lock(void);
+		void unlock(void);
+	private:
+#ifdef WINTHREADS
+		HANDLE mutex;
+#else
+		pthread_mutex_t mutex;
+#endif
+};
+
+#endif  // MUTEX_HPP
-- 
GitLab