今天学习skynet_monitor。
skynet_monitor主要用于监测skynet_context在处理消息时是否陷入死循环。
struct skynet_monitor;
struct skynet_monitor * skynet_monitor_new();//新建一个监视器
void skynet_monitor_delete(struct skynet_monitor *);//删除一个监视器
void skynet_monitor_trigger(struct skynet_monitor *, uint32_t source, uint32_t destination);//通知监视器开始
void skynet_monitor_check(struct skynet_monitor *);//检查监视器是否陷入死循环
skynet启动时会为每个工作线程创建一个对应的监视器:
static void
start(int thread) {
pthread_t pid[thread+3];
struct monitor *m = skynet_malloc(sizeof(*m));
memset(m, 0, sizeof(*m));
m->count = thread;
m->sleep = 0;
m->m = skynet_malloc(thread * sizeof(struct skynet_monitor *));
int i;
for (i=0;i<thread;i++) {
m->m[i] = skynet_monitor_new();//创建监视器
}
......
然后,sc在处理消息时,会调用skynet_monitor_trigger