Exemple #1
0
void S_create_push_threads(pTHX, HV* options, SV* startup) {
	struct thread_create thread_options;
	int clone_number;
	int counter;

	Zero(&thread_options, 1, struct thread_create);
	clone_number = prepare_thread_create(aTHX, &thread_options, options, startup);

	for (counter = 0; counter < clone_number; ++counter) {
		mthread* thread;
		const message* to_run;
		const message* modules;

		thread = mthread_alloc(aTHX);

		if (thread_options.monitor)
			thread_add_listener(aTHX, thread->id, thread_options.parent_id);

		modules = message_clone(thread_options.modules);
		queue_enqueue(thread->queue, modules, NULL);

		push_thread(aTHX, thread);

		to_run = message_clone(thread_options.to_run);
		queue_enqueue(thread->queue, to_run, NULL);
		start_thread(thread, thread_options.stack_size);
	}

	destroy_message(thread_options.to_run);
	if (thread_options.modules)
		destroy_message(thread_options.modules);
}
int messagesender_send(MESSAGE_SENDER_HANDLE message_sender, MESSAGE_HANDLE message, ON_MESSAGE_SEND_COMPLETE on_message_send_complete, void* callback_context)
{
	int result;

	if ((message_sender == NULL) ||
		(message == NULL))
	{
		result = __LINE__;
	}
	else
	{
		MESSAGE_SENDER_INSTANCE* message_sender_instance = (MESSAGE_SENDER_INSTANCE*)message_sender;
		if (message_sender_instance->message_sender_state == MESSAGE_SENDER_STATE_ERROR)
		{
			result = __LINE__;
		}
		else
		{
			MESSAGE_WITH_CALLBACK* message_with_callback = (MESSAGE_WITH_CALLBACK*)amqpalloc_malloc(sizeof(MESSAGE_WITH_CALLBACK));
			if (message_with_callback == NULL)
			{
				result = __LINE__;
			}
			else
			{
				MESSAGE_WITH_CALLBACK** new_messages = (MESSAGE_WITH_CALLBACK**)amqpalloc_realloc(message_sender_instance->messages, sizeof(MESSAGE_WITH_CALLBACK*) * (message_sender_instance->message_count + 1));
				if (new_messages == NULL)
				{
					amqpalloc_free(message_with_callback);
					result = __LINE__;
				}
				else
				{
					result = 0;

					message_sender_instance->messages = new_messages;
					if (message_sender_instance->message_sender_state != MESSAGE_SENDER_STATE_OPEN)
					{
						message_with_callback->message = message_clone(message);
						if (message_with_callback->message == NULL)
						{
							amqpalloc_free(message_with_callback);
							result = __LINE__;
						}

						message_with_callback->message_send_state = MESSAGE_SEND_STATE_NOT_SENT;
					}
					else
					{
						message_with_callback->message = NULL;
						message_with_callback->message_send_state = MESSAGE_SEND_STATE_PENDING;
					}

					if (result == 0)
					{
						message_with_callback->on_message_send_complete = on_message_send_complete;
						message_with_callback->context = callback_context;
						message_with_callback->message_sender = message_sender_instance;

						message_sender_instance->messages[message_sender_instance->message_count] = message_with_callback;
						message_sender_instance->message_count++;

						if (message_sender_instance->message_sender_state == MESSAGE_SENDER_STATE_OPEN)
						{
							switch (send_one_message(message_sender_instance, message_with_callback, message))
							{
							default:
							case SEND_ONE_MESSAGE_ERROR:
								remove_pending_message_by_index(message_sender_instance, message_sender_instance->message_count - 1);
								result = __LINE__;
								break;

							case SEND_ONE_MESSAGE_BUSY:
								message_with_callback->message = message_clone(message);
								if (message_with_callback->message == NULL)
								{
									amqpalloc_free(message_with_callback);
									result = __LINE__;
								}
								else
								{
									message_with_callback->message_send_state = MESSAGE_SEND_STATE_NOT_SENT;
									result = 0;
								}

								break;

							case SEND_ONE_MESSAGE_OK:
								result = 0;
								break;
							}
						}
					}
				}
			}
		}
	}

	return result;
}
int amqpmanagement_start_operation(AMQP_MANAGEMENT_HANDLE amqp_management, const char* operation, const char* type, const char* locales, MESSAGE_HANDLE message, ON_OPERATION_COMPLETE on_operation_complete, void* context)
{
	int result;

	if ((amqp_management == NULL) ||
		(operation == NULL))
	{
		result = __LINE__;
	}
	else
	{
		AMQP_VALUE application_properties;
		if (message_get_application_properties(message, &application_properties) != 0)
		{
			result = __LINE__;
		}
		else
		{
			if ((add_string_key_value_pair_to_map(application_properties, "operation", operation) != 0) ||
				(add_string_key_value_pair_to_map(application_properties, "type", type) != 0) ||
				((locales != NULL) && (add_string_key_value_pair_to_map(application_properties, "locales", locales) != 0)))
			{
				result = __LINE__;
			}
			else
			{
				if ((message_set_application_properties(message, application_properties) != 0) ||
					(set_message_id(message, amqp_management->next_message_id) != 0))
				{
					result = __LINE__;
				}
				else
				{
					OPERATION_MESSAGE_INSTANCE* pending_operation_message = amqpalloc_malloc(sizeof(OPERATION_MESSAGE_INSTANCE));
					if (pending_operation_message == NULL)
					{
						result = __LINE__;
					}
					else
					{
						pending_operation_message->message = message_clone(message);
						pending_operation_message->callback_context = context;
						pending_operation_message->on_operation_complete = on_operation_complete;
						pending_operation_message->operation_state = OPERATION_STATE_NOT_SENT;
						pending_operation_message->message_id = amqp_management->next_message_id;

						amqp_management->next_message_id++;

						OPERATION_MESSAGE_INSTANCE** new_operation_messages = amqpalloc_realloc(amqp_management->operation_messages, (amqp_management->operation_message_count + 1) * sizeof(OPERATION_MESSAGE_INSTANCE*));
						if (new_operation_messages == NULL)
						{
							message_destroy(message);
							amqpalloc_free(pending_operation_message);
							result = __LINE__;
						}
						else
						{
							amqp_management->operation_messages = new_operation_messages;
							amqp_management->operation_messages[amqp_management->operation_message_count] = pending_operation_message;
							amqp_management->operation_message_count++;

							if (send_operation_messages(amqp_management) != 0)
							{
								if (on_operation_complete != NULL)
								{
									on_operation_complete(context, OPERATION_RESULT_CBS_ERROR, 0, NULL);
								}

								result = __LINE__;
							}
							else
							{
								result = 0;
							}
						}
					}
				}
			}

			amqpvalue_destroy(application_properties);
		}
	}

	return result;
}