/** \file channel.h \author michael.zohner@ec-spride.de \copyright ABY - A Framework for Efficient Mixed-protocol Secure Two-party Computation Copyright (C) 2019 Engineering Cryptographic Protocols Group, TU Darmstadt This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ABY is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef CHANNEL_H_ #define CHANNEL_H_ #include #include #include #include class RcvThread; class SndThread; struct rcv_ctx; class CEvent; class CLock; class channel { public: channel(uint8_t channelid, RcvThread* rcver, SndThread* snder); ~channel(); void send(uint8_t* buf, uint64_t nbytes); void blocking_send(CEvent* eventcaller, uint8_t* buf, uint64_t nbytes); void send_id_len(uint8_t* buf, uint64_t nbytes, uint64_t id, uint64_t len); void blocking_send_id_len(CEvent* eventcaller, uint8_t* buf, uint64_t nbytes, uint64_t id, uint64_t len); //buf needs to be freed, data contains the payload uint8_t* blocking_receive_id_len(uint8_t** data, uint64_t* id, uint64_t* len); bool queue_empty() const; uint8_t* blocking_receive(); void blocking_receive(uint8_t* rcvbuf, uint64_t rcvsize); bool is_alive(); bool data_available(); void signal_end(); void wait_for_fin(); void synchronize_end(); private: uint8_t m_bChannelID; RcvThread* m_cRcver; SndThread* m_cSnder; std::unique_ptr m_eRcved; std::unique_ptr m_eFin; bool m_bSndAlive; bool m_bRcvAlive; std::queue* m_qRcvedBlocks; std::mutex& m_qRcvedBlocks_mutex_; }; #endif /* CHANNEL_H_ */