static void Thread_pop_message (LIScrArgs* args) { LIMaiMessage* message; LIExtThread* self; LIEngModel* model; /* Pop the name. */ self = args->self; message = limai_program_pop_message (self->program, LIMAI_MESSAGE_QUEUE_PROGRAM); if (message == NULL) return; /* Return the message. */ liscr_args_set_output (args, LISCR_ARGS_OUTPUT_TABLE); liscr_args_sets_string (args, "name", message->name); switch (message->type) { case LIMAI_MESSAGE_TYPE_EMPTY: liscr_args_sets_string (args, "type", "empty"); break; case LIMAI_MESSAGE_TYPE_MODEL: liscr_args_sets_string (args, "type", "model"); model = lieng_model_new_model (self->program->parent->engine, message->model); if (model != NULL) { message->model = NULL; model->script = liscr_data_new (args->script, args->lua, model, LISCR_SCRIPT_MODEL, lieng_model_free); if (model->script != NULL) liscr_args_sets_stack (args, "model"); else lieng_model_free (model); } break; case LIMAI_MESSAGE_TYPE_STRING: liscr_args_sets_string (args, "type", "string"); liscr_args_sets_string (args, "string", message->string); break; } /* Free the message. */ limai_message_free (message); }
/** * \brief Frees the program. * * \param self Program. */ void limai_program_free ( LIMaiProgram* self) { int i; LIMaiExtension* extension; LIMaiExtension* extension_next; LIMaiEvent* event; LIMaiEvent* event_next; LIMaiMessage* message; LIMaiMessage* message_next; /* Invoke callbacks. */ if (self->callbacks != NULL) lical_callbacks_call (self->callbacks, "program-shutdown", lical_marshal_DATA); /* Free script. */ if (self->script != NULL) liscr_script_free (self->script); /* Free extensions. */ if (self->extensions != NULL) { for (extension = self->extensions ; extension != NULL ; extension = extension_next) { extension_next = extension->next; ((void (*)(void*)) extension->info->free) (extension->object); if (extension->module != NULL) lisys_module_free (extension->module); lisys_free (extension); } } /* Free components. */ if (self->components != NULL) { lisys_assert (self->components->size == 0); lialg_strdic_free (self->components); } /* Free the model manager. */ if (self->models != NULL) limdl_manager_free (self->models); /* Invoke callbacks. */ if (self->callbacks != NULL) lical_callbacks_call (self->callbacks, "program-free", lical_marshal_DATA); /* Free callbacks. */ if (self->callbacks != NULL) { lical_handle_releasev (self->calls, sizeof (self->calls) / sizeof (LICalHandle)); lical_callbacks_free (self->callbacks); } if (self->paths != NULL) lipth_paths_free (self->paths); /* Free messaging. */ if (self->message_mutex != NULL) lisys_mutex_free (self->message_mutex); for (i = 0 ; i < LIMAI_MESSAGE_QUEUE_MAX ; i++) { for (message = self->messages[i] ; message != NULL ; message = message_next) { message_next = message->next; limai_message_free (message); } } /* Free events. */ for (event = self->events_first ; event != NULL ; event = event_next) { event_next = event->next; limai_event_free (event); } lisys_free (self->launch_args); lisys_free (self->launch_name); lisys_free (self->args); lisys_free (self); }