mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 14:38:18 +00:00
Clean up and fix semaphores and threading
This commit is contained in:
parent
cd386488e2
commit
705349f2e5
|
@ -526,7 +526,9 @@ void *thread_init(void (*threadfunc)(void *), void *u)
|
||||||
void thread_wait(void *thread)
|
void thread_wait(void *thread)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_UNIX)
|
#if defined(CONF_FAMILY_UNIX)
|
||||||
pthread_join((pthread_t)thread, NULL);
|
int result = pthread_join((pthread_t)thread, NULL);
|
||||||
|
if(result != 0)
|
||||||
|
dbg_msg("thread", "!! %d", result);
|
||||||
#elif defined(CONF_FAMILY_WINDOWS)
|
#elif defined(CONF_FAMILY_WINDOWS)
|
||||||
WaitForSingleObject((HANDLE)thread, INFINITE);
|
WaitForSingleObject((HANDLE)thread, INFINITE);
|
||||||
#else
|
#else
|
||||||
|
@ -534,16 +536,6 @@ void thread_wait(void *thread)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void thread_destroy(void *thread)
|
|
||||||
{
|
|
||||||
#if defined(CONF_FAMILY_UNIX)
|
|
||||||
void *r = 0;
|
|
||||||
pthread_join((pthread_t)thread, &r);
|
|
||||||
#else
|
|
||||||
/*#error not implemented*/
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void thread_yield()
|
void thread_yield()
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_UNIX)
|
#if defined(CONF_FAMILY_UNIX)
|
||||||
|
@ -647,12 +639,7 @@ void lock_unlock(LOCK lock)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONF_FAMILY_UNIX) && !defined(CONF_PLATFORM_MACOSX)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
void sphore_init(SEMAPHORE *sem) { sem_init(sem, 0, 0); }
|
|
||||||
void sphore_wait(SEMAPHORE *sem) { sem_wait(sem); }
|
|
||||||
void sphore_signal(SEMAPHORE *sem) { sem_post(sem); }
|
|
||||||
void sphore_destroy(SEMAPHORE *sem) { sem_destroy(sem); }
|
|
||||||
#elif defined(CONF_FAMILY_WINDOWS)
|
|
||||||
void sphore_init(SEMAPHORE *sem) { *sem = CreateSemaphore(0, 0, 10000, 0); }
|
void sphore_init(SEMAPHORE *sem) { *sem = CreateSemaphore(0, 0, 10000, 0); }
|
||||||
void sphore_wait(SEMAPHORE *sem) { WaitForSingleObject((HANDLE)*sem, INFINITE); }
|
void sphore_wait(SEMAPHORE *sem) { WaitForSingleObject((HANDLE)*sem, INFINITE); }
|
||||||
void sphore_signal(SEMAPHORE *sem) { ReleaseSemaphore((HANDLE)*sem, 1, NULL); }
|
void sphore_signal(SEMAPHORE *sem) { ReleaseSemaphore((HANDLE)*sem, 1, NULL); }
|
||||||
|
@ -666,9 +653,18 @@ void sphore_init(SEMAPHORE *sem)
|
||||||
}
|
}
|
||||||
void sphore_wait(SEMAPHORE *sem) { sem_wait(*sem); }
|
void sphore_wait(SEMAPHORE *sem) { sem_wait(*sem); }
|
||||||
void sphore_signal(SEMAPHORE *sem) { sem_post(*sem); }
|
void sphore_signal(SEMAPHORE *sem) { sem_post(*sem); }
|
||||||
void sphore_destroy(SEMAPHORE *sem) { sem_close(*sem); }
|
void sphore_destroy(SEMAPHORE *sem)
|
||||||
#else
|
{
|
||||||
#error not implemented on this platform
|
char aBuf[64];
|
||||||
|
sem_close(*sem);
|
||||||
|
str_format(aBuf, sizeof(aBuf), "/%d-ddphore-%p", pid(), (void *)sem);
|
||||||
|
sem_unlink(aBuf);
|
||||||
|
}
|
||||||
|
#elif defined(CONF_FAMILY_UNIX)
|
||||||
|
void sphore_init(SEMAPHORE *sem) { sem_init(sem, 0, 0); }
|
||||||
|
void sphore_wait(SEMAPHORE *sem) { sem_wait(sem); }
|
||||||
|
void sphore_signal(SEMAPHORE *sem) { sem_post(sem); }
|
||||||
|
void sphore_destroy(SEMAPHORE *sem) { sem_destroy(sem); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int new_tick = -1;
|
static int new_tick = -1;
|
||||||
|
|
|
@ -387,18 +387,9 @@ void *thread_init(void (*threadfunc)(void *), void *user);
|
||||||
*/
|
*/
|
||||||
void thread_wait(void *thread);
|
void thread_wait(void *thread);
|
||||||
|
|
||||||
/*
|
|
||||||
Function: thread_destroy
|
|
||||||
Destroys a thread.
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
thread - Thread to destroy.
|
|
||||||
*/
|
|
||||||
void thread_destroy(void *thread);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Function: thread_yeild
|
Function: thread_yeild
|
||||||
Yeild the current threads execution slice.
|
Yield the current threads execution slice.
|
||||||
*/
|
*/
|
||||||
void thread_yield();
|
void thread_yield();
|
||||||
|
|
||||||
|
@ -425,15 +416,14 @@ void lock_unlock(LOCK lock);
|
||||||
|
|
||||||
|
|
||||||
/* Group: Semaphores */
|
/* Group: Semaphores */
|
||||||
#if defined(CONF_FAMILY_UNIX)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
#include <semaphore.h>
|
|
||||||
#if defined(CONF_PLATFORM_MACOSX)
|
|
||||||
typedef sem_t* SEMAPHORE;
|
|
||||||
#else
|
|
||||||
typedef sem_t SEMAPHORE;
|
|
||||||
#endif
|
|
||||||
#elif defined(CONF_FAMILY_WINDOWS)
|
|
||||||
typedef void* SEMAPHORE;
|
typedef void* SEMAPHORE;
|
||||||
|
#elif defined(CONF_PLATFORM_MACOSX)
|
||||||
|
#include <semaphore.h>
|
||||||
|
typedef sem_t* SEMAPHORE;
|
||||||
|
#elif defined(CONF_FAMILY_UNIX)
|
||||||
|
#include <semaphore.h>
|
||||||
|
typedef sem_t SEMAPHORE;
|
||||||
#else
|
#else
|
||||||
#error not implemented on this platform
|
#error not implemented on this platform
|
||||||
#endif
|
#endif
|
||||||
|
@ -1274,9 +1264,7 @@ void swap_endian(void *data, unsigned elem_size, unsigned num);
|
||||||
typedef void (*DBG_LOGGER)(const char *line);
|
typedef void (*DBG_LOGGER)(const char *line);
|
||||||
void dbg_logger(DBG_LOGGER logger);
|
void dbg_logger(DBG_LOGGER logger);
|
||||||
|
|
||||||
#if !defined(CONF_PLATFORM_MACOSX)
|
|
||||||
void dbg_enable_threaded();
|
void dbg_enable_threaded();
|
||||||
#endif
|
|
||||||
void dbg_logger_stdout();
|
void dbg_logger_stdout();
|
||||||
void dbg_logger_debugger();
|
void dbg_logger_debugger();
|
||||||
void dbg_logger_file(const char *filename);
|
void dbg_logger_file(const char *filename);
|
||||||
|
|
|
@ -61,21 +61,15 @@
|
||||||
#error missing atomic implementation for this compiler
|
#error missing atomic implementation for this compiler
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONF_PLATFORM_MACOSX)
|
class semaphore
|
||||||
/*
|
{
|
||||||
use semaphore provided by SDL on macosx
|
SEMAPHORE sem;
|
||||||
*/
|
public:
|
||||||
#else
|
semaphore() { sphore_init(&sem); }
|
||||||
class semaphore
|
~semaphore() { sphore_destroy(&sem); }
|
||||||
{
|
void wait() { sphore_wait(&sem); }
|
||||||
SEMAPHORE sem;
|
void signal() { sphore_signal(&sem); }
|
||||||
public:
|
};
|
||||||
semaphore() { sphore_init(&sem); }
|
|
||||||
~semaphore() { sphore_destroy(&sem); }
|
|
||||||
void wait() { sphore_wait(&sem); }
|
|
||||||
void signal() { sphore_signal(&sem); }
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class lock
|
class lock
|
||||||
{
|
{
|
||||||
|
|
|
@ -80,7 +80,6 @@ void CGraphicsBackend_Threaded::StopProcessor()
|
||||||
m_Shutdown = true;
|
m_Shutdown = true;
|
||||||
m_Activity.signal();
|
m_Activity.signal();
|
||||||
thread_wait(m_pThread);
|
thread_wait(m_pThread);
|
||||||
thread_destroy(m_pThread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGraphicsBackend_Threaded::RunBuffer(CCommandBuffer *pBuffer)
|
void CGraphicsBackend_Threaded::RunBuffer(CCommandBuffer *pBuffer)
|
||||||
|
|
|
@ -60,7 +60,6 @@ void CFetcher::QueueAdd(CFetchTask *pTask, const char *pUrl, const char *pDest,
|
||||||
if(!m_pThHandle)
|
if(!m_pThHandle)
|
||||||
{
|
{
|
||||||
m_pThHandle = thread_init(&FetcherThread, this);
|
m_pThHandle = thread_init(&FetcherThread, this);
|
||||||
thread_detach(m_pThHandle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!m_pFirst)
|
if(!m_pFirst)
|
||||||
|
|
|
@ -17,10 +17,7 @@ CJobPool::~CJobPool()
|
||||||
{
|
{
|
||||||
m_Shutdown = true;
|
m_Shutdown = true;
|
||||||
for(int i = 0; i < m_NumThreads; i++)
|
for(int i = 0; i < m_NumThreads; i++)
|
||||||
{
|
|
||||||
thread_wait(m_apThreads[i]);
|
thread_wait(m_apThreads[i]);
|
||||||
thread_destroy(m_apThreads[i]);
|
|
||||||
}
|
|
||||||
lock_destroy(m_Lock);
|
lock_destroy(m_Lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue