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; }