diff --git a/projects/main.sh b/projects/main.sh index f7be1af77..ed3effc08 100755 --- a/projects/main.sh +++ b/projects/main.sh @@ -1,4 +1,3 @@ - download_project() { if [ ! -d "3rdparty" ]; then @@ -18,51 +17,54 @@ download_project() build_recast() { ./genie --file=recastnavigation.lua gmake - cd 3rdparty/recast/_project + pushd 3rdparty/recast/_project make - cd ../../.. + popd } build_cmft() { - cd 3rdparty/cmft/scripts + pushd 3rdparty/cmft/scripts cp ../../../genie genie ./genie --file=main.lua --gcc=linux-gcc gmake rm genie cd ../_projects/gmake-linux make config=release64 cmft - cd ../_build/linux64_gcc/bin + cd ../../_build/linux64_gcc/bin ranlib libcmftRelease.a - cd ../../../../../.. + popd } build_luajit() { - cd 3rdparty/luajit/src + pushd 3rdparty/luajit/src make - cd ../../.. + popd } build_nvtt() { - cd 3rdparty/nvtt + pushd 3rdparty/nvtt chmod +x configure ./configure --release make + popd } build_physx() { - cd 3rdparty/physx/physx + pushd 3rdparty/physx/physx sh generate_projects.sh lumix_gcc5 cd compiler/linux-release make + popd } build_freetype() { - cd 3rdparty/freetype + pushd 3rdparty/freetype jam + popd } pause() diff --git a/src/engine/mt/linux/sync.cpp b/src/engine/mt/linux/sync.cpp index d7fb146c7..fc6c342b5 100644 --- a/src/engine/mt/linux/sync.cpp +++ b/src/engine/mt/linux/sync.cpp @@ -5,6 +5,7 @@ #include "engine/mt/thread.h" #include "engine/profiler.h" #include "engine/string.h" +#include namespace Lumix @@ -15,58 +16,106 @@ namespace MT Semaphore::Semaphore(int init_count, int max_count) { - ASSERT(false); - // TODO + m_id.count = init_count; + int res = pthread_mutex_init(&m_id.mutex, nullptr); + ASSERT(res == 0); + res = pthread_cond_init(&m_id.cond, nullptr); + ASSERT(res == 0); } Semaphore::~Semaphore() { - ASSERT(false); - // TODO + int res = pthread_mutex_destroy(&m_id.mutex); + ASSERT(res == 0); + res = pthread_cond_destroy(&m_id.cond); + ASSERT(res == 0); } void Semaphore::signal() { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + res = pthread_cond_signal(&m_id.cond); + ASSERT(res == 0); + ++m_id.count; + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); } void Semaphore::wait() { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + + while(m_id.count <= 0) + { + res = pthread_cond_wait(&m_id.cond, &m_id.mutex); + ASSERT(res == 0); + } + + --m_id.count; + + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); } bool Semaphore::poll() { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + + bool ret = false; + if(m_id.count > 0) + { + --m_id.count; + ret = true; + } + + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); + + return ret; } Event::Event(bool manual_reset) { - ASSERT(false); - // TODO - + m_id.signaled = false; + m_id.manual_reset = manual_reset; + int res = pthread_mutex_init(&m_id.mutex, nullptr); + ASSERT(res == 0); + res = pthread_cond_init(&m_id.cond, nullptr); + ASSERT(res == 0); } Event::~Event() { - ASSERT(false); - // TODO + int res = pthread_mutex_destroy(&m_id.mutex); + ASSERT(res == 0); + res = pthread_cond_destroy(&m_id.cond); + ASSERT(res == 0); } void Event::reset() { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + res = pthread_cond_signal(&m_id.cond); + ASSERT(res == 0); + m_id.signaled = false; + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); } void Event::trigger() { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + res = pthread_cond_signal(&m_id.cond); + ASSERT(res == 0); + m_id.signaled = true; + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); } void Event::waitMultiple(Event& event0, Event& event1, u32 timeout_ms) @@ -77,46 +126,87 @@ void Event::waitMultiple(Event& event0, Event& event1, u32 timeout_ms) void Event::waitTimeout(u32 timeout_ms) { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + + timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += (long)timeout_ms * 1000 * 1000; + if(ts.tv_nsec > 1000000000) + { + ts.tv_nsec -= 1000000000; + ts.tv_sec += 1; + } + while (!m_id.signaled) + { + res = pthread_cond_timedwait(&m_id.cond, &m_id.mutex, &ts); + if(res == ETIMEDOUT) break; + ASSERT(res == 0); + } + + if (!m_id.manual_reset) m_id.signaled = false; + + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); } void Event::wait() { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + + while (!m_id.signaled) + { + res = pthread_cond_wait(&m_id.cond, &m_id.mutex); + ASSERT(res == 0); + } + + if (!m_id.manual_reset) m_id.signaled = false; + + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); } bool Event::poll() { - ASSERT(false); - // TODO + int res = pthread_mutex_lock(&m_id.mutex); + ASSERT(res == 0); + + bool ret = false; + if (m_id.signaled) + { + m_id.signaled = false; + ret = true; + } + + res = pthread_mutex_unlock(&m_id.mutex); + ASSERT(res == 0); + + return ret; } CriticalSection::CriticalSection() { - ASSERT(false); - // TODO + static_assert(sizeof(std::mutex) <= sizeof(data)); + new (NewPlaceholder(), data) std::mutex; } CriticalSection::~CriticalSection() { - ASSERT(false); - // TODO + ((std::mutex*)data)->~mutex(); } void CriticalSection::enter() { - ASSERT(false); - // TODO + ((std::mutex*)data)->lock(); + } void CriticalSection::exit() { - ASSERT(false); - // TODO + ((std::mutex*)data)->~unlock(); }