Chapter 3. Locking system

       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);

扫描二维码关注公众号,回复: 2494153 查看本文章

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命令查看进程调用堆栈,确认哪里没有解锁。

猜你喜欢

转载自blog.csdn.net/daitu3201/article/details/80547164
今日推荐