aboutsummaryrefslogtreecommitdiff
path: root/build/03Thread/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'build/03Thread/main.cpp')
-rw-r--r--build/03Thread/main.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/build/03Thread/main.cpp b/build/03Thread/main.cpp
new file mode 100644
index 0000000..ed12172
--- /dev/null
+++ b/build/03Thread/main.cpp
@@ -0,0 +1,154 @@
+//#include <SDL2/SDL.h>
+//#include <SDL2/SDL_thread.h>
+//#include <iostream>
+//#include <sstream>
+//#include <stdexcept>
+//
+//class SdlMutex
+//{
+//public:
+// SdlMutex()
+// {
+// mutex = SDL_CreateMutex();
+// if (!mutex) throw std::runtime_error("SDL_CreateMutex == NULL");
+// }
+//
+// ~SdlMutex()
+// {
+// SDL_DestroyMutex(mutex);
+// }
+//
+// void lock()
+// {
+// if (SDL_mutexP(mutex) == -1) throw std::runtime_error("SDL_mutexP == -1");
+// // Note:
+// // -1 does not mean it was already locked - it means there was an error in locking -
+// // if it was locked it will just block - see SDL_mutexP(3)
+// }
+//
+// void unlock()
+// {
+// if (SDL_mutexV(mutex) == -1) throw std::runtime_error("SDL_mutexV == -1");
+// }
+//
+// SDL_mutex* underlying()
+// {
+// return mutex;
+// }
+//private:
+// SDL_mutex* mutex;
+//};
+//
+//class SdlScopedLock
+//{
+//public:
+// SdlScopedLock(SdlMutex& mutex)
+// :
+// mutex(mutex)
+// {
+// mutex.lock();
+// }
+// ~SdlScopedLock()
+// {
+// try
+// {
+// this->unlock();
+// }
+// catch (const std::exception& e)
+// {
+// // Destructors should never throw ...
+// std::cerr << "SdlScopedLock::~SdlScopedLock - caught : " << e.what() << std::endl;
+// }
+// }
+// void unlock()
+// {
+// mutex.unlock();
+// }
+//private:
+// SdlMutex& mutex;
+//};
+//
+//class ThreadData
+//{
+//public:
+// ThreadData()
+// :
+// dataReady(false),
+// done(false)
+// {
+// condition = SDL_CreateCond();
+// }
+//
+// ~ThreadData()
+// {
+// SDL_DestroyCond(condition);
+// }
+//
+// // Using stringstream so I can just shift on integers...
+// std::stringstream data;
+// bool dataReady;
+// bool done;
+// SdlMutex mutex;
+// SDL_cond* condition;
+//};
+//
+//int threadFunction(void* data)
+//{
+// try
+// {
+// ThreadData* threadData = static_cast< ThreadData* >(data);
+//
+// for (size_t i = 0; i < 100; i++)
+// {
+// {
+// SdlScopedLock lock(threadData->mutex);
+// // Everything in this scope is now syncronized with the mutex
+// if (i != 0) threadData->data << ", ";
+// threadData->data << i;
+// threadData->dataReady = true;
+// } // threadData->mutex is automatically unlocked here
+// // Its important to note that condition should be signaled after mutex is unlocked
+// if (SDL_CondSignal(threadData->condition) == -1) throw std::runtime_error("Failed to signal");
+// }
+// {
+// SdlScopedLock lock(threadData->mutex);
+// threadData->done = true;
+// }
+// if (SDL_CondSignal(threadData->condition) == -1) throw std::runtime_error("Failed to signal");
+// return 0;
+// }
+// catch (const std::exception& e)
+// {
+// std::cerr << "Caught : " << e.what() << std::endl;
+// return 1;
+// }
+//}
+//
+//int main(int argc, char* argv[])
+//{
+// ThreadData threadData;
+// SDL_Thread* thread = SDL_CreateThread(threadFunction, "", &threadData);
+//
+// while (true)
+// {
+// SdlScopedLock lock(threadData.mutex);
+// while (threadData.dataReady == false && threadData.done == false)
+// {
+// // NOTE: must call condition wait with mutex already locked
+// if (SDL_CondWait(threadData.condition, threadData.mutex.underlying()) == -1) throw std::runtime_error("Failed to wait");
+// }
+// // once dataReady == true or threadData.done == true we get here
+// std::cout << "Got data = " << threadData.data.str() << std::endl;
+// threadData.data.str("");
+// threadData.dataReady = false;
+// if (threadData.done)
+// {
+// std::cout << "child done - ending" << std::endl;
+// break;
+// }
+// }
+//
+// int status = 99;
+// SDL_WaitThread(thread, &status);
+// std::cerr << "Thread completed with : " << status << std::endl;
+//} \ No newline at end of file