void console_process_exits() { bedrock_node *node; LIST_FOREACH(&exiting_client_list, node) console_free(node->data); bedrock_list_clear(&exiting_client_list); }
static void core_release() { texture_free(core_global->textures.none); monofont_free(&core_global->font_console); console_free(&core_global->console); /* Release game specific resources. */ if(core_global->release_callback != NULL) { core_global->release_callback(); } lodge_window_shutdown(); }
void *console_to_rtm(void *local) { struct fins_module *module = (struct fins_module *) local; PRINT_DEBUG("Entered: module=%p", module); PRINT_IMPORTANT("Thread started: module=%p, index=%u, id=%u, name='%s'", module, module->index, module->id, module->name); struct rtm_data *md = (struct rtm_data *) module->data; int poll_num; struct pollfd poll_fds[MAX_CONSOLES]; int time = 1; int ret; struct rtm_console *console; int i; for (i = 0; i < MAX_CONSOLES; i++) { poll_fds[i].events = POLLIN | POLLPRI | POLLRDNORM; //poll_fds[1].events = POLLIN | POLLPRI | POLLOUT | POLLERR | POLLHUP | POLLNVAL | POLLRDNORM | POLLRDBAND | POLLWRNORM | POLLWRBAND; } PRINT_DEBUG("events=0x%x", poll_fds[0].events); uint32_t cmd_len; uint8_t cmd_buf[MAX_CMD_LEN + 1]; secure_sem_wait(&md->shared_sem); while (module->state == FMS_RUNNING) { poll_num = md->console_list->len; if (poll_num > 0) { for (i = 0; i < MAX_CONSOLES; i++) { if (md->console_fds[i] == 0) { poll_fds[i].fd = -1; } else { poll_fds[i].fd = md->console_fds[i]; } } sem_post(&md->shared_sem); ret = poll(poll_fds, poll_num, time); secure_sem_wait(&md->shared_sem); if (ret < 0) { PRINT_ERROR("ret=%d, errno=%u, str='%s'", ret, errno, strerror(errno)); break; } else if (ret > 0) { PRINT_DEBUG("poll: ret=%d", ret); for (i = 0; i < MAX_CONSOLES; i++) { if (poll_fds[i].fd > 0 && poll_fds[i].revents > 0) { if (1) { PRINT_DEBUG( "POLLIN=%d POLLPRI=%d POLLOUT=%d POLLERR=%d POLLHUP=%d POLLNVAL=%d POLLRDNORM=%d POLLRDBAND=%d POLLWRNORM=%d POLLWRBAND=%d", (poll_fds[i].revents & POLLIN) > 0, (poll_fds[i].revents & POLLPRI) > 0, (poll_fds[i].revents & POLLOUT) > 0, (poll_fds[i].revents & POLLERR) > 0, (poll_fds[i].revents & POLLHUP) > 0, (poll_fds[i].revents & POLLNVAL) > 0, (poll_fds[i].revents & POLLRDNORM) > 0, (poll_fds[i].revents & POLLRDBAND) > 0, (poll_fds[i].revents & POLLWRNORM) > 0, (poll_fds[i].revents & POLLWRBAND) > 0); } console = (struct rtm_console *) list_find1(md->console_list, rtm_console_fd_test, &poll_fds[i].fd); if (console != NULL) { if (poll_fds[i].revents & (POLLERR | POLLNVAL)) { //TODO ?? PRINT_ERROR("todo: kinda error case that needs to be handled"); list_remove(md->console_list, console); console_free(console); md->console_fds[i] = 0; } else if (poll_fds[i].revents & (POLLHUP)) { PRINT_IMPORTANT("Console closed: console=%p, id=%u", console, console->id); list_remove(md->console_list, console); console_free(console); md->console_fds[i] = 0; } else if (poll_fds[i].revents & (POLLIN | POLLRDNORM | POLLPRI | POLLRDBAND)) { cmd_len = (uint32_t) rtm_recv_fd(console->fd, MAX_CMD_LEN, cmd_buf); if (cmd_len != (uint32_t) -1) { cmd_buf[cmd_len] = '\0'; rtm_process_cmd(module, console, cmd_len, cmd_buf); } else { PRINT_WARN("todo error"); } } } else { PRINT_WARN("todo error"); //console removed after poll started, before it returned, remove? } } } } } else { sem_post(&md->shared_sem); sleep(time); secure_sem_wait(&md->shared_sem); } } sem_post(&md->shared_sem); PRINT_IMPORTANT("Thread exited: module=%p, index=%u, id=%u, name='%s'", module, module->index, module->id, module->name); PRINT_DEBUG("Exited: module=%p", module); return NULL; }