代码
do {
state = sd_event_get_state(flutterpi.event_loop);
switch (state) {
case SD_EVENT_INITIAL:
ok = sd_event_prepare(flutterpi.event_loop);
if (ok < 0) {
LOG_ERROR("Could not prepare event loop. sd_event_prepare: %s\n", strerror(-ok));
return -ok;
}
break;
case SD_EVENT_ARMED:
pthread_mutex_unlock(&flutterpi.event_loop_mutex);
do {
rfds = const_fds;
wfds = const_fds;
xfds = const_fds;
ok = select(evloop_fd + 1, &rfds, &wfds, &xfds, NULL);
if ((ok < 0) && (errno != EINTR)) {
perror("[flutter-pi] Could not wait for event loop events. select");
return errno;
}
} while ((ok < 0) && (errno == EINTR));
pthread_mutex_lock(&flutterpi.event_loop_mutex);
ok = sd_event_wait(flutterpi.event_loop, 0);
if (ok < 0) {
LOG_ERROR("Could not check for event loop events. sd_event_wait: %s\n", strerror(-ok));
return -ok;
}
break;
case SD_EVENT_PENDING:
ok = sd_event_dispatch(flutterpi.event_loop);
if (ok < 0) {
LOG_ERROR("Could not dispatch event loop events. sd_event_dispatch: %s\n", strerror(-ok));
return -ok;
}
break;
case SD_EVENT_FINISHED:
break;
default:
LOG_ERROR("Unhandled event loop state: %d. Aborting\n", state);
abort();
}
} while (state != SD_EVENT_FINISHED);
状态说明:
8.1.1 SD_EVENT_INITIAL: 开始迭代处理事件之前的状态,
此状态需要调用sd_event_prepare()让event_loop转换为SD_EVENT_ARMED
或者SD_EVENT_PENDING状态
8.1.2 SD_EVENT_PREPARING: 正在准备事件源,即当前正在执行准备处理程序,
这个状态尽在sd_event_prepare()被调用之后可见,
此状态之后紧跟着的是SD_EVENT_ARMED 或者 SD_EVENT_PENDING。
8.1.3 SD_EVENT_ARMED: sd_event_prepare()已经被调用,并且没有事件被分发时处于该状态。
调用sd_event_wait等待事件,之后转换为SD_EVENT_PENDING, 或者返回SD_EVENT_INITIAL状态
8.1.4 SD_EVENT_PENDING: 调用sd_event_prepare()或者sd_event_wait()之后,
且有事件待办处于该状态。调用sd_event_dispatch()去分发(处理)高优先级的事件,
并且转换为SD_EVENT_FINISH状态或者回退到SD_EVENT_INITIAL状态。
8.1.5 SD_EVENT_RUNNING: 事件源正在被分发中(处理中),
这个状态只会在sd_event_dispatch()被调用之后出现,
并且消息处理之后紧随的消息是SD_EVENT_INITIAL或者SD_EVENT_FINISHED。
如果在分发(处理)期间退出事件处理,则之后的状态是SD_EVENT_EXITING。
8.1.6 SD_EVENT_EXITING: 在事件调度退出之后生效的状态,
其之后跟随的状态是SD_EVENT_INITIAL活SD_EVENT_FINISHED。
8.1.7 SD_EVENT_FINISHED: 事件循环已推出,所有事件源都已经运行,
如果处于该状态,它就不在有任何用途了。