예제 #1
0
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);
}
예제 #2
0
/**
 * \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);
}