mutex死锁追踪


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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值