os/ossrv/genericopenlibs/openenvcore/libc/include/reentrant.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*-
sl@0
     2
 * Copyright (c) 1997,98 The NetBSD Foundation, Inc.
sl@0
     3
 * All rights reserved.
sl@0
     4
 *
sl@0
     5
 * This code is derived from software contributed to The NetBSD Foundation
sl@0
     6
 * by J.T. Conklin.
sl@0
     7
 *
sl@0
     8
 * Redistribution and use in source and binary forms, with or without
sl@0
     9
 * modification, are permitted provided that the following conditions
sl@0
    10
 * are met:
sl@0
    11
 * 1. Redistributions of source code must retain the above copyright
sl@0
    12
 *    notice, this list of conditions and the following disclaimer.
sl@0
    13
 * 2. Redistributions in binary form must reproduce the above copyright
sl@0
    14
 *    notice, this list of conditions and the following disclaimer in the
sl@0
    15
 *    documentation and/or other materials provided with the distribution.
sl@0
    16
 * 4. Neither the name of The NetBSD Foundation nor the names of its
sl@0
    17
 *    contributors may be used to endorse or promote products derived
sl@0
    18
 *    from this software without specific prior written permission.
sl@0
    19
 *
sl@0
    20
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
sl@0
    21
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
sl@0
    22
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
sl@0
    23
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
sl@0
    24
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
sl@0
    25
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
sl@0
    26
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
sl@0
    27
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
sl@0
    28
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
sl@0
    29
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
sl@0
    30
 * POSSIBILITY OF SUCH DAMAGE.
sl@0
    31
 *
sl@0
    32
 * $FreeBSD: src/lib/libc/include/reentrant.h,v 1.3 2004/02/25 21:03:45 green Exp $
sl@0
    33
 */
sl@0
    34
sl@0
    35
/*
sl@0
    36
 * Requirements:
sl@0
    37
 * 
sl@0
    38
 * 1. The thread safe mechanism should be lightweight so the library can
sl@0
    39
 *    be used by non-threaded applications without unreasonable overhead.
sl@0
    40
 * 
sl@0
    41
 * 2. There should be no dependency on a thread engine for non-threaded
sl@0
    42
 *    applications.
sl@0
    43
 * 
sl@0
    44
 * 3. There should be no dependency on any particular thread engine.
sl@0
    45
 * 
sl@0
    46
 * 4. The library should be able to be compiled without support for thread
sl@0
    47
 *    safety.
sl@0
    48
 * 
sl@0
    49
 * 
sl@0
    50
 * Rationale:
sl@0
    51
 * 
sl@0
    52
 * One approach for thread safety is to provide discrete versions of the
sl@0
    53
 * library: one thread safe, the other not.  The disadvantage of this is
sl@0
    54
 * that libc is rather large, and two copies of a library which are 99%+
sl@0
    55
 * identical is not an efficent use of resources.
sl@0
    56
 * 
sl@0
    57
 * Another approach is to provide a single thread safe library.  However,
sl@0
    58
 * it should not add significant run time or code size overhead to non-
sl@0
    59
 * threaded applications.
sl@0
    60
 * 
sl@0
    61
 * Since the NetBSD C library is used in other projects, it should be
sl@0
    62
 * easy to replace the mutual exclusion primitives with ones provided by
sl@0
    63
 * another system.  Similarly, it should also be easy to remove all
sl@0
    64
 * support for thread safety completely if the target environment does
sl@0
    65
 * not support threads.
sl@0
    66
 * 
sl@0
    67
 * 
sl@0
    68
 * Implementation Details:
sl@0
    69
 * 
sl@0
    70
 * The mutex primitives used by the library (mutex_t, mutex_lock, etc.)
sl@0
    71
 * are macros which expand to the cooresponding primitives provided by
sl@0
    72
 * the thread engine or to nothing.  The latter is used so that code is
sl@0
    73
 * not unreasonably cluttered with #ifdefs when all thread safe support
sl@0
    74
 * is removed.
sl@0
    75
 * 
sl@0
    76
 * The mutex macros can be directly mapped to the mutex primitives from
sl@0
    77
 * pthreads, however it should be reasonably easy to wrap another mutex
sl@0
    78
 * implementation so it presents a similar interface.
sl@0
    79
 * 
sl@0
    80
 * Stub implementations of the mutex functions are provided with *weak*
sl@0
    81
 * linkage.  These functions simply return success.  When linked with a
sl@0
    82
 * thread library (i.e. -lpthread), the functions will override the
sl@0
    83
 * stubs.
sl@0
    84
 */
