* Headers/Foundation/NSLock.h: Make types of _mutex and

_condition opaic to avoid including private thr-mach.h header.
        * Headers/Foundation/NSThread.h: Do not include private
	thr-mach.h header.
        * Source/thr-mach.h: Moved here from
        Headers/Additions/GNUstepBase/thr-mach.h.
        * Source/NSLock.m: Include private thr-mach.h header for
        apple-gnu-gnu.  Added defines for typing opaic instance
        variables and use them in various methods.
        * Source/NSThread.m: Include private thr-mach.h header for
        apple-gnu-gnu.
        * Source/thr-mach.m: Include private thr-mach.h header from
	new location.
        * Source/thr-pthread.m: Ditto.
        * Source/GNUmakefile: Do not install private thr-mach.h
	header.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@18607 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
David Ayers 2004-02-17 12:55:02 +00:00
parent a3005923c0
commit 1767ef985f
9 changed files with 70 additions and 53 deletions

View file

@ -126,10 +126,6 @@ objc-gnu2next.h
GNU_HEADERS = $(ADD_HEADERS)
ifneq ($(OBJC_RUNTIME_LIB), gnu)
GNU_HEADERS += thr-mach.h
endif
# GNUStep source files
BASE_MFILES = \

View file

@ -35,6 +35,12 @@
#include "Foundation/NSException.h"
#include "Foundation/NSDebug.h"
#include "Foundation/NSThread.h"
#ifdef NeXT_RUNTIME
#include "thr-mach.h"
#endif
#define _MUTEX ((objc_mutex_t)_mutex)
#define _CONDITION ((objc_condition_t)_condition)
extern void GSSleepUntilIntervalSinceReferenceDate(NSTimeInterval);
extern NSTimeInterval GSTimeNow();
@ -167,7 +173,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
{
// Ask the runtime to deallocate the mutex
// If there are outstanding locks then it will block
if (objc_mutex_deallocate(_mutex) == -1)
if (objc_mutex_deallocate(_MUTEX) == -1)
{
NSWarnMLog(@"objc_mutex_deallocate() failed");
}
@ -184,13 +190,13 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
- (BOOL) tryLock
{
/* Return NO if we're already locked */
if (_mutex->owner == objc_thread_id())
if (_MUTEX->owner == objc_thread_id())
{
return NO;
}
// Ask the runtime to acquire a lock on the mutex
if (objc_mutex_trylock(_mutex) == -1)
if (objc_mutex_trylock(_MUTEX) == -1)
{
return NO;
}
@ -212,8 +218,8 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
/* This is really the behavior of OpenStep, if the current thread has
the lock, we just block until the time limit is up. Very odd */
while (_mutex->owner == objc_thread_id()
|| (x = objc_mutex_trylock(_mutex)) == -1)
while (_MUTEX->owner == objc_thread_id()
|| (x = objc_mutex_trylock(_MUTEX)) == -1)
{
if (GSSleepOrFail(&ctxt) == NO)
{
@ -228,11 +234,11 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
*/
- (void) lock
{
CHECK_RECURSIVE_LOCK(_mutex);
CHECK_RECURSIVE_LOCK(_MUTEX);
// Ask the runtime to acquire a lock on the mutex
// This will block
if (objc_mutex_lock(_mutex) == -1)
if (objc_mutex_lock(_MUTEX) == -1)
{
[NSException raise: NSLockException
format: @"failed to lock mutex"];
@ -243,7 +249,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
- (void) unlock
{
// Ask the runtime to release a lock on the mutex
if (objc_mutex_unlock(_mutex) == -1)
if (objc_mutex_unlock(_MUTEX) == -1)
{
[NSException raise: NSLockException
format: @"unlock: failed to unlock mutex"];
@ -303,7 +309,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
if (_condition != 0)
{
// Ask the runtime to deallocate the condition
if (objc_condition_deallocate(_condition) == -1)
if (objc_condition_deallocate(_CONDITION) == -1)
{
NSWarnMLog(@"objc_condition_deallocate() failed");
}
@ -312,7 +318,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
{
// Ask the runtime to deallocate the mutex
// If there are outstanding locks then it will block
if (objc_mutex_deallocate(_mutex) == -1)
if (objc_mutex_deallocate(_MUTEX) == -1)
{
NSWarnMLog(@"objc_mutex_deallocate() failed");
}
@ -328,9 +334,9 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
// Acquiring and release the lock
- (void) lockWhenCondition: (int)value
{
CHECK_RECURSIVE_CONDITION_LOCK(_mutex);
CHECK_RECURSIVE_CONDITION_LOCK(_MUTEX);
if (objc_mutex_lock(_mutex) == -1)
if (objc_mutex_lock(_MUTEX) == -1)
{
[NSException raise: NSConditionLockException
format: @"lockWhenCondition: failed to lock mutex"];
@ -339,7 +345,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
while (_condition_value != value)
{
if (objc_condition_wait(_condition, _mutex) == -1)
if (objc_condition_wait(_CONDITION, _MUTEX) == -1)
{
[NSException raise: NSConditionLockException
format: @"objc_condition_wait failed"];
@ -353,7 +359,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
int depth;
// First check to make sure we have the lock
depth = objc_mutex_trylock(_mutex);
depth = objc_mutex_trylock(_MUTEX);
// Another thread has the lock so abort
if (depth == -1)
@ -376,7 +382,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
_condition_value = value;
// wake up blocked threads
if (objc_condition_broadcast(_condition) == -1)
if (objc_condition_broadcast(_CONDITION) == -1)
{
[NSException raise: NSConditionLockException
format: @"unlockWithCondition: objc_condition_broadcast failed"];
@ -384,8 +390,8 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
}
// and unlock twice
if ((objc_mutex_unlock(_mutex) == -1)
|| (objc_mutex_unlock(_mutex) == -1))
if ((objc_mutex_unlock(_MUTEX) == -1)
|| (objc_mutex_unlock(_MUTEX) == -1))
{
[NSException raise: NSConditionLockException
format: @"unlockWithCondition: failed to unlock mutex"];
@ -395,10 +401,10 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
- (BOOL) tryLock
{
CHECK_RECURSIVE_CONDITION_LOCK(_mutex);
CHECK_RECURSIVE_CONDITION_LOCK(_MUTEX);
// Ask the runtime to acquire a lock on the mutex
if (objc_mutex_trylock(_mutex) == -1)
if (objc_mutex_trylock(_MUTEX) == -1)
return NO;
else
return YES;
@ -428,11 +434,11 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
{
GSSleepInfo ctxt;
CHECK_RECURSIVE_CONDITION_LOCK(_mutex);
CHECK_RECURSIVE_CONDITION_LOCK(_MUTEX);
GSSleepInit(limit, &ctxt);
while (objc_mutex_trylock(_mutex) == -1)
while (objc_mutex_trylock(_MUTEX) == -1)
{
if (GSSleepOrFail(&ctxt) == NO)
{
@ -449,7 +455,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
#ifndef HAVE_OBJC_CONDITION_TIMEDWAIT
GSSleepInfo ctxt;
CHECK_RECURSIVE_CONDITION_LOCK(_mutex);
CHECK_RECURSIVE_CONDITION_LOCK(_MUTEX);
GSSleepInit(limitDate, &ctxt);
@ -457,7 +463,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
{
if (_condition_value == condition_to_meet)
{
while (objc_mutex_trylock(_mutex) == -1)
while (objc_mutex_trylock(_MUTEX) == -1)
{
if (GSSleepOrFail(&ctxt) == NO)
{
@ -468,7 +474,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
{
return YES;
}
if (objc_mutex_unlock(_mutex) == -1)
if (objc_mutex_unlock(_MUTEX) == -1)
{
[NSException raise: NSConditionLockException
format: @"%s failed to unlock mutex",
@ -485,9 +491,9 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
NSTimeInterval atimeinterval;
struct timespec endtime;
CHECK_RECURSIVE_CONDITION_LOCK(_mutex);
CHECK_RECURSIVE_CONDITION_LOCK(_MUTEX);
if (-1 == objc_mutex_lock(_mutex))
if (-1 == objc_mutex_lock(_MUTEX))
[NSException raise: NSConditionLockException
format: @"lockWhenCondition: failed to lock mutex"];
@ -501,7 +507,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
while (_condition_value != condition_to_meet)
{
switch (objc_condition_timedwait(_condition, _mutex, &endtime))
switch (objc_condition_timedwait(_CONDITION, _MUTEX, &endtime))
{
case 0:
break;
@ -525,11 +531,11 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
// These methods ignore the condition
- (void) lock
{
CHECK_RECURSIVE_CONDITION_LOCK(_mutex);
CHECK_RECURSIVE_CONDITION_LOCK(_MUTEX);
// Ask the runtime to acquire a lock on the mutex
// This will block
if (objc_mutex_lock(_mutex) == -1)
if (objc_mutex_lock(_MUTEX) == -1)
{
[NSException raise: NSConditionLockException
format: @"lock: failed to lock mutex"];
@ -540,7 +546,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
- (void) unlock
{
// wake up blocked threads
if (objc_condition_broadcast(_condition) == -1)
if (objc_condition_broadcast(_CONDITION) == -1)
{
[NSException raise: NSConditionLockException
format: @"unlockWithCondition: objc_condition_broadcast failed"];
@ -548,7 +554,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
}
// Ask the runtime to release a lock on the mutex
if (objc_mutex_unlock(_mutex) == -1)
if (objc_mutex_unlock(_MUTEX) == -1)
{
[NSException raise: NSConditionLockException
format: @"unlock: failed to unlock mutex"];
@ -600,7 +606,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
{
// Ask the runtime to deallocate the mutex
// If there are outstanding locks then it will block
if (objc_mutex_deallocate(_mutex) == -1)
if (objc_mutex_deallocate(_MUTEX) == -1)
{
NSWarnMLog(@"objc_mutex_deallocate() failed");
}
@ -616,7 +622,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
- (BOOL) tryLock
{
// Ask the runtime to acquire a lock on the mutex
if (objc_mutex_trylock(_mutex) == -1)
if (objc_mutex_trylock(_MUTEX) == -1)
return NO;
else
return YES;
@ -632,7 +638,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
GSSleepInfo ctxt;
GSSleepInit(limit, &ctxt);
while (objc_mutex_trylock(_mutex) == -1)
while (objc_mutex_trylock(_MUTEX) == -1)
{
if (GSSleepOrFail(&ctxt) == NO)
{
@ -647,7 +653,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
{
// Ask the runtime to acquire a lock on the mutex
// This will block
if (objc_mutex_lock(_mutex) == -1)
if (objc_mutex_lock(_MUTEX) == -1)
{
[NSException raise: NSRecursiveLockException
format: @"lock: failed to lock mutex"];
@ -658,7 +664,7 @@ NSString *NSRecursiveLockException = @"NSRecursiveLockException";
- (void) unlock
{
// Ask the runtime to release a lock on the mutex
if (objc_mutex_unlock(_mutex) == -1)
if (objc_mutex_unlock(_MUTEX) == -1)
{
[NSException raise: NSRecursiveLockException
format: @"unlock: failed to unlock mutex"];

View file

@ -38,6 +38,9 @@
#ifdef HAVE_NANOSLEEP
#include <time.h>
#endif
#ifdef NeXT_RUNTIME
#include "thr-mach.h"
#endif
#include "Foundation/NSException.h"
#include "Foundation/NSThread.h"

117
Source/thr-mach.h Normal file
View file

@ -0,0 +1,117 @@
/* Thread and mutex controls for Objective C.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
GNU CC is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 2, or (at your option) any later version.
GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with
GNU CC; see the file COPYING. If not, write to the Free Software
Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with files
compiled with GCC to produce an executable, this does not cause
the resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License. */
#ifndef __thread_INCLUDE_GNU
#define __thread_INCLUDE_GNU
#include <objc/objc.h>
/*************************************************************************
* Universal static variables:
*/
extern int __objc_thread_exit_status; /* Global exit status. */
/********
* Thread safe implementation types and functions.
*/
/* Thread priorities */
#define OBJC_THREAD_INTERACTIVE_PRIORITY 2
#define OBJC_THREAD_BACKGROUND_PRIORITY 1
#define OBJC_THREAD_LOW_PRIORITY 0
/* A thread */
typedef void * objc_thread_t;
/* This structure represents a single mutual exclusion lock. */
struct objc_mutex
{
volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
void * backend; /* Specific to backend */
};
typedef struct objc_mutex *objc_mutex_t;
/* This structure represents a single condition mutex */
struct objc_condition
{
void * backend; /* Specific to backend */
};
typedef struct objc_condition *objc_condition_t;
/* Frontend mutex functions */
objc_mutex_t objc_mutex_allocate(void);
int objc_mutex_deallocate(objc_mutex_t mutex);
int objc_mutex_lock(objc_mutex_t mutex);
int objc_mutex_unlock(objc_mutex_t mutex);
int objc_mutex_trylock(objc_mutex_t mutex);
/* Frontend condition mutex functions */
objc_condition_t objc_condition_allocate(void);
int objc_condition_deallocate(objc_condition_t condition);
int objc_condition_wait(objc_condition_t condition, objc_mutex_t mutex);
int objc_condition_signal(objc_condition_t condition);
int objc_condition_broadcast(objc_condition_t condition);
/* Frontend thread functions */
objc_thread_t objc_thread_detach(SEL selector, id object, id argument);
void objc_thread_yield(void);
int objc_thread_exit(void);
int objc_thread_set_priority(int priority);
int objc_thread_get_priority(void);
void * objc_thread_get_data(void);
int objc_thread_set_data(void *value);
objc_thread_t objc_thread_id(void);
void objc_thread_add(void);
void objc_thread_remove(void);
/*
Use this to set the hook function that will be called when the
runtime initially becomes multi threaded.
The hook function is only called once, meaning only when the
2nd thread is spawned, not for each and every thread.
It returns the previous hook function or NULL if there is none.
A program outside of the runtime could set this to some function so
it can be informed; for example, the GNUstep Base Library sets it
so it can implement the NSBecomingMultiThreaded notification.
*/
typedef void (*objc_thread_callback)();
objc_thread_callback objc_set_thread_callback(objc_thread_callback func);
#endif /* not __thread_INCLUDE_GNU */

View file

@ -29,7 +29,7 @@ Boston, MA 02111-1307, USA. */
#include <mach/mach.h>
#include <mach/cthreads.h>
#include "GNUstepBase/objc-gnu2next.h"
#include "GNUstepBase/thr-mach.h"
#include "thr-mach.h"
/* Global exit status. */
int __objc_thread_exit_status = 0;

View file

@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
#include <pthread.h>
#include <stdarg.h>
#include "GNUstepBase/objc-gnu2next.h"
#include "GNUstepBase/thr-mach.h"
#include "thr-mach.h"
/* Key structure for maintaining thread specific storage */
static pthread_key_t _objc_thread_storage;