45 lines
1.2 KiB
C
45 lines
1.2 KiB
C
#pragma once
|
|
#include "../object/queue.h"
|
|
#include "../types.h"
|
|
|
|
struct Message {
|
|
const size_t pid; ///< Sender Thread ID of message
|
|
|
|
const uintptr_t sbuffer; ///< Send buffer
|
|
const size_t ssize; ///< Send buffer size
|
|
|
|
const uintptr_t rbuffer; ///< Receive buffer
|
|
const size_t rsize; ///< Receive buffer size
|
|
|
|
Message *queue_link = nullptr; ///< Next message in the message queue
|
|
|
|
/*! \brief Constructor
|
|
* \param pid Sender Thread ID of message
|
|
* \param sbuffer Send buffer
|
|
* \param ssize Send buffer size
|
|
* \param rbuffer Receive buffer
|
|
* \param rsize Receive buffer size
|
|
*/
|
|
explicit Message(int pid, uintptr_t sbuffer = 0, size_t ssize = 0,
|
|
uintptr_t rbuffer = 0, size_t rsize = 0)
|
|
: pid(pid),
|
|
sbuffer(sbuffer),
|
|
ssize(ssize),
|
|
rbuffer(rbuffer),
|
|
rsize(rsize) {}
|
|
|
|
/*! \brief Helper to retrieve (and remove) a message from the queue
|
|
* \param pid Thread id of message
|
|
* \param queue Queue with message
|
|
* \return Pointer to message or nullptr
|
|
*/
|
|
static Message *dequeueByPID(size_t pid, Queue<Message> &queue) {
|
|
for (Message *m : queue) {
|
|
if (m->pid == pid) {
|
|
return queue.remove(m);
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
};
|