25 static char *
t =
"TRUE";
26 static char *
f =
"FALSE";
45 SDL_Log(
"\nspin lock---------------------------------------\n\n");
48 SDL_Log(
"AtomicLock lock=%d\n", lock);
50 SDL_Log(
"AtomicUnlock lock=%d\n", lock);
52 SDL_Log(
"\natomic -----------------------------------------\n\n");
99 #define VALBITS (sizeof(atomicValue)*8) 101 #define atomicValue int 102 #define CountTo ((atomicValue)((unsigned int)(1<<(VALBITS-1))-1)) 103 #define NInter (CountTo/CountInc/NThreads) 104 #define Expect (CountTo-NInter*CountInc*NThreads) 152 SDL_Log(
"Finished in %f sec\n", (end - start) / 1000.
f);
161 SDL_Log(
"\nepic test---------------------------------------\n\n");
163 SDL_Log(
"Size asserted to be >= 32-bit\n");
166 SDL_Log(
"Check static initializer\n");
172 SDL_Log(
"Test negative values\n");
177 SDL_Log(
"Verify maximum value\n");
182 SDL_Log(
"Test compare and exchange\n");
206 SDL_Log(
"Test Add (Negative values)\n");
223 SDL_Log(
"Reset before count down test\n");
249 #define TEST_SPINLOCK_FIFO 251 #define NUM_READERS 4 252 #define NUM_WRITERS 4 253 #define EVENTS_PER_WRITER 1000000 256 #define MAX_ENTRIES 256 257 #define WRAP_MASK (MAX_ENTRIES-1) 279 #ifdef TEST_SPINLOCK_FIFO 303 #ifdef TEST_SPINLOCK_FIFO 319 #ifdef TEST_SPINLOCK_FIFO 332 delta = (int)(entry_seq - queue_pos);
342 }
else if (delta < 0) {
352 #ifdef TEST_SPINLOCK_FIFO 366 #ifdef TEST_SPINLOCK_FIFO 379 delta = (int)(entry_seq - (queue_pos + 1));
384 *
event = entry->
event;
389 }
else if (delta < 0) {
399 #ifdef TEST_SPINLOCK_FIFO 419 delta = (int)(entry_seq - queue_pos);
427 }
else if (delta < 0) {
430 SDL_Log(
"ERROR: mutex failed!\n");
452 delta = (int)(entry_seq - (queue_pos + 1));
457 *
event = entry->
event;
460 }
else if (delta < 0) {
463 SDL_Log(
"ERROR: mutex failed!\n");
503 event.user.windowID = 0;
505 event.user.data1 =
data;
506 event.user.data2 =
NULL;
568 #ifdef TEST_SPINLOCK_FIFO 599 char textBuffer[1024];
602 SDL_Log(
"\nFIFO test---------------------------------------\n\n");
603 SDL_Log(
"Mode: %s\n", lock_free ?
"LockFree" :
"Mutex");
617 #ifdef TEST_SPINLOCK_FIFO 631 readerData[
i].
queue = &queue;
643 writerData[
i].
queue = &queue;
671 SDL_Log(
"Finished in %f sec\n", (end - start) / 1000.
f);
687 grand_total += total;
688 SDL_Log(
"Reader %d read %d events, had %d waits\n", i, total, readerData[i].waits);
693 SDL_snprintf(textBuffer + len,
sizeof(textBuffer) - len,
", ");
699 SDL_snprintf(textBuffer + len,
sizeof(textBuffer) - len,
" }\n");
702 SDL_Log(
"Readers read %d total events\n", grand_total);
static SDL_bool DequeueEvent_Mutex(SDL_EventQueue *queue, SDL_Event *event)
static SDL_sem * readersDone
A type representing an atomic integer value. It is a struct so people don't accidentally use numeric ...
static void InitEventQueue(SDL_EventQueue *queue)
#define SDL_CreateSemaphore
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static SDL_bool EnqueueEvent_LockFree(SDL_EventQueue *queue, const SDL_Event *event)
int main(int argc, char *argv[])
static int FIFO_Writer(void *_data)
static SDL_atomic_t writersRunning
static char * tf(SDL_bool tf)
GLuint const GLchar * name
uint32_t Uint32
An unsigned 32-bit integer type.
static int adder(void *junk)
GLint GLint GLsizei GLuint * counters
SDL_EventQueueEntry entries[MAX_ENTRIES]
static void RunBasicTest()
static SDL_bool DequeueEvent_LockFree(SDL_EventQueue *queue, SDL_Event *event)
static SDL_atomic_t readersRunning
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
GLsizei const GLfloat * value
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
#define SDL_CACHELINE_SIZE
static SDL_bool EnqueueEvent_Mutex(SDL_EventQueue *queue, const SDL_Event *event)
#define SDL_AtomicIncRef(a)
Increment an atomic variable used as a reference count.
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
#define SDL_assert(condition)
static SDL_sem * threadDone
#define SDL_LogSetPriority
int counters[NUM_WRITERS]
static int FIFO_Watcher(void *_data)
static void runAdder(void)
#define EVENTS_PER_WRITER
SDL_COMPILE_TIME_ASSERT(size, CountTo >0)
static SDL_sem * writersDone
#define SDL_AtomicDecRef(a)
Decrement an atomic variable used as a reference count.
#define SDL_DestroySemaphore
static SDL_atomic_t threadsRunning
static void RunEpicTest()
static int FIFO_Reader(void *_data)
GLboolean GLboolean GLboolean b
static void RunFIFOTest(SDL_bool lock_free)