diff --git a/src/generic_io.h b/src/generic_io.h index eb4597b369ded6f2a7b204f319495fa792e3b7f8..857bd6e149184083b947a278431f4ac7fb721b71 100644 --- a/src/generic_io.h +++ b/src/generic_io.h @@ -24,6 +24,7 @@ #include <functional> #include <vector> +#include <chrono> #include <system_error> #include <cstdint> @@ -72,7 +73,7 @@ public: /// \note error code is not set in case of timeout, but set only in case of io error /// (i.e. socket deconnection). /// \todo make a std::chrono version for the timeout - virtual int waitForData(unsigned ms_timeout, std::error_code& ec) const = 0; + virtual int waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const = 0; /// Write a given amount of data. /// \param buf data to write. diff --git a/src/ice_socket.h b/src/ice_socket.h index 7faa3d64e52b6f7be80a26c0654eb6197842699c..0e8862d574b03deb34b1d428d2de22a69995dd54 100644 --- a/src/ice_socket.h +++ b/src/ice_socket.h @@ -47,7 +47,7 @@ class IceSocket void close(); ssize_t recv(unsigned char* buf, size_t len); ssize_t send(const unsigned char* buf, size_t len); - ssize_t waitForData(unsigned int timeout); + ssize_t waitForData(std::chrono::milliseconds timeout); void setOnRecv(IceRecvCb cb); uint16_t getTransportOverhead(); }; @@ -82,7 +82,7 @@ public: int maxPayload() const override; - int waitForData(unsigned ms_timeout, std::error_code& ec) const override; + int waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const override; std::size_t write(const ValueType* buf, std::size_t len, std::error_code& ec) override; diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp index 6522a5918dc41fa7ff8984a2887179c761e85043..0f65d61b74df7f98839be3f1a8fe019c5ed7d326 100644 --- a/src/ice_transport.cpp +++ b/src/ice_transport.cpp @@ -1322,10 +1322,10 @@ IceTransport::send(int comp_id, const unsigned char* buf, size_t len) } int -IceTransport::waitForInitialization(unsigned timeout) +IceTransport::waitForInitialization(std::chrono::milliseconds timeout) { std::unique_lock<std::mutex> lk(pimpl_->iceMutex_); - if (!pimpl_->iceCV_.wait_for(lk, std::chrono::seconds(timeout), + if (!pimpl_->iceCV_.wait_for(lk, timeout, [this]{ return pimpl_->_isInitialized() or pimpl_->_isFailed(); })) { JAMI_WARN("[ice:%p] waitForInitialization: timeout", this); return -1; @@ -1334,10 +1334,10 @@ IceTransport::waitForInitialization(unsigned timeout) } int -IceTransport::waitForNegotiation(unsigned timeout) +IceTransport::waitForNegotiation(std::chrono::milliseconds timeout) { std::unique_lock<std::mutex> lk(pimpl_->iceMutex_); - if (!pimpl_->iceCV_.wait_for(lk, std::chrono::seconds(timeout), + if (!pimpl_->iceCV_.wait_for(lk, timeout, [this]{ return pimpl_->_isRunning() or pimpl_->_isFailed(); })) { JAMI_WARN("[ice:%p] waitForIceNegotiation: timeout", this); return -1; @@ -1352,9 +1352,9 @@ IceTransport::isDataAvailable(int comp_id) } ssize_t -IceTransport::waitForData(int comp_id, unsigned int timeout, std::error_code& ec) +IceTransport::waitForData(int comp_id, std::chrono::milliseconds timeout, std::error_code& ec) { - return pimpl_->peerChannels_.at(comp_id).wait(std::chrono::milliseconds(timeout)); + return pimpl_->peerChannels_.at(comp_id).wait(timeout); } std::vector<SDP> @@ -1478,10 +1478,10 @@ IceSocketTransport::maxPayload() const } int -IceSocketTransport::waitForData(unsigned ms_timeout, std::error_code& ec) const +IceSocketTransport::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { if (!ice_->isRunning()) return -1; - return ice_->waitForData(compId_, ms_timeout, ec); + return ice_->waitForData(compId_, timeout, ec); } std::size_t @@ -1553,7 +1553,7 @@ IceSocket::send(const unsigned char* buf, size_t len) } ssize_t -IceSocket::waitForData(unsigned int timeout) +IceSocket::waitForData(std::chrono::milliseconds timeout) { if (!ice_transport_.get()) return -1; diff --git a/src/ice_transport.h b/src/ice_transport.h index 264285218e862f85e9f61e68c225f53e7579161b..432ed3d7edb3e5c567eaf83521e36df2a66eff13 100644 --- a/src/ice_transport.h +++ b/src/ice_transport.h @@ -188,11 +188,11 @@ public: ssize_t send(int comp_id, const unsigned char* buf, size_t len); - int waitForInitialization(unsigned timeout); + int waitForInitialization(std::chrono::milliseconds timeout); - int waitForNegotiation(unsigned timeout); + int waitForNegotiation(std::chrono::milliseconds timeout); - ssize_t waitForData(int comp_id, unsigned int timeout, std::error_code& ec); + ssize_t waitForData(int comp_id, std::chrono::milliseconds timeout, std::error_code& ec); /** * Return without waiting how many bytes are ready to read diff --git a/src/jamidht/p2p.cpp b/src/jamidht/p2p.cpp index 8d392d06208ba9f49dc04d2aa016cca81cfa1910..b75ca11b7921cb93b0a0fb3e977b491aa516ca96 100644 --- a/src/jamidht/p2p.cpp +++ b/src/jamidht/p2p.cpp @@ -45,11 +45,12 @@ namespace jami { -static constexpr auto DHT_MSG_TIMEOUT = std::chrono::seconds(30); -static constexpr auto NET_CONNECTION_TIMEOUT = std::chrono::seconds(10); -static constexpr auto SOCK_TIMEOUT = std::chrono::seconds(3); -static constexpr auto ICE_READY_TIMEOUT = std::chrono::seconds(10); -static constexpr int ICE_INIT_TIMEOUT{10}; +static constexpr std::chrono::seconds DHT_MSG_TIMEOUT{30}; +static constexpr std::chrono::seconds NET_CONNECTION_TIMEOUT{10}; +static constexpr std::chrono::seconds SOCK_TIMEOUT{3}; +static constexpr std::chrono::seconds ICE_READY_TIMEOUT{10}; +static constexpr std::chrono::seconds ICE_INIT_TIMEOUT{10}; +static constexpr std::chrono::seconds ICE_NOGOTIATION_TIMEOUT{10}; using Clock = std::chrono::system_clock; using ValueIdDist = std::uniform_int_distribution<dht::Value::Id>; @@ -432,7 +433,7 @@ private: break; } - parent_.ice_->waitForNegotiation(10); + parent_.ice_->waitForNegotiation(ICE_NOGOTIATION_TIMEOUT); if (parent_.ice_->isRunning()) { peer_ep = std::make_shared<IceSocketEndpoint>(parent_.ice_, true); JAMI_DBG("[Account:%s] ICE negotiation succeed. Starting file transfer", @@ -743,7 +744,7 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request, } if (!hasPubIp) { - ice_->waitForNegotiation(10); + ice_->waitForNegotiation(ICE_NOGOTIATION_TIMEOUT); if (ice_->isRunning()) { sendIce = true; JAMI_DBG("[Account:%s] ICE negotiation succeed. Answering with local SDP", account.getAccountID().c_str()); @@ -793,9 +794,8 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request, request.from, request.respond(addresses)); if (sendIce) { - if (hasPubIp) { - ice_->waitForNegotiation(10); + ice_->waitForNegotiation(ICE_NOGOTIATION_TIMEOUT); if (ice_->isRunning()) { JAMI_DBG("[Account:%s] ICE negotiation succeed. Answering with local SDP", account.getAccountID().c_str()); } else { diff --git a/src/jamidht/sips_transport_ice.cpp b/src/jamidht/sips_transport_ice.cpp index 1c5af73b2454186e6e5e9deda9e245b090735b3e..dc87790fe6a07b84d1b80e839fc25bef6801cf5b 100644 --- a/src/jamidht/sips_transport_ice.cpp +++ b/src/jamidht/sips_transport_ice.cpp @@ -729,7 +729,7 @@ SipsIceTransport::eventLoop() { while(!stopLoop_) { std::error_code err; - if (tls_ && tls_->waitForData(100, err)) { + if (tls_ && tls_->waitForData(std::chrono::milliseconds(100), err)) { std::vector<uint8_t> pkt; pkt.resize(PJSIP_MAX_PKT_LEN); auto read = tls_->read(pkt.data(), PJSIP_MAX_PKT_LEN, err); diff --git a/src/manager.cpp b/src/manager.cpp index 4ba8b2320fa98650ec8b1e38fc82e3a40bd1b3ba..179a0f042f3bc3b488c73426cf1ecb656a64112e 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -111,7 +111,7 @@ using ConferenceMap = std::map<std::string, std::shared_ptr<Conference>>; /** To store uniquely a list of Call ids */ using CallIDSet = std::set<std::string>; -static constexpr int ICE_INIT_TIMEOUT {10}; +static constexpr std::chrono::seconds ICE_INIT_TIMEOUT{10}; static constexpr const char* PACKAGE_OLD = "ring"; std::atomic_bool Manager::initialized = {false}; diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index a6cc488aa019597beb4d590c8355178c5f4cc0b0..148dc271c95062eff1319c3a8b81b263e81a5ce7 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -135,7 +135,7 @@ TlsTurnEndpoint::Impl::verifyCertificate(gnutls_session_t session) } void -TlsTurnEndpoint::Impl::onTlsStateChange(tls::TlsSessionState state) +TlsTurnEndpoint::Impl::onTlsStateChange(tls::TlsSessionState) {} void @@ -221,9 +221,9 @@ TlsTurnEndpoint::peerCertificate() const } int -TlsTurnEndpoint::waitForData(unsigned ms_timeout, std::error_code& ec) const +TlsTurnEndpoint::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { - return pimpl_->tls->waitForData(ms_timeout, ec); + return pimpl_->tls->waitForData(timeout, ec); } //============================================================================== @@ -249,9 +249,9 @@ TcpSocketEndpoint::~TcpSocketEndpoint() } void -TcpSocketEndpoint::connect(const std::chrono::steady_clock::duration& timeout) +TcpSocketEndpoint::connect(const std::chrono::milliseconds& timeout) { - int ms = std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count(); + int ms = timeout.count(); setsockopt(sock_, SOL_SOCKET, SO_RCVTIMEO, (const char *)&ms, sizeof(ms)); setsockopt(sock_, SOL_SOCKET, SO_SNDTIMEO, (const char *)&ms, sizeof(ms)); @@ -260,12 +260,12 @@ TcpSocketEndpoint::connect(const std::chrono::steady_clock::duration& timeout) } int -TcpSocketEndpoint::waitForData(unsigned ms_timeout, std::error_code& ec) const +TcpSocketEndpoint::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { for (;;) { struct timeval tv; - tv.tv_sec = ms_timeout / 1000; - tv.tv_usec = (ms_timeout % 1000) * 1000; + tv.tv_sec = timeout.count() / 1000; + tv.tv_usec = (timeout.count() % 1000) * 1000; fd_set read_fds; FD_ZERO(&read_fds); @@ -331,11 +331,11 @@ IceSocketEndpoint::shutdown() { } int -IceSocketEndpoint::waitForData(unsigned ms_timeout, std::error_code& ec) const +IceSocketEndpoint::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { if (ice_) { if (!ice_->isRunning()) return -1; - return iceIsSender ? ice_->isDataAvailable(compId_) : ice_->waitForData(compId_, ms_timeout, ec); + return iceIsSender ? ice_->isDataAvailable(compId_) : ice_->waitForData(compId_, timeout, ec); } return -1; } @@ -531,15 +531,15 @@ TlsSocketEndpoint::write(const ValueType* buf, std::size_t len, std::error_code& } void -TlsSocketEndpoint::waitForReady(const std::chrono::steady_clock::duration& timeout) +TlsSocketEndpoint::waitForReady(const std::chrono::milliseconds& timeout) { pimpl_->tls->waitForReady(timeout); } int -TlsSocketEndpoint::waitForData(unsigned ms_timeout, std::error_code& ec) const +TlsSocketEndpoint::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { - return pimpl_->tls->waitForData(ms_timeout, ec); + return pimpl_->tls->waitForData(timeout, ec); } //============================================================================== @@ -670,7 +670,7 @@ PeerConnection::PeerConnectionImpl::eventLoop() msg = ctrlChannel.receive(); } else { std::error_code ec; - if (endpoint_->waitForData(100, ec) > 0) { + if (endpoint_->waitForData(std::chrono::milliseconds(100), ec) > 0) { std::vector<uint8_t> buf(IO_BUFFER_SIZE); JAMI_DBG("A good buffer arrived before any input or output attachment"); auto size = endpoint_->read(buf, ec); @@ -734,7 +734,7 @@ PeerConnection::PeerConnectionImpl::eventLoop() if (!bufferPool_.empty()) { stream->write(bufferPool_); bufferPool_.clear(); - } else if (endpoint_->waitForData(0, ec) > 0) { + } else if (endpoint_->waitForData(std::chrono::milliseconds(0), ec) > 0) { buf.resize(IO_BUFFER_SIZE); endpoint_->read(buf, ec); if (ec) @@ -762,7 +762,7 @@ PeerConnection::PeerConnectionImpl::eventLoop() if (!bufferPool_.empty()) { stream->write(bufferPool_); bufferPool_.clear(); - } else if (endpoint_->waitForData(0, ec) > 0) { + } else if (endpoint_->waitForData(std::chrono::milliseconds(0), ec) > 0) { buf.resize(IO_BUFFER_SIZE); endpoint_->read(buf, ec); if (ec) diff --git a/src/peer_connection.h b/src/peer_connection.h index 30698d6c7e2fa32a3fc0d4d1085f9fa99d7e78ae..99df375505da226946d8eb81d8ec9d8db3a1ee49 100644 --- a/src/peer_connection.h +++ b/src/peer_connection.h @@ -96,8 +96,7 @@ public: void setOnRecv(RecvCb&&) override { throw std::logic_error("TlsTurnEndpoint::setOnRecv not implemented"); } - int waitForData(unsigned, std::error_code&) const override; - + int waitForData(std::chrono::milliseconds, std::error_code&) const override; void waitForReady(const std::chrono::steady_clock::duration& timeout = {}); const dht::crypto::Certificate& peerCertificate() const; @@ -112,7 +111,7 @@ private: class AbstractSocketEndpoint : public GenericSocket<uint8_t> { public: - virtual void connect(const std::chrono::steady_clock::duration &timeout = {}) {}; + virtual void connect(const std::chrono::milliseconds& = {}) {}; void setOnRecv(RecvCb &&) override { throw std::logic_error("AbstractSocketEndpoint::setOnRecv not implemented"); @@ -130,10 +129,10 @@ public: bool isReliable() const override { return true; } bool isInitiator() const override { return true; } int maxPayload() const override { return 1280; } - int waitForData(unsigned ms_timeout, std::error_code& ec) const override; + int waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const override; std::size_t read(ValueType* buf, std::size_t len, std::error_code& ec) override; std::size_t write(const ValueType* buf, std::size_t len, std::error_code& ec) override; - void connect(const std::chrono::steady_clock::duration& timeout = {}) override; + void connect(const std::chrono::milliseconds& timeout = {}) override; private: const IpAddr addr_; @@ -151,7 +150,7 @@ public: bool isReliable() const override { return ice_ ? ice_->isRunning() : false; } bool isInitiator() const override { return ice_ ? ice_->isInitiator() : true; } int maxPayload() const override { return 65536 /* The max for a RTP packet used to wrap data here */; } - int waitForData(unsigned ms_timeout, std::error_code& ec) const override; + int waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const override; std::size_t read(ValueType* buf, std::size_t len, std::error_code& ec) override; std::size_t write(const ValueType* buf, std::size_t len, std::error_code& ec) override; @@ -198,9 +197,9 @@ public: void setOnRecv(RecvCb&&) override { throw std::logic_error("TlsSocketEndpoint::setOnRecv not implemented"); } - int waitForData(unsigned, std::error_code&) const override; + int waitForData(std::chrono::milliseconds timeout, std::error_code&) const override; - void waitForReady(const std::chrono::steady_clock::duration& timeout = {}); + void waitForReady(const std::chrono::milliseconds& timeout = {}); private: class Impl; diff --git a/src/security/tls_session.cpp b/src/security/tls_session.cpp index 6189018825d445b3bec213157404c44ef1a85a1c..7099218cbbe384390eec6fc0b84e252297d9eb8c 100644 --- a/src/security/tls_session.cpp +++ b/src/security/tls_session.cpp @@ -217,7 +217,7 @@ public: ssize_t sendRaw(const void*, size_t); ssize_t sendRawVec(const giovec_t*, int); ssize_t recvRaw(void*, size_t); - int waitForRawData(unsigned); + int waitForRawData(std::chrono::milliseconds); bool initFromRecordState(int offset=0); void handleDataPacket(std::vector<ValueType>&&, uint64_t); @@ -531,7 +531,7 @@ TlsSession::TlsSessionImpl::commonSessionInit() gnutls_transport_set_pull_timeout_function(session_, [](gnutls_transport_ptr_t t, unsigned ms) -> int { auto this_ = reinterpret_cast<TlsSessionImpl*>(t); - return this_->waitForRawData(ms); + return this_->waitForRawData(std::chrono::milliseconds(ms)); }); return true; @@ -660,7 +660,7 @@ TlsSession::TlsSessionImpl::recvRaw(void* buf, size_t size) // 'timeout' is in milliseconds. // Should return 0 on timeout, a positive number if data are available for read, or -1 on error. int -TlsSession::TlsSessionImpl::waitForRawData(unsigned timeout) +TlsSession::TlsSessionImpl::waitForRawData(std::chrono::milliseconds timeout) { if (transport_.isReliable()) { std::error_code ec; @@ -677,13 +677,13 @@ TlsSession::TlsSessionImpl::waitForRawData(unsigned timeout) // non-reliable uses callback installed with setOnRecv() std::unique_lock<std::mutex> lk {rxMutex_}; - rxCv_.wait_for(lk, std::chrono::milliseconds(timeout), [this]{ return !rxQueue_.empty() or state_ == TlsSessionState::SHUTDOWN; }); + rxCv_.wait_for(lk, timeout, [this]{ return !rxQueue_.empty() or state_ == TlsSessionState::SHUTDOWN; }); if (state_ == TlsSessionState::SHUTDOWN) { gnutls_transport_set_errno(session_, EINTR); return -1; } if (rxQueue_.empty()) { - JAMI_ERR("[TLS] waitForRawData: timeout after %u ms", timeout); + JAMI_ERR("[TLS] waitForRawData: timeout after %u ms", timeout.count()); return 0; } return 1; @@ -1355,9 +1355,9 @@ TlsSession::waitForReady(const std::chrono::steady_clock::duration& timeout) } int -TlsSession::waitForData(unsigned ms_timeout, std::error_code& ec) const +TlsSession::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { - if (!pimpl_->transport_.waitForData(ms_timeout, ec)) + if (!pimpl_->transport_.waitForData(timeout, ec)) return 0; return 1; } diff --git a/src/security/tls_session.h b/src/security/tls_session.h index 459b310b77bd975a6270d70f8a0614467e26a281..4b779e9ddeff370a2e04c276304ee872a695119e 100644 --- a/src/security/tls_session.h +++ b/src/security/tls_session.h @@ -139,7 +139,7 @@ public: /// Return a positive number for number of bytes read, or 0 and \a ec set in case of error. std::size_t read(ValueType* data, std::size_t size, std::error_code& ec) override; - int waitForData(unsigned, std::error_code&) const override; + int waitForData(std::chrono::milliseconds, std::error_code&) const override; private: class TlsSessionImpl; diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp index bc6b73ce872850a9c23ae1e8345a76953b919b95..d0281a2c41a3b97fb6dfc1cdc58f6b400ab92123 100644 --- a/src/sip/sipcall.cpp +++ b/src/sip/sipcall.cpp @@ -66,8 +66,8 @@ getVideoSettings() } #endif -static constexpr int DEFAULT_ICE_INIT_TIMEOUT {35}; // seconds -static constexpr int DEFAULT_ICE_NEGO_TIMEOUT {60}; // seconds +static constexpr std::chrono::seconds DEFAULT_ICE_INIT_TIMEOUT {35}; // seconds +static constexpr std::chrono::seconds DEFAULT_ICE_NEGO_TIMEOUT {60}; // seconds // SDP media Ids static constexpr int SDP_AUDIO_MEDIA_ID {0}; diff --git a/src/turn_transport.cpp b/src/turn_transport.cpp index 7546bf3d754d8c7dcd17a38a672557cd958e7a23..d7e9e75ad0d0a9772b875c67ea3ac3404351c893 100644 --- a/src/turn_transport.cpp +++ b/src/turn_transport.cpp @@ -460,13 +460,13 @@ TurnTransport::peerAddresses() const } int -TurnTransport::waitForData(const IpAddr& peer, unsigned ms_timeout, std::error_code& ec) const +TurnTransport::waitForData(const IpAddr& peer, std::chrono::milliseconds timeout, std::error_code& ec) const { (void)ec; ///< \todo handle errors MutexLock lk {pimpl_->apiMutex_}; auto& channel = pimpl_->peerChannels_.at(peer); lk.unlock(); - return channel.wait(std::chrono::milliseconds(ms_timeout)); + return channel.wait(timeout); } //============================================================================== @@ -483,9 +483,9 @@ ConnectedTurnTransport::shutdown() } int -ConnectedTurnTransport::waitForData(unsigned ms_timeout, std::error_code& ec) const +ConnectedTurnTransport::waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const { - return turn_.waitForData(peer_, ms_timeout, ec); + return turn_.waitForData(peer_, timeout, ec); } std::size_t diff --git a/src/turn_transport.h b/src/turn_transport.h index 1b9c363d7136e7e18ef93b290e3cb44ec3d516a0..d3dfef606c71fd145b9276090875350a37e627b1 100644 --- a/src/turn_transport.h +++ b/src/turn_transport.h @@ -135,7 +135,7 @@ public: /// bool sendto(const IpAddr& peer, const char* const buffer, std::size_t size); - int waitForData(const IpAddr& peer, unsigned ms_timeout, std::error_code& ec) const; + int waitForData(const IpAddr& peer, std::chrono::milliseconds timeout, std::error_code& ec) const; public: // Move semantic only, not copiable @@ -159,7 +159,7 @@ public: bool isInitiator() const override { return turn_.isInitiator(); } int maxPayload() const override { return 3000; } - int waitForData(unsigned ms_timeout, std::error_code& ec) const override; + int waitForData(std::chrono::milliseconds timeout, std::error_code& ec) const override; std::size_t read(ValueType* buf, std::size_t length, std::error_code& ec) override; std::size_t write(const ValueType* buf, std::size_t length, std::error_code& ec) override;