mutex and thread structures.
From-SVN: r13598
static struct objc_list *uninitialized_statics = 0; /* !T:MUTEX */
/* Global runtime "write" mutex. */
-_objc_mutex_t __objc_runtime_mutex;
+objc_mutex_t __objc_runtime_mutex;
/* Number of threads that are alive. */
int __objc_runtime_threads_alive = 1; /* !T:MUTEX */
extern int __objc_selector_max_index;
/* Mutex locking __objc_selector_max_index and its arrays. */
-extern _objc_mutex_t __objc_runtime_mutex;
+extern objc_mutex_t __objc_runtime_mutex;
/* Number of threads which are alive. */
extern int __objc_runtime_threads_alive;
/* GNU Objective C Runtime Thread Interface
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
This file is part of GNU CC.
* provided by the system. We augment it with depth and current owner id
* fields to implement and re-entrant lock.
*/
-struct _objc_mutex
+struct objc_mutex
{
- volatile _objc_thread_t owner; /* Id of thread that owns. */
+ volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
pthread_mutex_t lock; /* pthread mutex. */
};
* Create a new thread of execution and return its id. Return NULL if fails.
* The new thread starts in "func" with the given argument.
*/
-_objc_thread_t
+objc_thread_t
objc_thread_create(void (*func)(void *arg), void *arg)
{
- _objc_thread_t thread_id = NULL; /* Detached thread id. */
+ objc_thread_t thread_id = NULL; /* Detached thread id. */
pthread_t new_thread_handle; /* DCE thread handle. */
objc_mutex_lock(__objc_runtime_mutex);
if (pthread_create(&new_thread_handle, pthread_attr_default,
(void *)func, arg) == 0) {
/* ??? May not work! (64bit)*/
- thread_id = *(_objc_thread_t *)&new_thread_handle;
+ thread_id = *(objc_thread_t *)&new_thread_handle;
pthread_detach(&new_thread_handle); /* Fully detach thread. */
__objc_runtime_threads_alive++;
}
* Returns an integer value which uniquely describes a thread. Must not be
* -1 which is reserved as a marker for "no thread".
*/
-_objc_thread_t
+objc_thread_t
objc_thread_id(void)
{
pthread_t self = pthread_self();
- return (_objc_thread_t) pthread_getuniqe_np (&self);
+ return (objc_thread_t) pthread_getuniqe_np (&self);
}
/********
* Allocate a mutex. Return the mutex pointer if successful or NULL if
* the allocation fails for any reason.
*/
-_objc_mutex_t
+objc_mutex_t
objc_mutex_allocate(void)
{
- _objc_mutex_t mutex;
+ objc_mutex_t mutex;
int err = 0;
- if (!(mutex = (_objc_mutex_t) objc_malloc(sizeof(struct _objc_mutex))))
+ if (!(mutex = (objc_mutex_t)objc_malloc(sizeof(struct objc_mutex))))
return NULL; /* Abort if malloc failed. */
err = pthread_mutex_init(&mutex->lock, pthread_mutexattr_default);
objc_free(mutex); /* Yes, free local memory. */
return NULL; /* Abort. */
}
- mutex->owner = (_objc_thread_t) -1; /* No owner. */
+ mutex->owner = (objc_thread_t) -1; /* No owner. */
mutex->depth = 0; /* No locks. */
return mutex; /* Return mutex handle. */
}
* Returns the number of locks on the thread. (1 for deallocate).
*/
int
-objc_mutex_deallocate(_objc_mutex_t mutex)
+objc_mutex_deallocate(objc_mutex_t mutex)
{
int depth; /* # of locks on mutex. */
* Returns the lock count on the mutex held by this thread.
*/
int
-objc_mutex_lock(_objc_mutex_t mutex)
+objc_mutex_lock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* thread has a lock on the mutex returns -1.
*/
int
-objc_mutex_trylock(_objc_mutex_t mutex)
+objc_mutex_trylock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* Will also return -1 if the mutex free fails.
*/
int
-objc_mutex_unlock(_objc_mutex_t mutex)
+objc_mutex_unlock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
if (mutex->depth > 1) /* Released last lock? */
return --mutex->depth; /* No, Decrement depth, end.*/
mutex->depth = 0; /* Yes, reset depth to 0. */
- mutex->owner = (_objc_thread_t) -1; /* Set owner to "no thread".*/
+ mutex->owner = (objc_thread_t) -1; /* Set owner to "no thread".*/
if (pthread_mutex_unlock(&mutex->lock) != 0) /* Unlock system mutex. */
return -1; /* Failed, abort. */
/* GNU Objective C Runtime Thread Interface - SGI IRIX Implementation
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
This file is part of GNU CC.
* provided by the system. We augment it with depth and current owner id
* fields to implement and re-entrant lock.
*/
-struct _objc_mutex
+struct objc_mutex
{
- volatile _objc_thread_t owner; /* Id of thread that owns. */
+ volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
ulock_t lock; /* Irix lock. */
};
* Create a new thread of execution and return its id. Return NULL if fails.
* The new thread starts in "func" with the given argument.
*/
-_objc_thread_t
+objc_thread_t
objc_thread_create(void (*func)(void *arg), void *arg)
{
- _objc_thread_t thread_id = NULL;
+ objc_thread_t thread_id = NULL;
int sys_id;
objc_mutex_lock(__objc_runtime_mutex);
if ((sys_id = sproc((void *)func, PR_SALL, arg)) >= 0) {
- thread_id = (_objc_thread_t)sys_id;
+ thread_id = (objc_thread_t)sys_id;
__objc_runtime_threads_alive++;
}
objc_mutex_unlock(__objc_runtime_mutex);
* 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)
{
- return (_objc_thread_t)get_pid(); /* Threads are processes. */
+ return (objc_thread_t)get_pid(); /* Threads are processes. */
}
/********
* Return the mutex pointer if successful or NULL if the allocation failed
* for any reason.
*/
-_objc_mutex_t
+objc_mutex_t
objc_mutex_allocate(void)
{
- _objc_mutex_t mutex;
+ objc_mutex_t mutex;
int err = 0;
- if (!(mutex = (_objc_mutex_t) objc_malloc(sizeof(struct _objc_mutex))))
+ if (!(mutex = (objc_mutex_t)objc_malloc(sizeof(struct objc_mutex))))
return NULL; /* Abort if malloc failed. */
if (!(mutex->lock = usnewlock(__objc_shared_arena_handle)))
* Returns the number of locks on the thread. (1 for deallocate).
*/
int
-objc_mutex_deallocate(_objc_mutex_t mutex)
+objc_mutex_deallocate(objc_mutex_t mutex)
{
int depth; /* # of locks on mutex. */
* Returns the lock count on the mutex held by this thread.
*/
int
-objc_mutex_lock(_objc_mutex_t mutex)
+objc_mutex_lock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* thread has a lock on the mutex returns -1.
*/
int
-objc_mutex_trylock(_objc_mutex_t mutex)
+objc_mutex_trylock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
*/
int
-objc_mutex_unlock(_objc_mutex_t mutex)
+objc_mutex_unlock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
/* GNU Objective C Runtime Thread Interface - OS/2 emx Implementation
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Thomas Baier (baier@ci.tuwien.ac.at)
This file is part of GNU CC.
* provided by the system. We augment it with depth and current owner id
* fields to implement and re-entrant lock.
*/
-struct _objc_mutex
+struct objc_mutex
{
- volatile _objc_thread_t owner; /* Id of thread that owns. */
+ volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
HMTX handle; /* OS/2 mutex HANDLE. */
};
* Create a new thread of execution and return its id. Return NULL if fails.
* The new thread starts in "func" with the given argument.
*/
-_objc_thread_t
+objc_thread_t
objc_thread_create(void (*func)(void *arg), void *arg)
{
int thread_id = 0; /* id of the newly created thread */
objc_mutex_unlock(__objc_runtime_mutex);
- return (_objc_thread_t)thread_id;
+ return (objc_thread_t)thread_id;
}
/********
* Returns an integer value which uniquely describes a thread. Must not be
* -1 which is reserved as a marker for "no thread".
*/
-_objc_thread_t
+objc_thread_t
objc_thread_id(void)
{
- return (_objc_thread_t) *_threadid; /* Return thread id. */
+ return (objc_thread_t) *_threadid; /* Return thread id. */
}
/********
* Allocate a mutex. Return the mutex pointer if successful or NULL if
* the allocation fails for any reason.
*/
-_objc_mutex_t
+objc_mutex_t
objc_mutex_allocate(void)
{
- _objc_mutex_t mutex;
+ objc_mutex_t mutex;
int err = 0;
- if (!(mutex = (_objc_mutex_t) objc_malloc(sizeof(struct _objc_mutex))))
+ if (!(mutex = (objc_mutex_t)objc_malloc(sizeof(struct objc_mutex))))
return NULL; /* Abort if malloc failed. */
if (DosCreateMutexSem (NULL,&(mutex->handle),0L,0) > 0) {
- free (mutex);
+ objc_free(mutex);
return NULL;
}
* Returns the number of locks on the thread. (1 for deallocate).
*/
int
-objc_mutex_deallocate(_objc_mutex_t mutex)
+objc_mutex_deallocate(objc_mutex_t mutex)
{
int depth; /* # of locks on mutex. */
* Returns the lock count on the mutex held by this thread.
*/
int
-objc_mutex_lock(_objc_mutex_t mutex)
+objc_mutex_lock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* thread has a lock on the mutex returns -1.
*/
int
-objc_mutex_trylock(_objc_mutex_t mutex)
+objc_mutex_trylock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* Will also return -1 if the mutex free fails.
*/
int
-objc_mutex_unlock(_objc_mutex_t mutex)
+objc_mutex_unlock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
/* GNU Objective C Runtime Thread Interface for POSIX compliant threads
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
Modified for Linux/Pthreads by Kai-Uwe Sattler (kus@iti.cs.uni-magdeburg.de)
* provided by the system. We augment it with depth and current owner id
* fields to implement and re-entrant lock.
*/
-struct _objc_mutex
+struct objc_mutex
{
- volatile _objc_thread_t owner; /* Id of thread that owns. */
+ volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
pthread_mutex_t lock; /* pthread mutex. */
};
* Create a new thread of execution and return its id. Return NULL if fails.
* The new thread starts in "func" with the given argument.
*/
-_objc_thread_t
+objc_thread_t
objc_thread_create(void (*func)(void *arg), void *arg)
{
- _objc_thread_t thread_id = NULL; /* Detached thread id. */
+ objc_thread_t thread_id = NULL; /* Detached thread id. */
pthread_t new_thread_handle; /* DCE thread handle. */
objc_mutex_lock(__objc_runtime_mutex);
if (pthread_create(&new_thread_handle, NULL,
(void *)func, arg) == 0) {
- thread_id = (_objc_thread_t) new_thread_handle;
+ thread_id = (objc_thread_t) new_thread_handle;
pthread_detach(new_thread_handle); /* Fully detach thread. */
__objc_runtime_threads_alive++;
}
* Returns an integer value which uniquely describes a thread. Must not be
* -1 which is reserved as a marker for "no thread".
*/
-_objc_thread_t
+objc_thread_t
objc_thread_id(void)
{
pthread_t self = pthread_self();
- return (_objc_thread_t) self; /* Return thread handle. */
+ return (objc_thread_t) self; /* Return thread handle. */
}
/********
* Allocate a mutex. Return the mutex pointer if successful or NULL if
* the allocation fails for any reason.
*/
-_objc_mutex_t
+objc_mutex_t
objc_mutex_allocate(void)
{
- _objc_mutex_t mutex;
+ objc_mutex_t mutex;
int err = 0;
- if (!(mutex = (_objc_mutex_t) objc_malloc(sizeof(struct _objc_mutex))))
+ if (!(mutex = (objc_mutex_t)objc_malloc(sizeof(struct objc_mutex))))
return NULL; /* Abort if malloc failed. */
err = pthread_mutex_init(&mutex->lock, NULL);
* Returns the number of locks on the thread. (1 for deallocate).
*/
int
-objc_mutex_deallocate(_objc_mutex_t mutex)
+objc_mutex_deallocate(objc_mutex_t mutex)
{
int depth; /* # of locks on mutex. */
* Returns the lock count on the mutex held by this thread.
*/
int
-objc_mutex_lock(_objc_mutex_t mutex)
+objc_mutex_lock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* thread has a lock on the mutex returns -1.
*/
int
-objc_mutex_trylock(_objc_mutex_t mutex)
+objc_mutex_trylock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* Will also return -1 if the mutex free fails.
*/
int
-objc_mutex_unlock(_objc_mutex_t mutex)
+objc_mutex_unlock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
/* GNU Objective C Runtime Thread Implementation
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
This file is part of GNU CC.
* provided by the system. We augment it with depth and current owner id
* fields to implement and re-entrant lock.
*/
-struct _objc_mutex
+struct objc_mutex
{
- volatile _objc_thread_t owner; /* Id of thread that owns. */
+ volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
};
* Create a new thread of execution and return its id. Return NULL if fails.
* The new thread starts in "func" with the given argument.
*/
-_objc_thread_t
+objc_thread_t
objc_thread_create(void (*func)(void *arg), void *arg)
{
return NULL; /* We can't start threads. */
* 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)
{
- return (_objc_thread_t)1; /* No thread support, use 1.*/
+ return (objc_thread_t)1; /* No thread support, use 1.*/
}
/********
* Allocate a mutex. Return the mutex pointer if successful or NULL if the
* allocation failed for any reason.
*/
-_objc_mutex_t
+objc_mutex_t
objc_mutex_allocate(void)
{
- _objc_mutex_t mutex;
+ objc_mutex_t mutex;
- if (!(mutex = (_objc_mutex_t) objc_malloc(sizeof(struct _objc_mutex))))
+ if (!(mutex = (objc_mutex_t)objc_malloc(sizeof(struct objc_mutex))))
return NULL; /* Abort if malloc failed. */
mutex->owner = NULL; /* No owner. */
* Returns the number of locks on the thread. (1 for deallocate).
*/
int
-objc_mutex_deallocate(_objc_mutex_t mutex)
+objc_mutex_deallocate(objc_mutex_t mutex)
{
int depth; /* # of locks on mutex. */
* Returns the lock count on the mutex held by this thread.
*/
int
-objc_mutex_lock(_objc_mutex_t mutex)
+objc_mutex_lock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* thread has a lock on the mutex returns -1.
*/
int
-objc_mutex_trylock(_objc_mutex_t mutex)
+objc_mutex_trylock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
* Will also return -1 if the mutex free fails.
*/
int
-objc_mutex_unlock(_objc_mutex_t mutex)
+objc_mutex_unlock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
/* GNU Objective C Runtime Thread Interface - Win32 Implementation
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
This file is part of GNU CC.
* provided by the system. We augment it with depth and current owner id
* fields to implement and re-entrant lock.
*/
-struct _objc_mutex
+struct objc_mutex
{
- volatile _objc_thread_t owner; /* Id of thread that owns. */
+ volatile objc_thread_t owner; /* Id of thread that owns. */
volatile int depth; /* # of acquires. */
HANDLE handle; /* Win32 mutex HANDLE. */
};
* Create a new thread of execution and return its id. Return NULL if fails.
* The new thread starts in "func" with the given argument.
*/
-_objc_thread_t
+objc_thread_t
objc_thread_create(void (*func)(void *arg), void *arg)
{
DWORD thread_id = 0; /* Detached thread id. */
objc_mutex_unlock(__objc_runtime_mutex);
- return (_objc_thread_t)thread_id;
+ return (objc_thread_t)thread_id;
}
/********
* Returns an integer value which uniquely describes a thread. Must not be
* -1 which is reserved as a marker for "no thread".
*/
-_objc_thread_t
+objc_thread_t
objc_thread_id(void)
{
- return (_objc_thread_t)GetCurrentThreadId(); /* Return thread id. */
+ return (objc_thread_t)GetCurrentThreadId(); /* Return thread id. */
}
/********
* Allocate a mutex. Return the mutex pointer if successful or NULL if
* the allocation fails for any reason.
*/
-_objc_mutex_t
+objc_mutex_t
objc_mutex_allocate(void)
{
- _objc_mutex_t mutex;
+ objc_mutex_t mutex;
int err = 0;
- if (!(mutex = (_objc_mutex_t) objc_malloc(sizeof(struct _objc_mutex))))
+ if (!(mutex = (objc_mutex_t)objc_malloc(sizeof(struct objc_mutex))))
return NULL; /* Abort if malloc failed. */
if ((mutex->handle = CreateMutex(NULL, 0, NULL)) == NULL) {
* Returns the number of locks on the thread. (1 for deallocate).
*/
int
-objc_mutex_deallocate(_objc_mutex_t mutex)
+objc_mutex_deallocate(objc_mutex_t mutex)
{
int depth; /* # of locks on mutex. */
* Returns the lock count on the mutex held by this thread.
*/
int
-objc_mutex_lock(_objc_mutex_t mutex)
+objc_mutex_lock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
int status;
if (!mutex) /* Is argument bad? */
* thread has a lock on the mutex returns -1.
*/
int
-objc_mutex_trylock(_objc_mutex_t mutex)
+objc_mutex_trylock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
DWORD status; /* Return status from Win32.*/
if (!mutex) /* Is argument bad? */
* Will also return -1 if the mutex free fails.
*/
int
-objc_mutex_unlock(_objc_mutex_t mutex)
+objc_mutex_unlock(objc_mutex_t mutex)
{
- _objc_thread_t thread_id; /* Cache our thread id. */
+ objc_thread_t thread_id; /* Cache our thread id. */
if (!mutex) /* Is argument bad? */
return -1; /* Yes, abort. */
/* GNU Objective C Runtime Thread Interface
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
This file is part of GNU CC.
* Thread is started by sending message with selector to object. Message
* takes a single argument.
*/
-_objc_thread_t
+objc_thread_t
objc_thread_detach(SEL selector, id object, id argument)
{
struct __objc_thread_start_state *istate; /* Initialial thread state. */
- _objc_thread_t thread_id = NULL; /* Detached thread id. */
+ objc_thread_t thread_id = NULL; /* Detached thread id. */
if (!(istate = (struct __objc_thread_start_state *)
objc_malloc(sizeof(*istate)))) /* Can we allocate state? */
#undef objc_mutex_unlock()
int
-objc_mutex_unlock_x(_objc_mutex_t mutex, const char *f, int l)
+objc_mutex_unlock_x(objc_mutex_t mutex, const char *f, int l)
{
printf("%16.16s#%4d < unlock", f, l);
return objc_mutex_unlock(mutex);
}
int
-objc_mutex_lock_x(_objc_mutex_t mutex, const char *f, int l)
+objc_mutex_lock_x(objc_mutex_t mutex, const char *f, int l)
{
printf("%16.16s#%4d < lock", f, l);
return objc_mutex_lock(mutex);