Implemented all system mutex and cv handling functions.
parent
cbdc6a14e0
commit
9263a4a59f
|
@ -58,6 +58,7 @@
|
|||
#include <dlfcn.h> // NOTE(yuval): Used for dlopen, dlclose, dlsym
|
||||
#include <errno.h> // NOTE(yuval): Used for errno
|
||||
#include <fcntl.h> // NOTE(yuval): Used for open
|
||||
#include <pthread.h> // NOTE(yuval): Used for threads, mutexes, cvs
|
||||
#include <unistd.h> // NOTE(yuval): Used for getcwd, read, write, getpid
|
||||
#include <sys/stat.h> // NOTE(yuval): Used for stat
|
||||
#include <sys/types.h> // NOTE(yuval): Used for struct stat, pid_t
|
||||
|
@ -109,9 +110,16 @@ struct Mac_Object{
|
|||
Mac_Object_Kind kind;
|
||||
|
||||
union{
|
||||
struct{
|
||||
NSTimer* timer;
|
||||
} timer;
|
||||
|
||||
struct{
|
||||
pthread_t thread;
|
||||
Thread_Function *proc;
|
||||
void *ptr;
|
||||
} thread;
|
||||
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t cv;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -130,6 +138,12 @@ struct Mac_Vars {
|
|||
|
||||
Node free_mac_objects;
|
||||
Node timer_objects;
|
||||
|
||||
pthread_mutex_t thread_launch_mutex;
|
||||
pthread_cond_t thread_launch_cv;
|
||||
b32 waiting_for_launch;
|
||||
|
||||
System_Mutex global_frame_mutex;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
|
@ -139,31 +153,6 @@ global Render_Target target;
|
|||
|
||||
////////////////////////////////
|
||||
|
||||
function inline Plat_Handle
|
||||
mac_to_plat_handle(Mac_Object *object){
|
||||
Plat_Handle result = *(Plat_Handle*)(&object);
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
function inline System_Thread
|
||||
mac_to_system_thread(Mac_Object *object){
|
||||
System_Thread result = *(System_Thread*)(&object);
|
||||
return(result);
|
||||
}
|
||||
|
||||
function inline Mac_Object*
|
||||
mac_to_object(Plat_Handle handle){
|
||||
Mac_Object *result = *(Mac_Object**)(&handle);
|
||||
return(result);
|
||||
}
|
||||
|
||||
function inline Mac_Object*
|
||||
mac_to_object(System_Thread thread){
|
||||
Mac_Object *result = *(Mac_Object**)(&thread);
|
||||
return(result);
|
||||
}
|
||||
|
||||
function Mac_Object*
|
||||
mac_alloc_object(Mac_Object_Kind kind){
|
||||
Mac_Object *result = 0;
|
||||
|
@ -210,6 +199,18 @@ mac_free_object(Mac_Object *object){
|
|||
dll_insert(&mac_vars.free_mac_objects, &object->node);
|
||||
}
|
||||
|
||||
function inline Plat_Handle
|
||||
mac_to_plat_handle(Mac_Object *object){
|
||||
Plat_Handle result = *(Plat_Handle*)(&object);
|
||||
return(result);
|
||||
}
|
||||
|
||||
function inline Mac_Object*
|
||||
mac_to_object(Plat_Handle handle){
|
||||
Mac_Object *result = *(Mac_Object**)(&handle);
|
||||
return(result);
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
#import "mac_4ed_functions.mm"
|
||||
|
|
|
@ -375,7 +375,7 @@ system_wake_up_timer_create_sig(){
|
|||
Mac_Object *object = mac_alloc_object(MacObjectKind_Timer);
|
||||
dll_insert(&mac_vars.timer_objects, &object->node);
|
||||
|
||||
object->timer.timer = nil;
|
||||
object->timer = nil;
|
||||
|
||||
Plat_Handle result = mac_to_plat_handle(object);
|
||||
return(result);
|
||||
|
@ -385,8 +385,8 @@ function
|
|||
system_wake_up_timer_release_sig(){
|
||||
Mac_Object *object = mac_to_object(handle);
|
||||
if (object->kind == MacObjectKind_Timer){
|
||||
if ((object->timer.timer != nil) && [object->timer.timer isValid]) {
|
||||
[object->timer.timer invalidate];
|
||||
if ((object->timer != nil) && [object->timer isValid]) {
|
||||
[object->timer invalidate];
|
||||
mac_free_object(object);
|
||||
}
|
||||
}
|
||||
|
@ -397,7 +397,7 @@ system_wake_up_timer_set_sig(){
|
|||
Mac_Object *object = mac_to_object(handle);
|
||||
if (object->kind == MacObjectKind_Timer){
|
||||
f64 time_seconds = ((f64)time_milliseconds / 1000.0);
|
||||
object->timer.timer = [NSTimer scheduledTimerWithTimeInterval:time_seconds
|
||||
object->timer = [NSTimer scheduledTimerWithTimeInterval:time_seconds
|
||||
target:mac_vars.view
|
||||
selector:@selector(requestDisplay)
|
||||
userInfo:nil repeats:NO];
|
||||
|
@ -511,7 +511,7 @@ system_thread_launch_sig(){
|
|||
}
|
||||
pthread_mutex_unlock(&mac_vars.thread_launch_mutex);
|
||||
|
||||
System_Thread result = mac_to_system_thread(object);
|
||||
System_Thread result = mac_to_plat_handle(object);
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
@ -533,66 +533,92 @@ system_thread_free_sig(){
|
|||
|
||||
function
|
||||
system_thread_get_id_sig(){
|
||||
i32 result = (i32)pthread_getthreadid_np();
|
||||
pthread_t id = pthread_self();
|
||||
i32 result = *(i32*)(&id);
|
||||
return(result);
|
||||
}
|
||||
|
||||
function
|
||||
system_mutex_make_sig(){
|
||||
System_Mutex result = {};
|
||||
|
||||
NotImplemented;
|
||||
Mac_Object *object = mac_alloc_object(MacObjectKind_Mutex);
|
||||
pthread_mutex_init(&object->mutex, 0);
|
||||
|
||||
System_Mutex result = mac_to_plat_handle(object);
|
||||
return(result);
|
||||
}
|
||||
|
||||
function
|
||||
system_mutex_acquire_sig(){
|
||||
NotImplemented;
|
||||
Mac_Object *object = mac_to_object(mutex);
|
||||
if (object->kind == MacObjectKind_Mutex){
|
||||
pthread_mutex_lock(&object->mutex);
|
||||
}
|
||||
}
|
||||
|
||||
function
|
||||
system_mutex_release_sig(){
|
||||
NotImplemented;
|
||||
Mac_Object *object = mac_to_object(mutex);
|
||||
if (object->kind == MacObjectKind_Mutex){
|
||||
pthread_mutex_unlock(&object->mutex);
|
||||
}
|
||||
}
|
||||
|
||||
function
|
||||
system_mutex_free_sig(){
|
||||
NotImplemented;
|
||||
Mac_Object *object = mac_to_object(mutex);
|
||||
if (object->kind == MacObjectKind_Mutex){
|
||||
pthread_mutex_destroy(&object->mutex);
|
||||
mac_free_object(object);
|
||||
}
|
||||
}
|
||||
|
||||
function
|
||||
system_acquire_global_frame_mutex_sig(){
|
||||
NotImplemented;
|
||||
if (tctx->kind == ThreadKind_AsyncTasks){
|
||||
system_mutex_acquire(mac_vars.global_frame_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
function
|
||||
system_release_global_frame_mutex_sig(){
|
||||
NotImplemented;
|
||||
if (tctx->kind == ThreadKind_AsyncTasks){
|
||||
system_mutex_release(mac_vars.global_frame_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
function
|
||||
system_condition_variable_make_sig(){
|
||||
System_Condition_Variable result = {};
|
||||
|
||||
NotImplemented;
|
||||
Mac_Object *object = mac_alloc_object(MacObjectKind_CV);
|
||||
pthread_cond_init(&object->cv, 0);
|
||||
|
||||
System_Condition_Variable result = mac_to_plat_handle(object);
|
||||
return(result);
|
||||
}
|
||||
|
||||
function
|
||||
system_condition_variable_wait_sig(){
|
||||
NotImplemented;
|
||||
Mac_Object *object_cv = mac_to_object(cv);
|
||||
Mac_Object *object_mutex = mac_to_object(mutex);
|
||||
if ((object_cv->kind == MacObjectKind_CV) && (object_mutex->kind == MacObjectKind_Mutex)){
|
||||
pthread_cond_wait(&object_cv->cv, &object_mutex->mutex);
|
||||
}
|
||||
}
|
||||
|
||||
function
|
||||
system_condition_variable_signal_sig(){
|
||||
NotImplemented;
|
||||
Mac_Object *object = mac_to_object(cv);
|
||||
if (object->kind == MacObjectKind_CV){
|
||||
pthread_cond_signal(&object->cv);
|
||||
}
|
||||
}
|
||||
|
||||
function
|
||||
system_condition_variable_free_sig(){
|
||||
NotImplemented;
|
||||
Mac_Object *object = mac_to_object(cv);
|
||||
if (object->kind == MacObjectKind_CV){
|
||||
pthread_cond_destroy(&object->cv);
|
||||
mac_free_object(object);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
|
Loading…
Reference in New Issue