typedef struct debug_mutex_t
{
pthread_mutex_t mutex;
char file[20];
int line;
} debug_mutex_t;
#define gs_mutex_t debug_mutex_t
#define gs_mutex_init debug_mutex_init
#define gs_mutex_destroy debug_mutex_destroy
#define gs_mutex_lock(lock) debug_mutex_lock_try(lock, __FILE__, __LINE__)
#define gs_mutex_unlock debug_mutex_unlock
#define gs_cond_wait debug_cond_wait
#ifdef __cplusplus
extern "C"{
#endif
extern void debug_mutex_init(gs_mutex_t *mutex, void *data);
extern void debug_mutex_destroy(gs_mutex_t *mutex);
extern int debug_mutex_lock_try(gs_mutex_t *mutex, char *file, int line);
extern void debug_mutex_unlock(gs_mutex_t *mutex);
extern int debug_cond_wait(pthread_cond_t *cond, gs_mutex_t *mutex_ptr);
#ifdef __cplusplus
};
#endif
void debug_mutex_init(gs_mutex_t *mutex, void *data)
{
pthread_mutex_init(&mutex->mutex, data);
mutex->file[0]='\0';
mutex->line = 0;
}
void debug_mutex_destroy(gs_mutex_t *mutex)
{
pthread_mutex_destroy(&mutex->mutex);
mutex->file[0]='\0';
mutex->line = 0;
}
int debug_mutex_lock_try(gs_mutex_t *mutex, char *file, int line)
{
int ret;
int counter = 0;
int snap;
char filename[20];
do {
ret = pthread_mutex_trylock(&mutex->mutex);
if (ret == 0)
break;
usleep(1000);
} while (++counter < 1000);
snap = strlen(file)>19 ? strlen(file)-19 : 0;
strncpy(filename, file+snap, sizeof(filename));
filename[sizeof(filename)-1] = '\0';
if (ret != 0)
{
LOGI("get mutex(%s:%d) failed, last occurence %s:%d", filename, line, mutex->file, mutex->line);
}
else
{
//LOGI("push mutex %s:%d", filename, line);
strcpy(mutex->file, filename);
mutex->line = line;
}
return ret;
}
void debug_mutex_unlock(gs_mutex_t *mutex)
{
pthread_mutex_unlock(&mutex->mutex);
mutex->file[0]='\0';
mutex->line = 0;
}
int debug_cond_wait(pthread_cond_t *cond, gs_mutex_t *mutex)
{
return pthread_cond_wait(cond, &mutex->mutex);
}