b8698a0f37
2009-11-25 H.J. Lu <hongjiu.lu@intel.com> * alias.c: Remove trailing white spaces. * alloc-pool.c: Likewise. * alloc-pool.h: Likewise. * attribs.c: Likewise. * auto-inc-dec.c: Likewise. * basic-block.h: Likewise. * bb-reorder.c: Likewise. * bt-load.c: Likewise. * builtins.c: Likewise. * builtins.def: Likewise. * c-common.c: Likewise. * c-common.h: Likewise. * c-cppbuiltin.c: Likewise. * c-decl.c: Likewise. * c-format.c: Likewise. * c-lex.c: Likewise. * c-omp.c: Likewise. * c-opts.c: Likewise. * c-parser.c: Likewise. * c-pretty-print.c: Likewise. * c-tree.h: Likewise. * c-typeck.c: Likewise. * caller-save.c: Likewise. * calls.c: Likewise. * cfg.c: Likewise. * cfganal.c: Likewise. * cfgexpand.c: Likewise. * cfghooks.c: Likewise. * cfghooks.h: Likewise. * cfglayout.c: Likewise. * cfgloop.c: Likewise. * cfgloop.h: Likewise. * cfgloopmanip.c: Likewise. * cfgrtl.c: Likewise. * cgraph.c: Likewise. * cgraph.h: Likewise. * cgraphbuild.c: Likewise. * cgraphunit.c: Likewise. * cif-code.def: Likewise. * collect2.c: Likewise. * combine.c: Likewise. * convert.c: Likewise. * coverage.c: Likewise. * crtstuff.c: Likewise. * cse.c: Likewise. * cselib.c: Likewise. * dbgcnt.c: Likewise. * dbgcnt.def: Likewise. * dbgcnt.h: Likewise. * dbxout.c: Likewise. * dce.c: Likewise. * ddg.c: Likewise. * ddg.h: Likewise. * defaults.h: Likewise. * df-byte-scan.c: Likewise. * df-core.c: Likewise. * df-problems.c: Likewise. * df-scan.c: Likewise. * df.h: Likewise. * dfp.c: Likewise. * diagnostic.c: Likewise. * diagnostic.h: Likewise. * dominance.c: Likewise. * domwalk.c: Likewise. * double-int.c: Likewise. * double-int.h: Likewise. * dse.c: Likewise. * dwarf2asm.c: Likewise. * dwarf2asm.h: Likewise. * dwarf2out.c: Likewise. * ebitmap.c: Likewise. * ebitmap.h: Likewise. * emit-rtl.c: Likewise. * et-forest.c: Likewise. * except.c: Likewise. * except.h: Likewise. * expmed.c: Likewise. * expr.c: Likewise. * expr.h: Likewise. * final.c: Likewise. * flags.h: Likewise. * fold-const.c: Likewise. * function.c: Likewise. * function.h: Likewise. * fwprop.c: Likewise. * gcc.c: Likewise. * gcov-dump.c: Likewise. * gcov-io.c: Likewise. * gcov-io.h: Likewise. * gcov.c: Likewise. * gcse.c: Likewise. * genattr.c: Likewise. * genattrtab.c: Likewise. * genautomata.c: Likewise. * genchecksum.c: Likewise. * genconfig.c: Likewise. * genflags.c: Likewise. * gengtype-parse.c: Likewise. * gengtype.c: Likewise. * gengtype.h: Likewise. * genmddeps.c: Likewise. * genmodes.c: Likewise. * genopinit.c: Likewise. * genpreds.c: Likewise. * gensupport.c: Likewise. * ggc-common.c: Likewise. * ggc-page.c: Likewise. * ggc-zone.c: Likewise. * ggc.h: Likewise. * gimple-iterator.c: Likewise. * gimple-low.c: Likewise. * gimple-pretty-print.c: Likewise. * gimple.c: Likewise. * gimple.def: Likewise. * gimple.h: Likewise. * gimplify.c: Likewise. * graphds.c: Likewise. * graphite-clast-to-gimple.c: Likewise. * gthr-nks.h: Likewise. * gthr-posix.c: Likewise. * gthr-posix.h: Likewise. * gthr-posix95.h: Likewise. * gthr-single.h: Likewise. * gthr-tpf.h: Likewise. * gthr-vxworks.h: Likewise. * gthr.h: Likewise. * haifa-sched.c: Likewise. * hard-reg-set.h: Likewise. * hooks.c: Likewise. * hooks.h: Likewise. * hosthooks.h: Likewise. * hwint.h: Likewise. * ifcvt.c: Likewise. * incpath.c: Likewise. * init-regs.c: Likewise. * integrate.c: Likewise. * ipa-cp.c: Likewise. * ipa-inline.c: Likewise. * ipa-prop.c: Likewise. * ipa-pure-const.c: Likewise. * ipa-reference.c: Likewise. * ipa-struct-reorg.c: Likewise. * ipa-struct-reorg.h: Likewise. * ipa-type-escape.c: Likewise. * ipa-type-escape.h: Likewise. * ipa-utils.c: Likewise. * ipa-utils.h: Likewise. * ipa.c: Likewise. * ira-build.c: Likewise. * ira-color.c: Likewise. * ira-conflicts.c: Likewise. * ira-costs.c: Likewise. * ira-emit.c: Likewise. * ira-int.h: Likewise. * ira-lives.c: Likewise. * ira.c: Likewise. * jump.c: Likewise. * lambda-code.c: Likewise. * lambda-mat.c: Likewise. * lambda-trans.c: Likewise. * lambda.h: Likewise. * langhooks.c: Likewise. * lcm.c: Likewise. * libgcov.c: Likewise. * lists.c: Likewise. * loop-doloop.c: Likewise. * loop-init.c: Likewise. * loop-invariant.c: Likewise. * loop-iv.c: Likewise. * loop-unroll.c: Likewise. * lower-subreg.c: Likewise. * lto-cgraph.c: Likewise. * lto-compress.c: Likewise. * lto-opts.c: Likewise. * lto-section-in.c: Likewise. * lto-section-out.c: Likewise. * lto-streamer-in.c: Likewise. * lto-streamer-out.c: Likewise. * lto-streamer.c: Likewise. * lto-streamer.h: Likewise. * lto-symtab.c: Likewise. * lto-wpa-fixup.c: Likewise. * matrix-reorg.c: Likewise. * mcf.c: Likewise. * mode-switching.c: Likewise. * modulo-sched.c: Likewise. * omega.c: Likewise. * omega.h: Likewise. * omp-low.c: Likewise. * optabs.c: Likewise. * optabs.h: Likewise. * opts-common.c: Likewise. * opts.c: Likewise. * params.def: Likewise. * params.h: Likewise. * passes.c: Likewise. * plugin.c: Likewise. * postreload-gcse.c: Likewise. * postreload.c: Likewise. * predict.c: Likewise. * predict.def: Likewise. * pretty-print.c: Likewise. * pretty-print.h: Likewise. * print-rtl.c: Likewise. * print-tree.c: Likewise. * profile.c: Likewise. * read-rtl.c: Likewise. * real.c: Likewise. * recog.c: Likewise. * reg-stack.c: Likewise. * regcprop.c: Likewise. * reginfo.c: Likewise. * regmove.c: Likewise. * regrename.c: Likewise. * regs.h: Likewise. * regstat.c: Likewise. * reload.c: Likewise. * reload1.c: Likewise. * resource.c: Likewise. * rtl.c: Likewise. * rtl.def: Likewise. * rtl.h: Likewise. * rtlanal.c: Likewise. * sbitmap.c: Likewise. * sched-deps.c: Likewise. * sched-ebb.c: Likewise. * sched-int.h: Likewise. * sched-rgn.c: Likewise. * sched-vis.c: Likewise. * sdbout.c: Likewise. * sel-sched-dump.c: Likewise. * sel-sched-dump.h: Likewise. * sel-sched-ir.c: Likewise. * sel-sched-ir.h: Likewise. * sel-sched.c: Likewise. * sel-sched.h: Likewise. * sese.c: Likewise. * sese.h: Likewise. * simplify-rtx.c: Likewise. * stack-ptr-mod.c: Likewise. * stmt.c: Likewise. * stor-layout.c: Likewise. * store-motion.c: Likewise. * stringpool.c: Likewise. * stub-objc.c: Likewise. * sync-builtins.def: Likewise. * target-def.h: Likewise. * target.h: Likewise. * targhooks.c: Likewise. * targhooks.h: Likewise. * timevar.c: Likewise. * tlink.c: Likewise. * toplev.c: Likewise. * toplev.h: Likewise. * tracer.c: Likewise. * tree-affine.c: Likewise. * tree-affine.h: Likewise. * tree-browser.def: Likewise. * tree-call-cdce.c: Likewise. * tree-cfg.c: Likewise. * tree-cfgcleanup.c: Likewise. * tree-chrec.c: Likewise. * tree-chrec.h: Likewise. * tree-complex.c: Likewise. * tree-data-ref.c: Likewise. * tree-data-ref.h: Likewise. * tree-dfa.c: Likewise. * tree-dump.c: Likewise. * tree-dump.h: Likewise. * tree-eh.c: Likewise. * tree-flow-inline.h: Likewise. * tree-flow.h: Likewise. * tree-if-conv.c: Likewise. * tree-inline.c: Likewise. * tree-into-ssa.c: Likewise. * tree-loop-distribution.c: Likewise. * tree-loop-linear.c: Likewise. * tree-mudflap.c: Likewise. * tree-nested.c: Likewise. * tree-nomudflap.c: Likewise. * tree-nrv.c: Likewise. * tree-object-size.c: Likewise. * tree-optimize.c: Likewise. * tree-outof-ssa.c: Likewise. * tree-parloops.c: Likewise. * tree-pass.h: Likewise. * tree-phinodes.c: Likewise. * tree-predcom.c: Likewise. * tree-pretty-print.c: Likewise. * tree-profile.c: Likewise. * tree-scalar-evolution.c: Likewise. * tree-ssa-address.c: Likewise. * tree-ssa-alias.c: Likewise. * tree-ssa-ccp.c: Likewise. * tree-ssa-coalesce.c: Likewise. * tree-ssa-copy.c: Likewise. * tree-ssa-copyrename.c: Likewise. * tree-ssa-dce.c: Likewise. * tree-ssa-dom.c: Likewise. * tree-ssa-dse.c: Likewise. * tree-ssa-forwprop.c: Likewise. * tree-ssa-ifcombine.c: Likewise. * tree-ssa-live.c: Likewise. * tree-ssa-live.h: Likewise. * tree-ssa-loop-ch.c: Likewise. * tree-ssa-loop-im.c: Likewise. * tree-ssa-loop-ivcanon.c: Likewise. * tree-ssa-loop-ivopts.c: Likewise. * tree-ssa-loop-manip.c: Likewise. * tree-ssa-loop-niter.c: Likewise. * tree-ssa-loop-prefetch.c: Likewise. * tree-ssa-loop-unswitch.c: Likewise. * tree-ssa-loop.c: Likewise. * tree-ssa-math-opts.c: Likewise. * tree-ssa-operands.c: Likewise. * tree-ssa-operands.h: Likewise. * tree-ssa-phiopt.c: Likewise. * tree-ssa-phiprop.c: Likewise. * tree-ssa-pre.c: Likewise. * tree-ssa-propagate.c: Likewise. * tree-ssa-reassoc.c: Likewise. * tree-ssa-sccvn.c: Likewise. * tree-ssa-sink.c: Likewise. * tree-ssa-structalias.c: Likewise. * tree-ssa-ter.c: Likewise. * tree-ssa-threadedge.c: Likewise. * tree-ssa-threadupdate.c: Likewise. * tree-ssa-uncprop.c: Likewise. * tree-ssa.c: Likewise. * tree-ssanames.c: Likewise. * tree-switch-conversion.c: Likewise. * tree-tailcall.c: Likewise. * tree-vect-data-refs.c: Likewise. * tree-vect-generic.c: Likewise. * tree-vect-loop-manip.c: Likewise. * tree-vect-loop.c: Likewise. * tree-vect-patterns.c: Likewise. * tree-vect-slp.c: Likewise. * tree-vect-stmts.c: Likewise. * tree-vectorizer.c: Likewise. * tree-vectorizer.h: Likewise. * tree-vrp.c: Likewise. * tree.c: Likewise. * tree.def: Likewise. * tree.h: Likewise. * treestruct.def: Likewise. * unwind-compat.c: Likewise. * unwind-dw2-fde-glibc.c: Likewise. * unwind-dw2.c: Likewise. * value-prof.c: Likewise. * value-prof.h: Likewise. * var-tracking.c: Likewise. * varasm.c: Likewise. * varpool.c: Likewise. * vec.c: Likewise. * vec.h: Likewise. * vmsdbgout.c: Likewise. * web.c: Likewise. * xcoffout.c: Likewise. From-SVN: r154645
398 lines
9.1 KiB
C
398 lines
9.1 KiB
C
/* Threads compatibility routines for libgcc2 and libobjc. */
|
|
/* Compile this one with gcc. */
|
|
/* Copyright (C) 2002, 2003, 2004, 2008, 2009 Free Software Foundation, Inc.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC 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 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC 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.
|
|
|
|
Under Section 7 of GPL version 3, you are granted additional
|
|
permissions described in the GCC Runtime Library Exception, version
|
|
3.1, as published by the Free Software Foundation.
|
|
|
|
You should have received a copy of the GNU General Public License and
|
|
a copy of the GCC Runtime Library Exception along with this program;
|
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GCC_GTHR_NKS_H
|
|
#define GCC_GTHR_NKS_H
|
|
|
|
/* NKS threads specific definitions.
|
|
Easy, since the interface is mostly one-to-one mapping. */
|
|
|
|
#define __GTHREADS 1
|
|
|
|
#define NKS_NO_INLINE_FUNCS
|
|
#include <nksapi.h>
|
|
#include <string.h>
|
|
|
|
typedef NXKey_t __gthread_key_t;
|
|
typedef NXMutex_t *__gthread_mutex_t;
|
|
typedef NXMutex_t *__gthread_recursive_mutex_t;
|
|
|
|
#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function
|
|
#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function
|
|
|
|
static inline int
|
|
__gthread_active_p (void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
#ifdef _LIBOBJC
|
|
|
|
/* This is the config.h file in libobjc/ */
|
|
#include <config.h>
|
|
|
|
#ifdef HAVE_SCHED_H
|
|
# include <sched.h>
|
|
#endif
|
|
|
|
/* Key structure for maintaining thread specific storage */
|
|
static NXKey_t _objc_thread_storage;
|
|
|
|
/* Backend initialization functions */
|
|
|
|
/* Initialize the threads subsystem. */
|
|
static inline int
|
|
__gthread_objc_init_thread_system (void)
|
|
{
|
|
/* Initialize the thread storage key. */
|
|
if (NXKeyCreate (NULL, NULL, &_objc_thread_storage) == 0)
|
|
return 0;
|
|
return -1;
|
|
}
|
|
|
|
/* Close the threads subsystem. */
|
|
static inline int
|
|
__gthread_objc_close_thread_system (void)
|
|
{
|
|
if (NXKeyDelete (_objc_thread_storage) == 0)
|
|
return 0;
|
|
return -1;
|
|
}
|
|
|
|
/* Backend thread functions */
|
|
|
|
/* Create a new thread of execution. */
|
|
static inline objc_thread_t
|
|
__gthread_objc_thread_detach (void (*func)(void *), void *arg)
|
|
{
|
|
objc_thread_t thread_id;
|
|
NXContext_t context;
|
|
NXThreadId_t new_thread_handle;
|
|
int err;
|
|
|
|
if ((context = NXContextAlloc (func, arg, NX_PRIO_MED, 0, 0, 0, &err)) == NULL)
|
|
thread_id = NULL;
|
|
else if (NXThreadCreate (context, NX_THR_DETACHED, &new_thread_handle) == 0)
|
|
thread_id = (objc_thread_t) new_thread_handle;
|
|
else {
|
|
NXContextFree (context);
|
|
thread_id = NULL;
|
|
}
|
|
|
|
return thread_id;
|
|
}
|
|
|
|
/* Set the current thread's priority. */
|
|
static inline int
|
|
__gthread_objc_thread_set_priority (int priority)
|
|
{
|
|
if (NXThreadSetPriority (NXThreadGetId (), priority) == 0)
|
|
return 0;
|
|
return -1;
|
|
}
|
|
|
|
/* Return the current thread's priority. */
|
|
static inline int
|
|
__gthread_objc_thread_get_priority (void)
|
|
{
|
|
int priority;
|
|
|
|
if (NXThreadGetPriority (NXThreadGetId (), &priority) == 0)
|
|
return priority;
|
|
return -1;
|
|
}
|
|
|
|
/* Yield our process time to another thread. */
|
|
static inline void
|
|
__gthread_objc_thread_yield (void)
|
|
{
|
|
NXThreadYield ();
|
|
}
|
|
|
|
/* Terminate the current thread. */
|
|
static inline int
|
|
__gthread_objc_thread_exit (void)
|
|
{
|
|
/* exit the thread */
|
|
NXThreadExit (&__objc_thread_exit_status);
|
|
|
|
/* Failed if we reached here */
|
|
return -1;
|
|
}
|
|
|
|
/* Returns an integer value which uniquely describes a thread. */
|
|
static inline objc_thread_t
|
|
__gthread_objc_thread_id (void)
|
|
{
|
|
(objc_thread_t) NXThreadGetId ();
|
|
}
|
|
|
|
/* Sets the thread's local storage pointer. */
|
|
static inline int
|
|
__gthread_objc_thread_set_data (void *value)
|
|
{
|
|
return NXKeySetValue (_objc_thread_storage, value);
|
|
}
|
|
|
|
/* Returns the thread's local storage pointer. */
|
|
static inline void *
|
|
__gthread_objc_thread_get_data (void)
|
|
{
|
|
void *value;
|
|
|
|
if (NXKeyGetValue (_objc_thread_storage, &value) == 0)
|
|
return value;
|
|
return NULL;
|
|
}
|
|
|
|
/* Backend mutex functions */
|
|
|
|
/* Allocate a mutex. */
|
|
static inline int
|
|
__gthread_objc_mutex_allocate (objc_mutex_t mutex)
|
|
{
|
|
static const NX_LOCK_INFO_ALLOC (info, "GNU ObjC", 0);
|
|
|
|
if ((mutex->backend = NXMutexAlloc (0, 0, &info)) == NULL)
|
|
return 0;
|
|
return -1;
|
|
}
|
|
|
|
/* Deallocate a mutex. */
|
|
static inline int
|
|
__gthread_objc_mutex_deallocate (objc_mutex_t mutex)
|
|
{
|
|
while (NXMutexIsOwned ((NXMutex_t *)mutex->backend))
|
|
NXUnlock ((NXMutex_t *)mutex->backend);
|
|
if (NXMutexFree ((NXMutex_t *)mutex->backend) != 0)
|
|
return -1;
|
|
mutex->backend = NULL;
|
|
return 0;
|
|
}
|
|
|
|
/* Grab a lock on a mutex. */
|
|
static inline int
|
|
__gthread_objc_mutex_lock (objc_mutex_t mutex)
|
|
{
|
|
return NXLock ((NXMutex_t *)mutex->backend);
|
|
}
|
|
|
|
/* Try to grab a lock on a mutex. */
|
|
static inline int
|
|
__gthread_objc_mutex_trylock (objc_mutex_t mutex)
|
|
{
|
|
if (!NXTryLock ((NXMutex_t *)mutex->backend))
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
/* Unlock the mutex */
|
|
static inline int
|
|
__gthread_objc_mutex_unlock (objc_mutex_t mutex)
|
|
{
|
|
return NXUnlock ((NXMutex_t *)mutex->backend);
|
|
}
|
|
|
|
/* Backend condition mutex functions */
|
|
|
|
/* Allocate a condition. */
|
|
static inline int
|
|
__gthread_objc_condition_allocate (objc_condition_t condition)
|
|
{
|
|
condition->backend = NXCondAlloc (NULL);
|
|
if (condition->backend == NULL)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Deallocate a condition. */
|
|
static inline int
|
|
__gthread_objc_condition_deallocate (objc_condition_t condition)
|
|
{
|
|
if (NXCondFree ((NXCond_t *)condition->backend) != 0)
|
|
return -1;
|
|
condition->backend = NULL;
|
|
return 0;
|
|
}
|
|
|
|
/* Wait on the condition */
|
|
static inline int
|
|
__gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex)
|
|
{
|
|
return NXCondWait ((NXCond_t *)condition->backend, (NXMutex_t *)mutex->backend);
|
|
}
|
|
|
|
/* Wake up all threads waiting on this condition. */
|
|
static inline int
|
|
__gthread_objc_condition_broadcast (objc_condition_t condition)
|
|
{
|
|
return NXCondBroadcast ((NXCond_t *)condition->backend);
|
|
}
|
|
|
|
/* Wake up one thread waiting on this condition. */
|
|
static inline int
|
|
__gthread_objc_condition_signal (objc_condition_t condition)
|
|
{
|
|
return NXCondSignal ((NXCond_t *)condition->backend);
|
|
}
|
|
|
|
#else /* _LIBOBJC */
|
|
|
|
#if defined(__cplusplus)
|
|
# include <bits/atomicity.h>
|
|
/* The remaining conditions here are temporary until there is
|
|
an application accessible atomic operations API set... */
|
|
#elif defined(_M_IA64) || defined(__ia64__)
|
|
# include <../libstdc++-v3/config/cpu/ia64/bits/atomicity.h>
|
|
#elif defined(_M_IX86) || defined(__i486__)
|
|
# include <../libstdc++-v3/config/cpu/i486/bits/atomicity.h>
|
|
#elif defined(_M_AMD64) || defined(__x86_64__)
|
|
# include <../libstdc++-v3/config/cpu/x86-64/bits/atomicity.h>
|
|
#endif
|
|
|
|
typedef volatile long __gthread_once_t;
|
|
|
|
#define __GTHREAD_ONCE_INIT 0
|
|
|
|
static inline int
|
|
__gthread_once (__gthread_once_t *__once, void (*__func) (void))
|
|
{
|
|
if (__compare_and_swap (__once, 0, 1))
|
|
{
|
|
__func ();
|
|
*__once |= 2;
|
|
}
|
|
else
|
|
{
|
|
while (!(*__once & 2))
|
|
NXThreadYield ();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
|
|
{
|
|
return NXKeyCreate (__dtor, NULL, __key);
|
|
}
|
|
|
|
static inline int
|
|
__gthread_key_dtor (__gthread_key_t __key, void *__ptr)
|
|
{
|
|
/* Just reset the key value to zero. */
|
|
if (__ptr)
|
|
return NXKeySetValue (__key, NULL);
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
__gthread_key_delete (__gthread_key_t __key)
|
|
{
|
|
return NXKeyDelete (__key);
|
|
}
|
|
|
|
static inline void *
|
|
__gthread_getspecific (__gthread_key_t __key)
|
|
{
|
|
void *__value;
|
|
|
|
if (NXKeyGetValue (__key, &__value) == 0)
|
|
return __value;
|
|
return NULL;
|
|
}
|
|
|
|
static inline int
|
|
__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
|
|
{
|
|
return NXKeySetValue (__key, (void *)__ptr);
|
|
}
|
|
|
|
static inline void
|
|
__gthread_mutex_init_function (__gthread_mutex_t *__mutex)
|
|
{
|
|
static const NX_LOCK_INFO_ALLOC (__info, "GTHREADS", 0);
|
|
|
|
*__mutex = NXMutexAlloc (0, 0, &__info);
|
|
}
|
|
|
|
static inline int
|
|
__gthread_mutex_destroy (__gthread_mutex_t * UNUSED(__mutex))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
__gthread_mutex_lock (__gthread_mutex_t *__mutex)
|
|
{
|
|
return NXLock (*__mutex);
|
|
}
|
|
|
|
static inline int
|
|
__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
|
|
{
|
|
if (NXTryLock (*__mutex))
|
|
return 0;
|
|
return -1;
|
|
}
|
|
|
|
static inline int
|
|
__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
|
|
{
|
|
return NXUnlock (*__mutex);
|
|
}
|
|
|
|
static inline void
|
|
__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex)
|
|
{
|
|
static const NX_LOCK_INFO_ALLOC (__info, "GTHREADS", 0);
|
|
|
|
*__mutex = NXMutexAlloc (NX_MUTEX_RECURSIVE, 0, &__info);
|
|
}
|
|
|
|
static inline int
|
|
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
|
|
{
|
|
return NXLock (*__mutex);
|
|
}
|
|
|
|
static inline int
|
|
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
|
|
{
|
|
if (NXTryLock (*__mutex))
|
|
return 0;
|
|
return -1;
|
|
}
|
|
|
|
static inline int
|
|
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
|
|
{
|
|
return NXUnlock (*__mutex);
|
|
}
|
|
|
|
#endif /* _LIBOBJC */
|
|
|
|
#endif /* not GCC_GTHR_NKS_H */
|