sl@0
    85
sl@0
    86
#include <pthread.h>
sl@0
    87
#ifndef __SYMBIAN32__
sl@0
    88
#include <pthread_np.h>
sl@0
    89
#endif
sl@0
    90
#include "libc_private.h"
sl@0
    91
sl@0
    92
#define mutex_t			pthread_mutex_t
sl@0
    93
#define cond_t			pthread_cond_t
sl@0
    94
#define rwlock_t		pthread_rwlock_t
sl@0
    95
#define once_t			pthread_once_t
sl@0
    96
sl@0
    97
#define thread_key_t		pthread_key_t
sl@0
    98
#define MUTEX_INITIALIZER	PTHREAD_MUTEX_INITIALIZER
sl@0
    99
#define RWLOCK_INITIALIZER	PTHREAD_RWLOCK_INITIALIZER
sl@0
   100
#define ONCE_INITIALIZER	PTHREAD_ONCE_INIT
sl@0
   101
sl@0
   102
#define mutex_init(m, a)	_pthread_mutex_init(m, a)
sl@0
   103
#define mutex_lock(m)		if (__isthreaded) \
sl@0
   104
				_pthread_mutex_lock(m)
sl@0
   105
#define mutex_unlock(m)		if (__isthreaded) \
sl@0
   106
				_pthread_mutex_unlock(m)
sl@0
   107
#define mutex_trylock(m)	(__isthreaded ? 0 : _pthread_mutex_trylock(m))
sl@0
   108
sl@0
   109
#define cond_init(c, a, p)	_pthread_cond_init(c, a)
sl@0
   110
#define cond_signal(m)		if (__isthreaded) \
sl@0
   111
				_pthread_cond_signal(m)
sl@0
   112
#define cond_broadcast(m)	if (__isthreaded) \
sl@0
   113
				_pthread_cond_broadcast(m)
sl@0
   114
#define cond_wait(c, m)		if (__isthreaded) \
sl@0
   115
				_pthread_cond_wait(c, m)
sl@0
   116
sl@0
   117
#define rwlock_init(l, a)	_pthread_rwlock_init(l, a)
sl@0
   118
#define rwlock_rdlock(l)	if (__isthreaded) \
sl@0
   119
				_pthread_rwlock_rdlock(l)
sl@0
   120
#define rwlock_wrlock(l)	if (__isthreaded) \
sl@0
   121
				_pthread_rwlock_wrlock(l)
sl@0
   122
#define rwlock_unlock(l)	if (__isthreaded) \
sl@0
   123
				_pthread_rwlock_unlock(l)
sl@0
   124
sl@0
   125
#define thr_keycreate(k, d)	_pthread_key_create(k, d)
sl@0
   126
#define thr_setspecific(k, p)	_pthread_setspecific(k, p)
sl@0
   127
#define thr_getspecific(k)	_pthread_getspecific(k)
sl@0
   128
#define thr_sigsetmask(f, n, o)	_pthread_sigmask(f, n, o)
sl@0
   129
sl@0
   130
#define thr_once(o, i)		_pthread_once(o, i)
sl@0
   131
#define thr_self()		_pthread_self()
sl@0
   132
#define thr_exit(x)		_pthread_exit(x)
sl@0
   133
#define thr_main()		_pthread_main_np()