| 446 | } |
| 447 | |
| 448 | Result Post(const URL* sender, const URL* receiver, dmhash_t message_id, uintptr_t user_data1, uintptr_t user_data2, |
| 449 | uintptr_t descriptor, const void* message_data, uint32_t message_data_size, MessageDestroyCallback destroy_callback) |
| 450 | { |
| 451 | DM_PROFILE("Post"); |
| 452 | //Currently called out by the Thread Sanitizer: DM_PROPERTY_ADD_U32(rmtp_Messages, 1); |
| 453 | |
| 454 | if (receiver == 0x0) |
| 455 | { |
| 456 | return RESULT_SOCKET_NOT_FOUND; |
| 457 | } |
| 458 | |
| 459 | MessageSocket* s = AcquireSocket(receiver->m_Socket); |
| 460 | if (s == 0x0) |
| 461 | { |
| 462 | return RESULT_SOCKET_NOT_FOUND; |
| 463 | } |
| 464 | |
| 465 | dmMutex::Lock(s->m_Mutex); |
| 466 | |
| 467 | MemoryAllocator* allocator = &s->m_Allocator; |
| 468 | uint32_t data_size = sizeof(Message) + message_data_size; |
| 469 | Message *new_message = (Message *) AllocateMessage(allocator, data_size); |
| 470 | if (sender != 0x0) |
| 471 | { |
| 472 | new_message->m_Sender = *sender; |
| 473 | } |
| 474 | else |
| 475 | { |
| 476 | ResetURL(&new_message->m_Sender); |
| 477 | } |
| 478 | new_message->m_Receiver = *receiver; |
| 479 | new_message->m_Id = message_id; |
| 480 | new_message->m_UserData1 = user_data1; |
| 481 | new_message->m_UserData2 = user_data2; |
| 482 | new_message->m_Descriptor = descriptor; |
| 483 | new_message->m_DataSize = message_data_size; |
| 484 | new_message->m_Next = 0; |
| 485 | new_message->m_DestroyCallback = destroy_callback; |
| 486 | memcpy(&new_message->m_Data[0], message_data, message_data_size); |
| 487 | |
| 488 | bool is_first_message = !s->m_Header; |
| 489 | |
| 490 | if (!s->m_Header) |
| 491 | { |
| 492 | s->m_Header = new_message; |
| 493 | s->m_Tail = new_message; |
| 494 | } |
| 495 | else |
| 496 | { |
| 497 | s->m_Tail->m_Next = new_message; |
| 498 | s->m_Tail = new_message; |
| 499 | } |
| 500 | |
| 501 | if (is_first_message) |
| 502 | { |
| 503 | dmConditionVariable::Signal(s->m_Condition); |
| 504 | } |
| 505 | dmMutex::Unlock(s->m_Mutex); |