std::optional<T> top();
bool pop();
std::optional<T> top_and_pop();
+ std::optional<T> top_and_pop_and_rsize(unsigned int *rsize);
void clear();
/*
* status ==
return value;
}
+template <typename T>
+std::optional<T> TSQueue<T>::top_and_pop_and_rsize(unsigned int *rsize) {
+ std::lock_guard<std::mutex> lock(mutex);
+ std::optional<T> value = std::nullopt;
+ if(!rb.empty()) {
+ value = rb.top();
+ rb.pop();
+ }
+ if(rsize) {
+ *rsize = rb.getSize();
+ }
+ return value;
+}
+
template <typename T>
void TSQueue<T>::clear() {
std::lock_guard<std::mutex> lock(mutex);
} else {
flags.reset(0);
}
- flags.set(2);
rng_engine.seed(std::chrono::system_clock::now().time_since_epoch().count());
UDPC_ConnectionId identifier{receivedData.sin6_addr, receivedData.sin6_scope_id, ntohs(receivedData.sin6_port)};
- if(isConnect && flags.test(2)) {
+ if(isConnect && isAcceptNewConnections.load()) {
// is connect packet and is accepting new connections
if(!flags.test(1)
&& conMap.find(identifier) == conMap.end()) {
ctx->update_impl();
ctx->mutex.unlock();
nextNow = std::chrono::steady_clock::now();
- std::this_thread::sleep_for(std::chrono::milliseconds(11) - (nextNow - now));
+ std::this_thread::sleep_for(std::chrono::milliseconds(8) - (nextNow - now));
}
}
return UDPC::get_empty_pinfo();
}
- auto opt_pinfo = c->receivedPkts.top_and_pop();
- if(remaining) {
- *remaining = c->receivedPkts.size();
- }
+ auto opt_pinfo = c->receivedPkts.top_and_pop_and_rsize(remaining);
if(opt_pinfo) {
return *opt_pinfo;
}