6#include "roo_io/status.h"
7#include "roo_threads.h"
8#include "roo_threads/mutex.h"
14class ThreadSafeTransmitter {
16 ThreadSafeTransmitter(
unsigned int sendbuf_log2);
20 void init(uint32_t my_stream_id, SeqNum new_start);
22 uint32_t packets_sent()
const {
23 roo::lock_guard<roo::mutex> guard(mutex_);
24 return transmitter_.packets_sent();
27 uint32_t packets_delivered()
const {
28 roo::lock_guard<roo::mutex> guard(mutex_);
29 return transmitter_.packets_delivered();
32 size_t write(
const roo::byte* buf,
size_t count, uint32_t my_stream_id,
33 roo_io::Status& stream_status,
bool& outgoing_data_ready);
35 size_t tryWrite(
const roo::byte* buf,
size_t count, uint32_t my_stream_id,
36 roo_io::Status& stream_status,
bool& outgoing_data_ready);
38 size_t availableForWrite(uint32_t my_stream_id,
39 roo_io::Status& stream_status)
const;
41 void flush(uint32_t my_stream_id, roo_io::Status& stream_status,
42 bool& outgoing_data_ready);
44 bool hasPendingData(uint32_t my_stream_id,
45 roo_io::Status& stream_status)
const;
49 void close(uint32_t my_stream_id, roo_io::Status& stream_status,
50 bool& outgoing_data_ready);
52 void setConnected(uint16_t peer_receive_buffer_size,
bool control_bit) {
53 roo::lock_guard<roo::mutex> guard(mutex_);
54 transmitter_.setConnected(peer_receive_buffer_size, control_bit);
58 roo::lock_guard<roo::mutex> guard(mutex_);
59 transmitter_.setBroken();
60 all_acked_.notify_all();
61 has_space_.notify_all();
64 Transmitter::State state()
const {
65 roo::lock_guard<roo::mutex> guard(mutex_);
66 return transmitter_.state();
69 size_t send(roo::byte* buf,
long& next_send_micros);
71 SeqNum front()
const {
72 roo::lock_guard<roo::mutex> guard(mutex_);
73 return transmitter_.front();
76 void ack(
bool control_bit, uint16_t seq_id,
const roo::byte* ack_bitmap,
77 size_t ack_bitmap_len,
bool& outgoing_data_ready);
79 void updateRecvHimark(
bool control_bit, uint16_t recv_himark) {
80 roo::lock_guard<roo::mutex> guard(mutex_);
81 if (transmitter_.updateRecvHimark(control_bit, recv_himark)) {
82 has_space_.notify_all();
94 bool checkConnectionStatus(uint32_t my_stream_id,
95 roo_io::Status& status)
const;
97 internal::Transmitter transmitter_;
99 mutable roo::mutex mutex_;
103 roo::condition_variable has_space_;
107 roo::condition_variable all_acked_;