status_t MessagingService::SendMessage(const void *message, int32 messageSize, const messaging_target *targets, int32 targetCount) { PRINT(("MessagingService::SendMessage(%p, %ld, %p, %ld)\n", message, messageSize, targets, targetCount)); if (!message || messageSize <= 0 || !targets || targetCount <= 0) return B_BAD_VALUE; int32 dataSize = sizeof(messaging_command_send_message) + targetCount * sizeof(messaging_target) + messageSize; // allocate space for the command MessagingArea *area; void *data; bool wasEmpty; status_t error = _AllocateCommand(MESSAGING_COMMAND_SEND_MESSAGE, dataSize, area, data, wasEmpty); if (error != B_OK) { PRINT(("MessagingService::SendMessage(): Failed to allocate space for " "send message command.\n")); return error; } PRINT((" Allocated space for send message command: area: %p, data: %p, " "wasEmpty: %d\n", area, data, wasEmpty)); // prepare the command messaging_command_send_message *command = (messaging_command_send_message*)data; command->message_size = messageSize; command->target_count = targetCount; memcpy(command->targets, targets, sizeof(messaging_target) * targetCount); memcpy((char*)command + (dataSize - messageSize), message, messageSize); // shoot area->Unlock(); if (wasEmpty) area->CommitCommand(); return B_OK; }