#ifndef _RPCMUTEX_H
#define _RPCMUTEX_H 1
typedef struct rpc_mutex_stats_t
{
unsigned32 busy;
unsigned32 lock;
unsigned32 try_lock;
unsigned32 unlock;
unsigned32 init;
unsigned32 deletes;
unsigned32 lock_assert;
unsigned32 unlock_assert;
} rpc_mutex_stats_t, *rpc_mutex_stats_p_t;
#define RPC_MUTEX_STATUS_INITIALIZER {0, 0, 0, 0, 0, 0, 0, 0}
typedef struct rpc_mutex_t
{
dcethread_mutex m;
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
unsigned is_locked:1;
dcethread* owner;
char *locker_file;
int locker_line;
rpc_mutex_stats_t stats;
#endif
} rpc_mutex_t, *rpc_mutex_p_t;
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_INITIALIZER {DCETHREAD_MUTEX_INITIALIZER, 0, 0, NULL, 0, RPC_MUTEX_STATUS_INITIALIZER}
#else
# define RPC_MUTEX_INITIALIZER {DCETHREAD_MUTEX_INITIALIZER}
#endif
typedef struct rpc_cond_stats_t
{
unsigned32 init;
unsigned32 deletes;
unsigned32 wait;
unsigned32 signals;
} rpc_cond_stats_t, *rpc_cond_stats_p_t;
#define RPC_COND_STATS_INITIALIZER {0, 0, 0, 0}
typedef struct rpc_cond_t
{
dcethread_cond c;
rpc_mutex_p_t mp;
rpc_cond_stats_t stats;
} rpc_cond_t, *rpc_cond_p_t;
#define RPC_COND_INITIALIZER {DCETHREAD_COND_INITIALIZER, NULL, RPC_COND_STATS_INITIALIZER}
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_INIT(mutex) \
{ \
if (! rpc__mutex_init(&(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_MUTEX_INIT/rpc__mutex_init" ); \
} \
}
#else
# define RPC_MUTEX_INIT(mutex) \
{ \
RPC_LOG_MUTEX_INIT_NTR; \
dcethread_mutex_init_throw(&(mutex).m, NULL); \
RPC_LOG_MUTEX_INIT_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_DELETE(mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__mutex_delete(&(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_MUTEX_DELETE/rpc__mutex_delete" ); \
} \
} else { \
dcethread_mutex_destroy_throw(&(mutex).m); \
} \
}
#else
# define RPC_MUTEX_DELETE(mutex) \
{ \
RPC_LOG_MUTEX_DELETE_NTR; \
dcethread_mutex_destroy_throw(&(mutex).m); \
RPC_LOG_MUTEX_DELETE_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_LOCK(mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__mutex_lock(&(mutex), __FILE__, __LINE__)) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_MUTEX_LOCK/rpc__mutex_lock" ); \
} \
} else { \
RPC_LOG_MUTEX_LOCK_NTR; \
dcethread_mutex_lock_throw(&(mutex).m); \
RPC_LOG_MUTEX_LOCK_XIT; \
} \
}
#else
# define RPC_MUTEX_LOCK(mutex) \
{ \
RPC_LOG_MUTEX_LOCK_NTR; \
dcethread_mutex_lock_throw(&(mutex).m); \
RPC_LOG_MUTEX_LOCK_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_TRY_LOCK(mutex,bp) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__mutex_try_lock(&(mutex), (bp), __FILE__, __LINE__)) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_MUTEX_TRY_LOCK/rpc__mutex_try_lock" ); \
} \
} else { \
*(bp) = dcethread_mutex_trylock_throw(&(mutex).m); \
} \
}
#else
# define RPC_MUTEX_TRY_LOCK(mutex,bp) \
{ \
RPC_LOG_MUTEX_TRY_LOCK_NTR; \
*(bp) = dcethread_mutex_trylock_throw(&(mutex).m); \
RPC_LOG_MUTEX_TRY_LOCK_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_UNLOCK(mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__mutex_unlock(&(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_MUTEX_UNLOCK/rpc__mutex_unlock" ); \
} \
} else { \
dcethread_mutex_unlock_throw(&(mutex).m); \
} \
}
#else
# define RPC_MUTEX_UNLOCK(mutex) \
{ \
RPC_LOG_MUTEX_UNLOCK_NTR; \
dcethread_mutex_unlock_throw(&(mutex).m); \
RPC_LOG_MUTEX_UNLOCK_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_LOCK_ASSERT(mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__mutex_lock_assert(&(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_MUTEX_LOCK_ASSERT/rpc__mutex_lock_assert" ); \
} \
} \
}
#else
# define RPC_MUTEX_LOCK_ASSERT(mutex) { }
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_MUTEX_UNLOCK_ASSERT(mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__mutex_unlock_assert(&(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_MUTEX_UNLOCK_ASSERT/rpc__mutex_unlock_assert" ); \
} \
} \
}
#else
# define RPC_MUTEX_UNLOCK_ASSERT(mutex) { }
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_COND_INIT(cond,mutex) \
{ \
if (! rpc__cond_init(&(cond), &(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_COND_INIT/rpc__cond_init" ); \
} \
}
#else
# define RPC_COND_INIT(cond,mutex) \
{ \
RPC_LOG_COND_INIT_NTR; \
dcethread_cond_init_throw(&(cond).c, NULL); \
RPC_LOG_COND_INIT_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_COND_DELETE(cond,mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__cond_delete(&(cond), &(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_COND_DELETE/rpc__cond_delete" ); \
} \
} else { \
dcethread_cond_destroy_throw(&(cond).c); \
} \
}
#else
# define RPC_COND_DELETE(cond,mutex) \
{ \
RPC_LOG_COND_DELETE_NTR; \
dcethread_cond_destroy_throw(&(cond).c); \
RPC_LOG_COND_DELETE_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_COND_WAIT(cond,mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__cond_wait(&(cond), &(mutex), __FILE__, __LINE__)) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_COND_WAIT/rpc__cond_wait" ); \
} \
} else { \
dcethread_cond_wait_throw(&(cond).c, &(mutex).m); \
} \
}
#else
# define RPC_COND_WAIT(cond,mutex) \
{ \
RPC_LOG_COND_WAIT_NTR; \
dcethread_cond_wait_throw(&(cond).c, &(mutex).m); \
RPC_LOG_COND_WAIT_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_COND_TIMED_WAIT(cond,mutex,time) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__cond_timed_wait(&(cond), &(mutex), (time), __FILE__, __LINE__)) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_COND_TIMED_WAIT/rpc__cond_timed_wait" ); \
} \
} else { \
dcethread_cond_timedwait_throw(&(cond).c, &(mutex).m, (time)); \
} \
}
#else
# define RPC_COND_TIMED_WAIT(cond,mutex,time) \
{ \
RPC_LOG_COND_TIMED_WAIT_NTR; \
dcethread_cond_timedwait_throw(&(cond).c, &(mutex).m, (time)); \
RPC_LOG_COND_TIMED_WAIT_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_COND_SIGNAL(cond,mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__cond_signal(&(cond), &(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_COND_SIGNAL/rpc__cond_signal" ); \
} \
} else { \
dcethread_cond_signal_throw(&(cond).c); \
} \
}
#else
# define RPC_COND_SIGNAL(cond,mutex) \
{ \
RPC_LOG_COND_SIGNAL_NTR; \
dcethread_cond_signal_throw(&(cond).c); \
RPC_LOG_COND_SIGNAL_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
# define RPC_COND_BROADCAST(cond,mutex) \
{ \
if (RPC_DBG(rpc_es_dbg_mutex, 1)) \
{ \
if (! rpc__cond_broadcast(&(cond), &(mutex))) \
{ \
rpc_dce_svc_printf ( \
__FILE__, __LINE__, \
"%s", \
rpc_svc_mutex, \
svc_c_sev_fatal | svc_c_action_abort, \
rpc_m_call_failed_no_status, \
"RPC_COND_BROADCAST/rpc__cond_broadcast" ); \
} \
} else { \
dcethread_cond_broadcast_throw(&(cond).c); \
} \
}
#else
# define RPC_COND_BROADCAST(cond,mutex) \
{ \
RPC_LOG_COND_BROADCAST_NTR; \
dcethread_cond_broadcast_throw(&(cond).c); \
RPC_LOG_COND_BROADCAST_XIT; \
}
#endif
#if defined(RPC_MUTEX_DEBUG) || defined(RPC_MUTEX_STATS)
boolean rpc__mutex_init ( rpc_mutex_p_t );
boolean rpc__mutex_delete ( rpc_mutex_p_t );
boolean rpc__mutex_lock (
rpc_mutex_p_t ,
char * ,
int
);
boolean rpc__mutex_try_lock (
rpc_mutex_p_t ,
boolean * ,
char * ,
int
);
boolean rpc__mutex_unlock ( rpc_mutex_p_t );
boolean rpc__mutex_lock_assert ( rpc_mutex_p_t );
boolean rpc__mutex_unlock_assert ( rpc_mutex_p_t );
boolean rpc__cond_init (
rpc_cond_p_t ,
rpc_mutex_p_t
);
boolean rpc__cond_delete (
rpc_cond_p_t ,
rpc_mutex_p_t
);
boolean rpc__cond_wait (
rpc_cond_p_t ,
rpc_mutex_p_t ,
char * ,
int
);
boolean rpc__cond_timed_wait (
rpc_cond_p_t ,
rpc_mutex_p_t ,
struct timespec * ,
char * ,
int
);
boolean rpc__cond_signal (
rpc_cond_p_t ,
rpc_mutex_p_t
);
boolean rpc__cond_broadcast (
rpc_cond_p_t ,
rpc_mutex_p_t
);
#else
#ifdef MIREK_NOT_DEFINED
static void rpc__mutex_none (void);
#endif
#endif
#endif