259 lines
7.3 KiB
C
259 lines
7.3 KiB
C
/* $Header: /usr/cvsroot/target/h/wrn/wm/common/thread.h,v 1.2 2003/01/16 18:20:14 josh Exp $ */
|
|
|
|
/*
|
|
* Copyright (C) 1999-2005 Wind River Systems, Inc.
|
|
* All rights reserved. Provided under license only.
|
|
* Distribution or other use of this software is only
|
|
* permitted pursuant to the terms of a license agreement
|
|
* from Wind River Systems (and is otherwise prohibited).
|
|
* Refer to that license agreement for terms of use.
|
|
*/
|
|
|
|
/****************************************************************************
|
|
* Copyright 2000-2001 Wind River Systems, Inc.
|
|
* Copyright 1998-1999 Integrated Systems, Inc.
|
|
* All rights reserved.
|
|
****************************************************************************/
|
|
|
|
/*
|
|
* $Log: thread.h,v $
|
|
* Revision 1.2 2003/01/16 18:20:14 josh
|
|
* directory structure shifting
|
|
*
|
|
* Revision 1.1.1.1 2001/11/05 17:47:18 tneale
|
|
* Tornado shuffle
|
|
*
|
|
* Revision 1.13 2001/06/12 08:06:07 paul
|
|
* Mutex priorities are unsigned.
|
|
* Added debugging to condition variable routines.
|
|
*
|
|
* Revision 1.12 2001/03/22 20:29:38 paul
|
|
* The diab compiler is pickier than gcc.
|
|
*
|
|
* Revision 1.11 2001/03/22 16:54:08 paul
|
|
* Mutex and condition variable functions now return errors.
|
|
*
|
|
* Revision 1.10 2001/03/20 17:11:14 paul
|
|
* Removed unused timeout macros.
|
|
*
|
|
* Revision 1.9 2001/01/19 22:21:29 paul
|
|
* Update copyright.
|
|
*
|
|
* Revision 1.8 2000/10/16 19:21:43 paul
|
|
* Restore sockets and mempool code.
|
|
*
|
|
* Revision 1.6 2000/03/17 00:16:41 meister
|
|
* Update copyright message
|
|
*
|
|
* Revision 1.5 2000/03/09 17:15:43 tneale
|
|
* Added #idef C++ to declare extern C if needed
|
|
*
|
|
* Revision 1.4 1999/12/20 23:21:33 qli
|
|
* added ETC_GET_SEL_CONDVAR and ETC_REL_SEL_CONDVAR
|
|
*
|
|
* Revision 1.3 1999/04/28 23:53:24 sra
|
|
* Clean up various minor installation option glitches.
|
|
*
|
|
* Revision 1.2 1999/02/18 04:41:22 wes
|
|
* Sockets merge: Everything Else
|
|
* - memory pools
|
|
* - thread support
|
|
* - port-specific headers
|
|
*
|
|
* Revision 1.1.6.12 1999/01/25 21:08:01 paul
|
|
* added the first half of the copyright notice (oops)
|
|
*
|
|
* Revision 1.1.6.11 1999/01/22 19:48:50 paul
|
|
* Added this_thread(), copyright notice.
|
|
*
|
|
*/
|
|
|
|
|
|
/* [clearcase]
|
|
modification history
|
|
-------------------
|
|
01a,20apr05,job update copyright notices
|
|
*/
|
|
|
|
#ifndef COMMON_THREAD_H
|
|
#define COMMON_THREAD_H
|
|
|
|
#ifdef __cplusplus
|
|
extern"C" {
|
|
#endif
|
|
|
|
#include <thdport.h>
|
|
|
|
#define ETC_MUTEX_PRIO_MIN GLUE_MUTEX_PRIO_MIN
|
|
#define ETC_MUTEX_PRIO_LOW GLUE_MUTEX_PRIO_LOW
|
|
#define ETC_MUTEX_PRIO_MID GLUE_MUTEX_PRIO_MID
|
|
#define ETC_MUTEX_PRIO_HIGH GLUE_MUTEX_PRIO_HIGH
|
|
#define ETC_MUTEX_PRIO_MAX GLUE_MUTEX_PRIO_MAX
|
|
|
|
#if defined(INSTALL_THREAD_DEBUG) && INSTALL_THREAD_DEBUG
|
|
|
|
/*
|
|
* See the non-debug side of this #ifdef of this for documentation on
|
|
* what the various functions do.
|
|
*/
|
|
|
|
/*
|
|
* other things to consider..
|
|
* mutex names. __FILE__, __LINE__; last-lock/last-unlock info
|
|
* thread names, cond names.
|
|
* yield before/after lock/unlock, signal, cond wait,
|
|
* per thread storage for current lock prio, chain of held locks..
|
|
* How the heck do we deal with META_LOCK/UNLOCK() after cond_wait?
|
|
* (release user lock, take meta_lock, retake user lock?)
|
|
*/
|
|
|
|
typedef struct etc_mutex_t
|
|
{
|
|
int magic;
|
|
glue_mutex_t m;
|
|
char *lock_name;
|
|
void *lock_owner;
|
|
unsigned lock_prio;
|
|
struct etc_mutex_t *next_lock;
|
|
char *last_lock_file;
|
|
int last_lock_line;
|
|
char *last_unlock_file;
|
|
int last_unlock_line;
|
|
} etc_mutex_t;
|
|
|
|
typedef struct
|
|
{
|
|
glue_cond_t c;
|
|
etc_mutex_t *m;
|
|
} etc_cond_t;
|
|
|
|
extern glue_mutex_t etc_meta_mutex;
|
|
|
|
int etc_mutex_init(etc_mutex_t *lock, unsigned prio, char *name);
|
|
int etc_mutex_lock(etc_mutex_t *lock, unsigned prio, char *file, int line);
|
|
int etc_mutex_unlock(etc_mutex_t *lock, unsigned prio, char *file, int line);
|
|
void etc_mutex_lock_assert (etc_mutex_t *lock, unsigned prio, char *file, int line);
|
|
int etc_mutex_destroy (etc_mutex_t *lock, char *file, int line);
|
|
|
|
int etc_cond_init(etc_cond_t *cond, etc_mutex_t *mutex, char *file, int line);
|
|
int etc_cond_wait(etc_cond_t *cond, etc_mutex_t *mutex, char *file, int line);
|
|
int etc_cond_wakeup(etc_cond_t *cond, etc_mutex_t *mutex, char *file, int line);
|
|
int etc_cond_broadcast(etc_cond_t *cond, etc_mutex_t *mutex, char *file, int line);
|
|
int etc_cond_destroy(etc_cond_t *cond, char *file, int line);
|
|
|
|
#define ETC_LOCK_MAGIC 0x19661008
|
|
|
|
#define ETC_META_LOCK() \
|
|
GLUE_MUTEX_LOCK(&etc_meta_mutex, GLUE_MUTEX_PRIO_MIN);
|
|
|
|
#define ETC_META_UNLOCK() \
|
|
GLUE_MUTEX_UNLOCK(&etc_meta_mutex, GLUE_MUTEX_PRIO_MIN);
|
|
|
|
#define ETC_MUTEX_INIT(lock, prio, name) \
|
|
etc_mutex_init(lock, prio, name)
|
|
|
|
#define ETC_MUTEX_LOCK(lock, prio) \
|
|
etc_mutex_lock(lock, prio, __FILE__, __LINE__)
|
|
|
|
#define ETC_MUTEX_UNLOCK(lock, prio) \
|
|
etc_mutex_unlock(lock, prio, __FILE__, __LINE__)
|
|
|
|
#define ETC_MUTEX_LOCK_ASSERT(lock, prio) \
|
|
etc_mutex_lock_assert(lock, prio, __FILE__, __LINE__)
|
|
|
|
#define ETC_MUTEX_DESTROY(lock) \
|
|
etc_mutex_destroy(lock, __FILE__, __LINE__)
|
|
|
|
#define ETC_COND_INIT(cond, mutex) \
|
|
etc_cond_init(cond, mutex, __FILE__, __LINE__)
|
|
|
|
#define ETC_COND_WAIT(cond, mutex) \
|
|
etc_cond_wait(cond, mutex, __FILE__, __LINE__)
|
|
|
|
#define ETC_COND_WAKEUP(cond, mutex) \
|
|
etc_cond_wakeup(cond, mutex, __FILE__, __LINE__)
|
|
|
|
#define ETC_COND_BROADCAST(cond, mutex) \
|
|
etc_cond_broadcast(cond, mutex, __FILE__, __LINE__)
|
|
|
|
#define ETC_COND_DESTROY(cond) \
|
|
etc_cond_destroy(cond, __FILE__, __LINE__)
|
|
|
|
/* Initialize thread system (if necessary) */
|
|
extern void common_thread_init(void);
|
|
|
|
#define ETC_THREAD_INIT() common_thread_init()
|
|
|
|
void *this_thread(void);
|
|
|
|
#else /* INSTALL_THREAD_DEBUG */
|
|
|
|
/* Initialize thread system (if necessary) */
|
|
#define ETC_THREAD_INIT() GLUE_THREAD_INIT()
|
|
|
|
/*
|
|
* Mutex locks.
|
|
*/
|
|
|
|
typedef glue_mutex_t etc_mutex_t;
|
|
|
|
/* Initialize mutex */
|
|
#define ETC_MUTEX_INIT(lock, prio, name) GLUE_MUTEX_INIT(lock, prio)
|
|
|
|
/* Lock, unlock mutex */
|
|
#define ETC_MUTEX_LOCK(lock, prio) GLUE_MUTEX_LOCK(lock, prio)
|
|
#define ETC_MUTEX_UNLOCK(lock, prio) GLUE_MUTEX_UNLOCK(lock, prio)
|
|
/* Destroy mutex */
|
|
#define ETC_MUTEX_DESTROY(lock) GLUE_MUTEX_DESTROY(lock)
|
|
|
|
/* Try to lock a mutex; return 1 if successful, 0 if not (already locked) */
|
|
#define ETC_MUTEX_TRYLOCK(lock, prio) GLUE_MUTEX_TRYLOCK(lock)
|
|
|
|
/* Bug-check if we don't hold the mutex */
|
|
#define ETC_MUTEX_LOCK_ASSERT(lock, prio)
|
|
|
|
/*
|
|
* Condition variables:
|
|
*/
|
|
|
|
typedef glue_cond_t etc_cond_t;
|
|
|
|
/* initialize condition variable */
|
|
#define ETC_COND_INIT(cond, mutex) GLUE_COND_INIT(cond, mutex)
|
|
|
|
/* wait for condition to happen */
|
|
#define ETC_COND_WAIT(cond, mutex) GLUE_COND_WAIT(cond, mutex)
|
|
#define ETC_COND_DESTROY(cond) GLUE_COND_DESTROY(cond)
|
|
|
|
#define ETC_COND_WAKEUP(cond, mutex) GLUE_COND_WAKEUP(cond, mutex)
|
|
#define ETC_COND_BROADCAST(cond, mutex) GLUE_COND_BROADCAST(cond, mutex)
|
|
|
|
#endif
|
|
|
|
typedef glue_thread_t etc_thread_t;
|
|
|
|
/* Return a per-thread cookie */
|
|
#define ETC_THD_SELF() GLUE_THD_SELF()
|
|
/* Yield the processor */
|
|
#define ETC_THD_YIELD() GLUE_THD_YIELD()
|
|
|
|
/*
|
|
* the following are mostly for the benefit of snark and similar test code.
|
|
*/
|
|
|
|
/* Create a thread */
|
|
#define ETC_THD_CREATE(thread, func, arg) GLUE_THD_CREATE(thread, func, arg)
|
|
#define ETC_THD_WAIT(thread) GLUE_THD_WAIT(thread)
|
|
|
|
/* Cause the current thread to go poof */
|
|
#define ETC_THD_EXIT() GLUE_THD_EXIT()
|
|
|
|
#define ETC_GET_SEL_CONDVAR(cookie) (etc_cond_t *)GLUE_GET_SEL_CONDVAR(cookie)
|
|
#define ETC_REL_SEL_CONDVAR(cond, cookie) GLUE_REL_SEL_CONDVAR(cond, cookie)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|