LibC: Implement basic pthread mutexes
This implementation is just calling sched_yield if it could not get mutex. This is not optimal as it does not allow the CPU to idle, but it works for now :) Also I did not test this code at all, but it feels correct :D
This commit is contained in:
@@ -40,18 +40,24 @@ __BEGIN_DECLS
|
||||
#endif
|
||||
#undef __need_pthread_key_t
|
||||
|
||||
#if !defined(__pthread_mutex_t_defined) && (defined(__need_all_types) || defined(__need_pthread_mutex_t))
|
||||
#define __pthread_mutex_t_defined 1
|
||||
typedef int pthread_mutex_t;
|
||||
#if !defined(__pthread_t_defined) && (defined(__need_all_types) || defined(__need_pthread_t))
|
||||
#define __pthread_t_defined 1
|
||||
typedef pid_t pthread_t;
|
||||
#endif
|
||||
#undef __need_pthread_mutex_t
|
||||
#undef __need_pthread_t
|
||||
|
||||
#if !defined(__pthread_mutexattr_t_defined) && (defined(__need_all_types) || defined(__need_pthread_mutexattr_t))
|
||||
#define __pthread_mutexattr_t_defined 1
|
||||
typedef int pthread_mutexattr_t;
|
||||
typedef struct { int type; bool shared; } pthread_mutexattr_t;
|
||||
#endif
|
||||
#undef __need_pthread_mutexattr_t
|
||||
|
||||
#if !defined(__pthread_mutex_t_defined) && (defined(__need_all_types) || defined(__need_pthread_mutex_t))
|
||||
#define __pthread_mutex_t_defined 1
|
||||
typedef struct { pthread_mutexattr_t attr; pthread_t locker; unsigned lock_depth; } pthread_mutex_t;
|
||||
#endif
|
||||
#undef __need_pthread_mutex_t
|
||||
|
||||
#if !defined(__pthread_once_t_defined) && (defined(__need_all_types) || defined(__need_pthread_once_t))
|
||||
#define __pthread_once_t_defined 1
|
||||
typedef int pthread_once_t;
|
||||
@@ -70,12 +76,6 @@ __BEGIN_DECLS
|
||||
#endif
|
||||
#undef __need_pthread_rwlockattr_t
|
||||
|
||||
#if !defined(__pthread_t_defined) && (defined(__need_all_types) || defined(__need_pthread_t))
|
||||
#define __pthread_t_defined 1
|
||||
typedef pid_t pthread_t;
|
||||
#endif
|
||||
#undef __need_pthread_t
|
||||
|
||||
#if !defined(__pthread_spinlock_t_defined) && (defined(__need_all_types) || defined(__need_pthread_spinlock_t))
|
||||
#define __pthread_spinlock_t_defined 1
|
||||
typedef pthread_t pthread_spinlock_t;
|
||||
|
||||
@@ -46,23 +46,26 @@ struct uthread
|
||||
#define PTHREAD_CREATE_JOINABLE 8
|
||||
#define PTHREAD_EXPLICIT_SCHED 9
|
||||
#define PTHREAD_INHERIT_SCHED 10
|
||||
#define PTHREAD_MUTEX_DEFAULT 11
|
||||
#define PTHREAD_MUTEX_ERRORCHECK 12
|
||||
#define PTHREAD_MUTEX_NORMAL 13
|
||||
#define PTHREAD_MUTEX_RECURSIVE 14
|
||||
#define PTHREAD_MUTEX_ROBUST 15
|
||||
#define PTHREAD_MUTEX_STALLED 16
|
||||
#define PTHREAD_ONCE_INIT 17
|
||||
#define PTHREAD_PRIO_INHERIT 18
|
||||
#define PTHREAD_PRIO_NONE 19
|
||||
#define PTHREAD_PRIO_PROTECT 20
|
||||
#define PTHREAD_PROCESS_SHARED 21
|
||||
#define PTHREAD_PROCESS_PRIVATE 22
|
||||
#define PTHREAD_SCOPE_PROCESS 23
|
||||
#define PTHREAD_SCOPE_SYSTEM 24
|
||||
|
||||
#define PTHREAD_PROCESS_SHARED 0
|
||||
#define PTHREAD_PROCESS_PRIVATE 1
|
||||
|
||||
#define PTHREAD_MUTEX_ROBUST 0
|
||||
#define PTHREAD_MUTEX_STALLED 1
|
||||
|
||||
#define PTHREAD_MUTEX_DEFAULT 0
|
||||
#define PTHREAD_MUTEX_ERRORCHECK 1
|
||||
#define PTHREAD_MUTEX_NORMAL 2
|
||||
#define PTHREAD_MUTEX_RECURSIVE 3
|
||||
|
||||
#define PTHREAD_COND_INITIALIZER (pthread_cond_t)0
|
||||
#define PTHREAD_MUTEX_INITIALIZER (pthread_mutex_t)0
|
||||
#define PTHREAD_MUTEX_INITIALIZER (pthread_mutex_t){ { PTHREAD_MUTEX_DEFAULT, false }, 0, 0 }
|
||||
#define PTHREAD_RWLOCK_INITIALIZER (pthread_rwlock_t)0
|
||||
|
||||
int pthread_atfork(void (*prepare)(void), void (*parent)(void), void(*child)(void));
|
||||
|
||||
Reference in New Issue
Block a user