Kamailio提供了一套有着简单接口的用户锁系统,以便我们在开发时使用。它的根元素是一个可以被锁定或者解锁的互斥信号量。SysV和POSIX提供的其他同步机制都不需要。
锁可以被当做简单变量或者是锁集合(数组)使用。为了提高速度,默认情况下,由机器特定的代码实现锁。 如果机器的架构不明,Kamailio将使用SysV信号量。
1. Simple Locks API
头文件:locking.h
锁类型声明:gen_lock_t
创建锁:gen_lock_t* lock_allock();
释放锁:void lock_dealloc(gen_lock_t *lock);
初始化锁:gen_lock_t* lock_init(gen_lock_t *lock);
销毁锁:void lock_destroy(gen_lock_t *lock);
加锁:void lock_get(gen_lock_t *lock); 或者 int lock_try(gen_lock_t *lock);
解锁:void lock_release(gen_lock_t *lock);
2. Lock Set API
The lock set is an array of gen_lock_t.
头文件:locking.h
锁类型声明:gen_lock_set_t
创建锁:gen_lock_set_t* lock_set_alloc();
释放锁:void lock_set_dealloc(gen_lock_set_t *set);
初始化锁:gen_lock_set_t* lock_set_init(gen_lock_set_t *set);
销毁锁:void lock_set_destroy(gen_lock_set_t *set);
加锁:void lock_set_get(gen_lock_set_t *set, int index); 或者 int lock_set_try(gen_lock_set_t *set, int index);
解锁:void lock_set_release(gen_lock_set_t *set, int index);
总结:以上两种类型的所变量,都必须在共享内存中申请空间,以便在kamailio中跨进程访问。
故障排除方法:可以用top或者ps命令获取进程PID,然后由gdb命令在命令行调试进程,使用bt命令查看进程调用堆栈,确认哪里没有解锁。