// // Created by Gyuhwan Park on 2022/05/24. // #ifndef ULALACA_IPCCONNECTION_HPP #define ULALACA_IPCCONNECTION_HPP #include #include #include #include #include "UnixSocket.hpp" #include "messages/projector.h" #include "ulalaca.hpp" class IPCConnection { public: using MallocFreeDeleter = std::function; explicit IPCConnection(std::string socketPath); IPCConnection(IPCConnection &) = delete; FD descriptor(); /** * @throws SystemCallException */ void connect(); void disconnect(); bool isGood() const; std::unique_ptr nextHeader(); template void writeMessage(uint16_t messageType, T message) { auto header = ULIPCHeader { (uint16_t) messageType, _messageId, 0, // FIXME 0, // FIXME sizeof(T) }; write(&header, sizeof(header)); write(&message, sizeof(T)); } template std::unique_ptr read(size_t size) { assert(size != 0); auto promise = std::make_shared>>(); { std::scoped_lock scopedReadTasksLock(_readTasksLock); _readTasks.emplace(size, promise); } auto source = promise->get_future().get(); auto destination = std::unique_ptr( (T *) malloc(size), free ); std::memmove(destination.get(), source.get(), size); return std::move(destination); } void write(const void *pointer, size_t size); private: void workerLoop(); std::atomic_uint64_t _messageId; std::atomic_uint64_t _ackId; UnixSocket _socket; std::thread _workerThread; bool _isWorkerTerminated; bool _isGood; std::mutex _writeTasksLock; std::mutex _readTasksLock; std::queue>> _writeTasks; std::queue>> >> _readTasks; }; #endif //XRDP_IPCCONNECTION_HPP