static struct MutexNode *getMutexNode(pthread_mutex_t *mutex, int create);
static void lockMutex(struct MutexNode *node, const char *file, unsigned int line);
static void unlockMutex(struct MutexNode *node, const char *file, unsigned int line);
+static void mutex_replay(struct MutexNode *node);
void xmutex(int lock, pthread_mutex_t *mutex, const char *file, unsigned int line) {
pthread_mutex_lock(&synchronized);
void mutex_debug(pthread_mutex_t *mutex) {
//replay mutex events to stdout
- struct MutexNode *node = getMutexNode(mutex, 0);
- if(!node) {
- printf("[MUTEX_DEBUG] unknown mutex!\n");
- return;
+ struct MutexNode *node;
+ if(mutex) {
+ node = getMutexNode(mutex, 0);
+ if(!node) {
+ printf("[MUTEX_DEBUG] unknown mutex!\n");
+ return;
+ }
+ mutex_replay(node);
+ } else {
+ for(node = mutex_nodes; node; node = node->next) {
+ mutex_replay(node);
+ }
}
+ printf("[MUTEX_DEBUG] end of mutex replay.\n");
+}
+
+static void mutex_replay(struct MutexNode *node) {
printf("[MUTEX_DEBUG] mutex replay:\n");
struct MutexLock *lock;
struct MutexLockEvent *event;
printf("[MUTEX_DEBUG] %s in %s:%d\n", (event->locked ? "lock " : "unlock"), event->file, event->line);
}
}
- printf("[MUTEX_DEBUG] end of mutex replay.\n");
}
#endif