76 lines
1.3 KiB
C
76 lines
1.3 KiB
C
/*
|
|
* Windows threads
|
|
*/
|
|
#ifndef __al_included_allegro5_aintwthr_h
|
|
#define __al_included_allegro5_aintwthr_h
|
|
|
|
#include <windows.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* threads */
|
|
struct _AL_THREAD
|
|
{
|
|
/* private: */
|
|
HANDLE thread;
|
|
CRITICAL_SECTION cs;
|
|
bool should_stop; /* XXX: use a dedicated terminate Event object? */
|
|
void (*proc)(struct _AL_THREAD *self, void *arg);
|
|
void *arg;
|
|
};
|
|
|
|
struct _AL_MUTEX
|
|
{
|
|
PCRITICAL_SECTION cs;
|
|
};
|
|
|
|
#define _AL_MUTEX_UNINITED { NULL }
|
|
#define _AL_MARK_MUTEX_UNINITED(M) do { M.cs = NULL; } while (0)
|
|
|
|
struct _AL_COND
|
|
{
|
|
long nWaitersBlocked;
|
|
long nWaitersGone;
|
|
long nWaitersToUnblock;
|
|
HANDLE semBlockQueue;
|
|
CRITICAL_SECTION semBlockLock;
|
|
CRITICAL_SECTION mtxUnblockLock;
|
|
};
|
|
|
|
typedef struct ALLEGRO_TIMEOUT_WIN ALLEGRO_TIMEOUT_WIN;
|
|
struct ALLEGRO_TIMEOUT_WIN
|
|
{
|
|
DWORD abstime;
|
|
};
|
|
|
|
|
|
AL_INLINE(bool, _al_get_thread_should_stop, (struct _AL_THREAD *t),
|
|
{
|
|
bool ret;
|
|
EnterCriticalSection(&t->cs);
|
|
ret = t->should_stop;
|
|
LeaveCriticalSection(&t->cs);
|
|
return ret;
|
|
})
|
|
|
|
AL_INLINE(void, _al_mutex_lock, (struct _AL_MUTEX *m),
|
|
{
|
|
if (m->cs)
|
|
EnterCriticalSection(m->cs);
|
|
})
|
|
AL_INLINE(void, _al_mutex_unlock, (struct _AL_MUTEX *m),
|
|
{
|
|
if (m->cs)
|
|
LeaveCriticalSection(m->cs);
|
|
})
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|