|
|
@ -23,10 +23,10 @@ |
|
|
|
|
|
|
|
// Using C11 atomics for synchronization |
|
|
|
// NOTE: A plain bool (or any plain data type for that matter) can't be used for inter-thread synchronization |
|
|
|
static atomic_bool dataLoaded = ">ATOMIC_VAR_INIT(false); // Data Loaded completion indicator |
|
|
|
static atomic_bool dataLoaded = false; // Data Loaded completion indicator |
|
|
|
static void *LoadDataThread(void *arg); // Loading data thread function declaration |
|
|
|
|
|
|
|
static kt">int dataProgress = 0; // Data progress accumulator |
|
|
|
static n">atomic_int dataProgress = 0; // Data progress accumulator |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------ |
|
|
|
// Program main entry point |
|
|
@ -69,7 +69,7 @@ int main(void) |
|
|
|
case STATE_LOADING: |
|
|
|
{ |
|
|
|
framesCounter++; |
|
|
|
if (atomic_load(&dataLoaded)) |
|
|
|
if (atomic_load_explicit(&dataLoaded, memory_order_relaxed)) |
|
|
|
{ |
|
|
|
framesCounter = 0; |
|
|
|
int error = pthread_join(threadId, NULL); |
|
|
@ -84,8 +84,8 @@ int main(void) |
|
|
|
if (IsKeyPressed(KEY_ENTER)) |
|
|
|
{ |
|
|
|
// Reset everything to launch again |
|
|
|
atomic_store(&dataLoaded, false); |
|
|
|
dataProgress = 0; |
|
|
|
atomic_store_explicit(&dataLoaded, false, memory_order_relaxed); |
|
|
|
atomic_store_explicit(&dataProgress, 0, memory_order_relaxed); |
|
|
|
state = STATE_WAITING; |
|
|
|
} |
|
|
|
} break; |
|
|
@ -104,7 +104,7 @@ int main(void) |
|
|
|
case STATE_WAITING: DrawText("PRESS ENTER to START LOADING DATA", 150, 170, 20, DARKGRAY); break; |
|
|
|
case STATE_LOADING: |
|
|
|
{ |
|
|
|
DrawRectangle(150, 200, dataProgress, 60, SKYBLUE); |
|
|
|
DrawRectangle(150, 200, atomic_load_explicit(&dataProgress, memory_order_relaxed), 60, SKYBLUE); |
|
|
|
if ((framesCounter/15)%2) DrawText("LOADING DATA...", 240, 210, 40, DARKBLUE); |
|
|
|
|
|
|
|
} break; |
|
|
@ -145,11 +145,11 @@ static void *LoadDataThread(void *arg) |
|
|
|
|
|
|
|
// We accumulate time over a global variable to be used in |
|
|
|
// main thread as a progress bar |
|
|
|
dataProgress = timeCounter/10; |
|
|
|
atomic_store_explicit(&dataProgress, timeCounter/10, memory_order_relaxed); |
|
|
|
} |
|
|
|
|
|
|
|
// When data has finished loading, we set global variable |
|
|
|
atomic_store(&dataLoaded, true); |
|
|
|
atomic_store_explicit(&dataLoaded, true, memory_order_relaxed); |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |