#include #include #include #include tc_world_updater_queue_s tc_new_world_updater_queue(u32_t capacity) { tc_world_updater_queue_s queue; queue.capacity = capacity; queue.commands = calloc(sizeof(tc_world_updater_command_s), capacity); queue.first = NULL; queue.last = NULL; queue.in_action = FALSE; return queue; } // tc_allocate_world_updater_command: Returns a pointer to a command-slot in the given queue. // Sub-function of tc_issue_world_updater_command tc_world_updater_command_s * tc_allocate_world_updater_command(tc_world_updater_queue_s *queue) { u32_t command_index = 0; while(command_index < queue->capacity) { if(!queue->commands[command_index].is_used) return &queue->commands[command_index]; ++command_index; } return NULL; } bool_t tc_issue_world_updater_command(tc_world_updater_queue_s *queue, tc_world_updater_command_s command) { while(queue->in_action) continue; queue->in_action = TRUE; tc_world_updater_command_s *queue_command = tc_allocate_world_updater_command(queue); if(queue_command == NULL) return FALSE; command.is_used = TRUE; (*queue_command) = command; queue_command->previous = queue->last; queue_command->next = NULL; if(queue->last != NULL) queue->last->next = queue_command; if(queue->first == NULL) queue->first = queue_command; queue->last = queue_command; queue->in_action = FALSE; return TRUE; } tc_world_updater_command_s tc_world_updater_query_next_command(tc_world_updater_queue_s *queue) { while(queue->in_action) continue; queue->in_action = TRUE; tc_world_updater_command_s *queue_command = queue->first; tc_world_updater_command_s command; memset(&command, 0x00, sizeof(tc_world_updater_command_s)); if(queue_command != NULL) { command = *queue_command; queue_command->is_used = FALSE; } queue->in_action = FALSE; return command; }