fixed thread overspinning problem
parent
fccb93ccf9
commit
5f7de6acaa
|
@ -80,6 +80,7 @@ PLAT_THREAD_SIG(coroutine_main){
|
||||||
Assert(me->yield_ctx != 0);
|
Assert(me->yield_ctx != 0);
|
||||||
Assert(me->function != 0);
|
Assert(me->function != 0);
|
||||||
|
|
||||||
|
DBG_POINT();
|
||||||
me->function(&me->head);
|
me->function(&me->head);
|
||||||
|
|
||||||
// NOTE(allen): Wake up the caller and set this coroutine back to being dead.
|
// NOTE(allen): Wake up the caller and set this coroutine back to being dead.
|
||||||
|
|
|
@ -76,6 +76,7 @@
|
||||||
|
|
||||||
#include "4ed_shared_thread_constants.h"
|
#include "4ed_shared_thread_constants.h"
|
||||||
#include "unix_threading_wrapper.h"
|
#include "unix_threading_wrapper.h"
|
||||||
|
#include "linux_semaphore_wrapper.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Linux macros
|
// Linux macros
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Mr. 4th Dimention - Allen Webster
|
||||||
|
*
|
||||||
|
* 07.11.2017
|
||||||
|
*
|
||||||
|
* Linux semaphore wrapper
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
union Semaphore{
|
||||||
|
sem_t s;
|
||||||
|
FixSize(SEMAPHORE_TYPE_SIZE);
|
||||||
|
};
|
||||||
|
|
||||||
|
internal void
|
||||||
|
system_init_semaphore(Semaphore *s, u32 count){
|
||||||
|
sem_init(&s->s, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
system_wait_on_semaphore(Semaphore *s){
|
||||||
|
sem_wait(&s->s);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
system_release_semaphore(Semaphore *s){
|
||||||
|
sem_post(&s->s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
# include "4coder_default_bindings.cpp"
|
# include "4coder_default_bindings.cpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "osx_objective_c_to_cpp_links.h"
|
||||||
|
|
||||||
#include "4ed_math.h"
|
#include "4ed_math.h"
|
||||||
|
|
||||||
#include "4ed_system.h"
|
#include "4ed_system.h"
|
||||||
|
@ -48,6 +50,11 @@
|
||||||
#include <OpenGL/OpenGL.h>
|
#include <OpenGL/OpenGL.h>
|
||||||
#include <OpenGL/gl.h>
|
#include <OpenGL/gl.h>
|
||||||
|
|
||||||
|
#undef external
|
||||||
|
#undef internal
|
||||||
|
#include <mach/mach.h>
|
||||||
|
#define external extern "C"
|
||||||
|
#define internal static
|
||||||
#include <mach-o/dyld.h>
|
#include <mach-o/dyld.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -56,6 +63,7 @@
|
||||||
|
|
||||||
#include "4ed_shared_thread_constants.h"
|
#include "4ed_shared_thread_constants.h"
|
||||||
#include "unix_threading_wrapper.h"
|
#include "unix_threading_wrapper.h"
|
||||||
|
#include "mac_semaphore_wrapper.h"
|
||||||
|
|
||||||
// TODO(allen): Make an intrinsics header that uses the cracked OS to define a single set of intrinsic names.
|
// TODO(allen): Make an intrinsics header that uses the cracked OS to define a single set of intrinsic names.
|
||||||
#define InterlockedCompareExchange(dest, ex, comp) \
|
#define InterlockedCompareExchange(dest, ex, comp) \
|
||||||
|
@ -86,7 +94,6 @@ struct OSX_Vars{
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
#include "osx_objective_c_to_cpp_links.h"
|
|
||||||
OSX_Objective_C_Vars osx_objc;
|
OSX_Objective_C_Vars osx_objc;
|
||||||
OSX_Vars osxvars;
|
OSX_Vars osxvars;
|
||||||
global Render_Target target;
|
global Render_Target target;
|
||||||
|
|
|
@ -582,13 +582,13 @@ osx_get_file_change_event(char *buffer, i32 max, i32 *size){
|
||||||
struct kevent event_out;
|
struct kevent event_out;
|
||||||
i32 count = kevent(file_change_queue.kq, 0, 0, &event_out, 1, &t);
|
i32 count = kevent(file_change_queue.kq, 0, 0, &event_out, 1, &t);
|
||||||
if (count < 0 || (count > 0 && event_out.flags == EV_ERROR)){
|
if (count < 0 || (count > 0 && event_out.flags == EV_ERROR)){
|
||||||
fprintf(stdout, "count: %4d error: %s\n", count, strerror(errno));
|
//fprintf(stdout, "count: %4d error: %s\n", count, strerror(errno));
|
||||||
}
|
}
|
||||||
else if (count > 0){
|
else if (count > 0){
|
||||||
if (event_out.udata != 0){
|
if (event_out.udata != 0){
|
||||||
i32 len = *(i32*)event_out.udata;
|
i32 len = *(i32*)event_out.udata;
|
||||||
char *str = (char*)((i32*)event_out.udata + 1);
|
char *str = (char*)((i32*)event_out.udata + 1);
|
||||||
fprintf(stdout, "got an event for file: %.*s\n", len, str);
|
//fprintf(stdout, "got an event for file: %.*s\n", len, str);
|
||||||
if (len <= max){
|
if (len <= max){
|
||||||
*size = len;
|
*size = len;
|
||||||
memcpy(buffer, str, len);
|
memcpy(buffer, str, len);
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Mr. 4th Dimention - Allen Webster
|
||||||
|
*
|
||||||
|
* 07.11.2017
|
||||||
|
*
|
||||||
|
* Mac semaphore wrapper
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
union Semaphore{
|
||||||
|
semaphore_t s;
|
||||||
|
FixSize(SEMAPHORE_TYPE_SIZE);
|
||||||
|
};
|
||||||
|
|
||||||
|
internal void
|
||||||
|
system_init_semaphore(Semaphore *s, u32 count){
|
||||||
|
task_t task = mach_task_self();
|
||||||
|
semaphore_create(task, &s->s, SYNC_POLICY_FIFO, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
system_wait_on_semaphore(Semaphore *s){
|
||||||
|
semaphore_wait(s->s);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
system_release_semaphore(Semaphore *s){
|
||||||
|
semaphore_signal(s->s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
#define DBG_POINT() fprintf(stdout, "%s\n", __FILE__ ":" LINE_STR ":")
|
#define DBG_POINT() fprintf(stdout, "%s\n", __FILE__ ":" LINE_STR ":")
|
||||||
#else
|
#else
|
||||||
#define DBG_POINT()
|
#define DBG_POINT()
|
||||||
|
|
|
@ -30,11 +30,6 @@ union Condition_Variable{
|
||||||
FixSize(CONDITION_VARIABLE_TYPE_SIZE);
|
FixSize(CONDITION_VARIABLE_TYPE_SIZE);
|
||||||
};
|
};
|
||||||
|
|
||||||
union Semaphore{
|
|
||||||
sem_t s;
|
|
||||||
FixSize(SEMAPHORE_TYPE_SIZE);
|
|
||||||
};
|
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
system_init_and_launch_thread(Thread *t, Thread_Function *proc, void *ptr){
|
system_init_and_launch_thread(Thread *t, Thread_Function *proc, void *ptr){
|
||||||
pthread_create(&t->t, 0, proc, ptr);
|
pthread_create(&t->t, 0, proc, ptr);
|
||||||
|
@ -70,21 +65,6 @@ system_signal_cv(Condition_Variable *cv, Mutex *m){
|
||||||
pthread_cond_signal(&cv->cv);
|
pthread_cond_signal(&cv->cv);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
|
||||||
system_init_semaphore(Semaphore *s, u32 count){
|
|
||||||
sem_init(&s->s, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
system_wait_on_semaphore(Semaphore *s){
|
|
||||||
sem_wait(&s->s);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
system_release_semaphore(Semaphore *s){
|
|
||||||
sem_post(&s->s);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
Loading…
Reference in New Issue