Prechádzať zdrojové kódy

core: add ConditionVariable

Daniele Bartolini 7 rokov pred
rodič
commit
16afa7b1aa

+ 54 - 0
src/core/thread/condition_variable.cpp

@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2012-2018 Daniele Bartolini and individual contributors.
+ * License: https://github.com/dbartolini/crown/blob/master/LICENSE
+ */
+
+#include "core/thread/condition_variable.h"
+
+namespace crown
+{
+ConditionVariable::ConditionVariable()
+{
+#if CROWN_PLATFORM_POSIX
+	int err = pthread_cond_init(&_cond, NULL);
+	CE_ASSERT(err == 0, "pthread_cond_init: errno = %d", err);
+	CE_UNUSED(err);
+#elif CROWN_PLATFORM_WINDOWS
+	InitializeConditionVariable(&_cv);
+#endif
+}
+
+ConditionVariable::~ConditionVariable()
+{
+#if CROWN_PLATFORM_POSIX
+	int err = pthread_cond_destroy(&_cond);
+	CE_ASSERT(err == 0, "pthread_cond_destroy: errno = %d", err);
+	CE_UNUSED(err);
+#elif CROWN_PLATFORM_WINDOWS
+	// Do nothing
+#endif
+}
+
+void ConditionVariable::wait(Mutex& mutex)
+{
+#if CROWN_PLATFORM_POSIX
+	int err = pthread_cond_wait(&_cond, &mutex._mutex);
+	CE_ASSERT(err == 0, "pthread_cond_wait: errno = %d", err);
+	CE_UNUSED(err);
+#elif CROWN_PLATFORM_WINDOWS
+	SleepConditionVariableCS(&_cv, &mutex._cs);
+#endif
+}
+
+void ConditionVariable::signal()
+{
+#if CROWN_PLATFORM_POSIX
+	int err = pthread_cond_signal(&_cond);
+	CE_ASSERT(err == 0, "pthread_cond_signal: errno = %d", err);
+	CE_UNUSED(err);
+#elif CROWN_PLATFORM_WINDOWS
+	WakeConditionVariable(&_cv);
+#endif
+}
+
+} // namespace crown

+ 42 - 0
src/core/thread/condition_variable.h

@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2012-2018 Daniele Bartolini and individual contributors.
+ * License: https://github.com/dbartolini/crown/blob/master/LICENSE
+ */
+
+#pragma once
+
+#include "core/thread/mutex.h"
+
+namespace crown
+{
+/// Condition variable.
+///
+/// @ingroup Thread
+struct ConditionVariable
+{
+#if CROWN_PLATFORM_POSIX
+	pthread_cond_t _cond;
+#elif CROWN_PLATFORM_WINDOWS
+	CONDITION_VARIABLE _cv;
+#endif
+
+	///
+	ConditionVariable();
+
+	///
+	~ConditionVariable();
+
+	///
+	ConditionVariable(const ConditionVariable&) = delete;
+
+	///
+	ConditionVariable& operator=(const ConditionVariable&) = delete;
+
+	///
+	void wait(Mutex& mutex);
+
+	///
+	void signal();
+};
+
+} // namespace crown