Commit 2024f9e4 by Richard Kenner

Completely rework according to new interface.

From-SVN: r14310
parent f15e9e7e
...@@ -27,214 +27,166 @@ Boston, MA 02111-1307, USA. */ ...@@ -27,214 +27,166 @@ Boston, MA 02111-1307, USA. */
#include <objc/thr.h> #include <objc/thr.h>
#include "runtime.h" #include "runtime.h"
/******** /* Thread local storage for a single thread */
* This structure represents a single mutual exclusion lock. Lock semantics static void *thread_local_storage = NULL;
* are detailed with the subsequent functions. We use whatever lock is
* provided by the system. We augment it with depth and current owner id /* Backend initialization functions */
* fields to implement and re-entrant lock.
*/ /* Initialize the threads subsystem. */
struct objc_mutex
{
volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
};
/********
* Initialize the threads subsystem. Returns 0 if successful, or -1 if no
* thread support is available.
*/
int int
__objc_init_thread_system(void) __objc_init_thread_system(void)
{ {
DEBUG_PRINTF("__objc_init_thread_system\n"); /* No thread support available */
return -1; /* Failed. */ return -1;
}
/* Close the threads subsystem. */
int
__objc_close_thread_system(void)
{
/* No thread support available */
return -1;
} }
/******** /* Backend thread functions */
* Create a new thread of execution and return its id. Return NULL if fails.
* The new thread starts in "func" with the given argument. /* Create a new thread of execution. */
*/
objc_thread_t objc_thread_t
objc_thread_create(void (*func)(void *arg), void *arg) __objc_thread_detach(void (*func)(void *arg), void *arg)
{ {
return NULL; /* We can't start threads. */ /* No thread support available */
return NULL;
} }
/******** /* Set the current thread's priority. */
* Set the current thread's priority.
*/
int int
objc_thread_set_priority(int priority) __objc_thread_set_priority(int priority)
{ {
return -1; /* Failed. */ /* No thread support available */
return -1;
} }
/******** /* Return the current thread's priority. */
* Return the current thread's priority.
*/
int int
objc_thread_get_priority(void) __objc_thread_get_priority(void)
{ {
return OBJC_THREAD_INTERACTIVE_PRIORITY; /* Highest priority. */ return OBJC_THREAD_INTERACTIVE_PRIORITY;
} }
/******** /* Yield our process time to another thread. */
* Yield our process time to another thread. Any BUSY waiting that is done
* by a thread should use this function to make sure that other threads can
* make progress even on a lazy uniprocessor system.
*/
void void
objc_thread_yield(void) __objc_thread_yield(void)
{ {
return; return;
} }
/******** /* Terminate the current thread. */
* Terminate the current tread. Doesn't return anything. Doesn't return.
* Actually, if it failed returns -1.
*/
int int
objc_thread_exit(void) __objc_thread_exit(void)
{ {
exit(__objc_thread_exit_status); /* No thread support available */
/* Should we really exit the program */
/* exit(&__objc_thread_exit_status); */
return -1; return -1;
} }
/******** /* Returns an integer value which uniquely describes a thread. */
* Returns an integer value which uniquely describes a thread. Must not be
* NULL which is reserved as a marker for "no thread".
*/
objc_thread_t objc_thread_t
objc_thread_id(void) __objc_thread_id(void)
{ {
return (objc_thread_t)1; /* No thread support, use 1.*/ /* No thread support, use 1. */
return (objc_thread_t)1;
} }
/******** /* Sets the thread's local storage pointer. */
* Sets the thread's local storage pointer. Returns 0 if successful or -1
* if failed.
*/
static void *thread_local_storage = NULL;
int int
objc_thread_set_data(void *value) __objc_thread_set_data(void *value)
{ {
thread_local_storage = value; thread_local_storage = value;
return 0; return 0;
} }
/******** /* Returns the thread's local storage pointer. */
* Returns the thread's local storage pointer. Returns NULL on failure.
*/
void * void *
objc_thread_get_data(void) __objc_thread_get_data(void)
{ {
return thread_local_storage; return thread_local_storage;
} }
/******** /* Backend mutex functions */
* Allocate a mutex. Return the mutex pointer if successful or NULL if the
* allocation failed for any reason.
*/
objc_mutex_t
objc_mutex_allocate(void)
{
objc_mutex_t mutex;
if (!(mutex = (objc_mutex_t)objc_malloc(sizeof(struct objc_mutex))))
return NULL; /* Abort if malloc failed. */
mutex->owner = NULL; /* No owner. */ /* Allocate a mutex. */
mutex->depth = 0; /* No locks. */ int
return mutex; /* Return mutex handle. */ __objc_mutex_allocate(objc_mutex_t mutex)
{
return 0;
} }
/******** /* Deallocate a mutex. */
* Deallocate a mutex. Note that this includes an implicit mutex_lock to
* insure that no one else is using the lock. It is legal to deallocate
* a lock if we have a lock on it, but illegal to deallocate a lock held
* by anyone else.
* Returns the number of locks on the thread. (1 for deallocate).
*/
int int
objc_mutex_deallocate(objc_mutex_t mutex) __objc_mutex_deallocate(objc_mutex_t mutex)
{ {
int depth; /* # of locks on mutex. */ return 0;
}
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
depth = objc_mutex_lock(mutex); /* Must have lock. */
objc_free(mutex); /* Free memory. */ /* Grab a lock on a mutex. */
return depth; /* Return last depth. */ int
__objc_mutex_lock(objc_mutex_t mutex)
{
/* There can only be one thread, so we always get the lock */
return 0;
} }
/******** /* Try to grab a lock on a mutex. */
* Grab a lock on a mutex. If this thread already has a lock on this mutex
* then we increment the lock count. If another thread has a lock on the
* mutex we block and wait for the thread to release the lock.
* Returns the lock count on the mutex held by this thread.
*/
int int
objc_mutex_lock(objc_mutex_t mutex) __objc_mutex_trylock(objc_mutex_t mutex)
{ {
objc_thread_t thread_id; /* Cache our thread id. */ /* There can only be one thread, so we always get the lock */
return 0;
}
if (!mutex) /* Is argument bad? */ /* Unlock the mutex */
return -1; /* Yes, abort. */ int
thread_id = objc_thread_id(); /* Get this thread's id. */ __objc_mutex_unlock(objc_mutex_t mutex)
if (mutex->owner == thread_id) /* Already own lock? */ {
return ++mutex->depth; /* Yes, increment depth. */ return 0;
}
mutex->owner = thread_id; /* Mark thread as owner. */ /* Backend condition mutex functions */
return mutex->depth = 1; /* Increment depth to end. */ /* Allocate a condition. */
int
__objc_condition_allocate(objc_condition_t condition)
{
return 0;
} }
/******** /* Deallocate a condition. */
* Try to grab a lock on a mutex. If this thread already has a lock on
* this mutex then we increment the lock count and return it. If another
* thread has a lock on the mutex returns -1.
*/
int int
objc_mutex_trylock(objc_mutex_t mutex) __objc_condition_deallocate(objc_condition_t condition)
{ {
objc_thread_t thread_id; /* Cache our thread id. */ return 0;
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
thread_id = objc_thread_id(); /* Get this thread's id. */
if (mutex->owner == thread_id) /* Already own lock? */
return ++mutex->depth; /* Yes, increment depth. */
mutex->owner = thread_id; /* Mark thread as owner. */
return mutex->depth = 1; /* Increment depth to end. */
} }
/******** /* Wait on the condition */
* Decrements the lock count on this mutex by one. If the lock count reaches
* zero, release the lock on the mutex. Returns the lock count on the mutex.
* It is an error to attempt to unlock a mutex which this thread doesn't hold
* in which case return -1 and the mutex is unaffected.
* Will also return -1 if the mutex free fails.
*/
int int
objc_mutex_unlock(objc_mutex_t mutex) __objc_condition_wait(objc_condition_t condition, objc_mutex_t mutex)
{ {
objc_thread_t thread_id; /* Cache our thread id. */ return 0;
}
if (!mutex) /* Is argument bad? */ /* Wake up all threads waiting on this condition. */
return -1; /* Yes, abort. */ int
thread_id = objc_thread_id(); /* Get this thread's id. */ __objc_condition_broadcast(objc_condition_t condition)
if (mutex->owner != thread_id) /* Does some else own lock? */ {
return -1; /* Yes, abort. */ return 0;
if (mutex->depth > 1) /* Released last lock? */ }
return --mutex->depth; /* No, Decrement depth, end.*/
mutex->depth = 0; /* Yes, reset depth to 0. */
mutex->owner = NULL; /* Set owner to "no thread".*/
return 0; /* No, return success. */ /* Wake up one thread waiting on this condition. */
int
__objc_condition_signal(objc_condition_t condition)
{
return 0;
} }
/* End of File */ /* End of File */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment