aboutsummaryrefslogtreecommitdiffstats
path: root/Portable
diff options
context:
space:
mode:
Diffstat (limited to 'Portable')
-rw-r--r--Portable/MultiThreading.cpp120
-rw-r--r--Portable/MultiThreading.h86
-rw-r--r--Portable/Networking.h38
3 files changed, 244 insertions, 0 deletions
diff --git a/Portable/MultiThreading.cpp b/Portable/MultiThreading.cpp
new file mode 100644
index 00000000..fd5dc14d
--- /dev/null
+++ b/Portable/MultiThreading.cpp
@@ -0,0 +1,120 @@
+/*
+ * MultiThreading.cpp
+ *****************************************************************************
+ * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved
+ *
+ * Email: libdash-dev@vicky.bitmovin.net
+ *
+ * This source code and its use and distribution, is subject to the terms
+ * and conditions of the applicable license agreement.
+ *****************************************************************************/
+
+#include "MultiThreading.h"
+
+THREAD_HANDLE createThreadPortable(void *(*start_routine) (void *), void *arg)
+{
+#if defined _WIN32 || defined _WIN64
+ return CreateThread (0, 0, (LPTHREAD_START_ROUTINE)start_routine, (LPVOID)arg, 0, 0);
+#else
+ THREAD_HANDLE th = (THREAD_HANDLE)malloc(sizeof(pthread_t));
+ if (!th)
+ {
+ std::cerr << "Error allocating thread." << std::endl;
+ return NULL;
+ }
+
+ if(int err = pthread_create(th, NULL, start_routine, arg))
+ {
+ std::cerr << strerror(err) << std::endl;
+ return NULL;
+ }
+ return th;
+#endif
+}
+void destroyThreadPortable(THREAD_HANDLE th)
+{
+#if !defined _WIN32 && !defined _WIN64
+ if(th)
+ free(th);
+#else
+ CloseHandle(th);
+#endif
+}
+
+/****************************************************************************
+* Condition variables for Windows XP and older windows sytems
+*****************************************************************************/
+#if defined WINXPOROLDER
+void InitCondition (condition_variable_t *cv)
+{
+ InitializeCriticalSection(&cv->waitersCountLock);
+
+ cv->waitersCount = 0;
+ cv->waitGenerationCount = 0;
+ cv->releaseCount = 0;
+
+ cv->waitingEvent = CreateEvent (NULL, // no security
+ TRUE, // manual-reset
+ FALSE, // non-signaled initially
+ NULL); // unnamed
+}
+void WaitCondition (condition_variable_t *cv, CRITICAL_SECTION *externalMutex)
+{
+ EnterCriticalSection(&cv->waitersCountLock);
+
+ cv->waitersCount++;
+
+ int currentGenerationCount = cv->waitGenerationCount;
+
+ LeaveCriticalSection(&cv->waitersCountLock);
+ LeaveCriticalSection(externalMutex);
+
+ bool isWaitDone = false;
+ while(!isWaitDone)
+ {
+ WaitForSingleObject (cv->waitingEvent, INFINITE);
+ EnterCriticalSection (&cv->waitersCountLock);
+
+ isWaitDone = (cv->releaseCount > 0 && cv->waitGenerationCount != currentGenerationCount);
+ LeaveCriticalSection (&cv->waitersCountLock);
+ }
+
+ EnterCriticalSection(externalMutex);
+ EnterCriticalSection(&cv->waitersCountLock);
+
+ cv->waitersCount--;
+ cv->releaseCount--;
+ bool isLastWaiter = (cv->releaseCount == 0);
+
+ LeaveCriticalSection(&cv->waitersCountLock);
+
+ if(isLastWaiter)
+ ResetEvent(cv->waitingEvent);
+}
+void SignalCondition (condition_variable_t *cv)
+{
+ EnterCriticalSection(&cv->waitersCountLock);
+
+ if(cv->waitersCount > cv->releaseCount)
+ {
+ SetEvent(cv->waitingEvent);
+ cv->releaseCount++;
+ cv->waitGenerationCount++;
+ }
+
+ LeaveCriticalSection(&cv->waitersCountLock);
+}
+void BroadcastCondition (condition_variable_t *cv)
+{
+ EnterCriticalSection(&cv->waitersCountLock);
+
+ if(cv->waitersCount > 0)
+ {
+ SetEvent(cv->waitingEvent);
+ cv->releaseCount = cv->waitersCount;
+ cv->waitGenerationCount++;
+ }
+
+ LeaveCriticalSection(&cv->waitersCountLock);
+}
+#endif
diff --git a/Portable/MultiThreading.h b/Portable/MultiThreading.h
new file mode 100644
index 00000000..b959d49e
--- /dev/null
+++ b/Portable/MultiThreading.h
@@ -0,0 +1,86 @@
+/*
+ * MultiThreading.h
+ *****************************************************************************
+ * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved
+ *
+ * Email: libdash-dev@vicky.bitmovin.net
+ *
+ * This source code and its use and distribution, is subject to the terms
+ * and conditions of the applicable license agreement.
+ *****************************************************************************/
+
+#ifndef LIBDASH_FRAMEWORK_PORTABLE_MULTITHREADING_H_
+#define LIBDASH_FRAMEWORK_PORTABLE_MULTITHREADING_H_
+
+#if defined _WIN32 || defined _WIN64
+
+ #define _WINSOCKAPI_
+ #include <Windows.h>
+ #define DeleteConditionVariable(cond_p) {}
+
+ #define PortableSleep(seconds) Sleep(seconds * 1000)
+ #define JoinThread(handle) WaitForSingleObject(handle, INFINITE)
+
+ typedef HANDLE THREAD_HANDLE;
+
+ #if defined WINXPOROLDER
+ /****************************************************************************
+ * Variables
+ *****************************************************************************/
+ struct condition_variable_t
+ {
+ int waitersCount; // Count of the number of waiters.
+ CRITICAL_SECTION waitersCountLock; // Serialize access to <waitersCount>.
+ int releaseCount; // Number of threads to release via a <BroadcastCondition> or a <SignalCondition>.
+ int waitGenerationCount; // Keeps track of the current "generation" so that we don't allow one thread to steal all the "releases" from the broadcast.
+ HANDLE waitingEvent; // A manual-reset event that's used to block and release waiting threads.
+ };
+ /****************************************************************************
+ * Prototypes
+ *****************************************************************************/
+ void InitCondition (condition_variable_t *cv);
+ void WaitCondition (condition_variable_t *cv, CRITICAL_SECTION *externalMutex);
+ void SignalCondition (condition_variable_t *cv);
+ void BroadcastCondition (condition_variable_t *cv);
+ /****************************************************************************
+ * Defines
+ *****************************************************************************/
+ #define CONDITION_VARIABLE condition_variable_t
+
+ #define InitializeConditionVariable(cond_p) InitCondition(cond_p)
+ #define SleepConditionVariableCS(cond_p, mutex_p, infinite) WaitCondition(cond_p, mutex_p) // INFINITE should be handled mor properly
+ #define WakeConditionVariable(cond_p) SignalCondition(cond_p)
+ #define WakeAllConditionVariable(cond_p) BroadcastCondition(cond_p)
+ #endif
+
+#else
+
+ #include <string.h>
+ #include <pthread.h>
+ #include <errno.h>
+ #include <stdlib.h>
+ #include <iostream>
+ #include <unistd.h>
+ #define CRITICAL_SECTION pthread_mutex_t
+ #define CONDITION_VARIABLE pthread_cond_t
+
+ #define PortableSleep(seconds) usleep(seconds * 1000000)
+ #define JoinThread(handle) pthread_join(*(handle), NULL)
+ #define InitializeCriticalSection(mutex_p) pthread_mutex_init(mutex_p, NULL)
+ #define DeleteCriticalSection(mutex_p) pthread_mutex_destroy(mutex_p)
+ #define EnterCriticalSection(mutex_p) pthread_mutex_lock(mutex_p)
+ #define LeaveCriticalSection(mutex_p) pthread_mutex_unlock(mutex_p)
+ #define InitializeConditionVariable(cond_p) pthread_cond_init(cond_p, NULL)
+ #define DeleteConditionVariable(cond_p) pthread_cond_destroy(cond_p)
+ #define SleepConditionVariableCS(cond_p, mutex_p, infinite) pthread_cond_wait(cond_p, mutex_p) // INFINITE should be handled mor properly
+ #define WakeConditionVariable(cond_p) pthread_cond_signal(cond_p)
+ #define WakeAllConditionVariable(cond_p) pthread_cond_broadcast(cond_p)
+
+ typedef pthread_t* THREAD_HANDLE;
+
+#endif
+
+THREAD_HANDLE createThreadPortable(void *(*start_routine) (void *), void *arg);
+void destroyThreadPortable(THREAD_HANDLE th);
+
+#endif // LIBDASH_FRAMEWORK_PORTABLE_MULTITHREADING_H_
diff --git a/Portable/Networking.h b/Portable/Networking.h
new file mode 100644
index 00000000..b7c5d2d3
--- /dev/null
+++ b/Portable/Networking.h
@@ -0,0 +1,38 @@
+/*
+ * Networking.h
+ *****************************************************************************
+ * Copyright (C) 2012, bitmovin Softwareentwicklung OG, All Rights Reserved
+ *
+ * Email: libdash-dev@vicky.bitmovin.net
+ *
+ * This source code and its use and distribution, is subject to the terms
+ * and conditions of the applicable license agreement.
+ *****************************************************************************/
+
+#ifndef PORTABLE_NETWORKING_H_
+#define PORTABLE_NETWORKING_H_
+
+#if defined _WIN32 || defined _WIN64
+
+#include <WinSock2.h>
+#include <WS2tcpip.h>
+
+#else
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/ip.h> /* superset of previous */
+#include <netdb.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define closesocket(socket) close(socket)
+#define WSAStartup(wVersionRequested, lpWSAData) 0
+#define WSACleanup() {}
+
+typedef unsigned char WSADATA;
+
+#endif
+
+#endif // PORTABLE_NETWORKING_H_