| 37 | } |
| 38 | |
| 39 | int64_t MessageEndpoint::Read(uint64_t* id, uint16_t* size, uint64_t* data){ |
| 40 | assert(id); |
| 41 | assert(size); |
| 42 | assert(data); |
| 43 | |
| 44 | Message m; |
| 45 | |
| 46 | acquireLock(&queueLock); |
| 47 | int r = queue.Dequeue(&m, 1); |
| 48 | releaseLock(&queueLock); |
| 49 | if(r < 1){ |
| 50 | if(!peer.get()){ |
| 51 | return -ENOTCONN; |
| 52 | } |
| 53 | return 0; |
| 54 | } |
| 55 | |
| 56 | queueAvailablilitySemaphore.Signal(); |
| 57 | |
| 58 | *id = m.id; |
| 59 | *size = m.size; |
| 60 | |
| 61 | if(m.size <= 8){ |
| 62 | *data = m.data; |
| 63 | } else { |
| 64 | memcpy(data, m.dataP, m.size); |
| 65 | } |
| 66 | |
| 67 | if(debugLevelMessageEndpoint >= DebugLevelVerbose){ |
| 68 | Log::Info("[MessageEndpoint] Receiving message (ID: %u, Size: %u)", m.id, m.size); |
| 69 | } |
| 70 | |
| 71 | if(m.size > 8 && m.dataP){ |
| 72 | delete[] m.dataP; |
| 73 | } |
| 74 | |
| 75 | return 1; |
| 76 | } |
| 77 | |
| 78 | int64_t MessageEndpoint::Call(uint64_t id, uint16_t size, uint64_t data, uint64_t rID, uint16_t* rSize, uint64_t* rData, int64_t timeout){ |
| 79 | if(!peer.get()){ |