|
@@ -1,16 +1,16 @@
|
|
|
#include "utils_packet_queue.h"
|
|
#include "utils_packet_queue.h"
|
|
|
-#include "../base/base_logger.h"
|
|
|
|
|
|
|
+#include "../base/logger.h"
|
|
|
#include <algorithm>
|
|
#include <algorithm>
|
|
|
#include <shared_mutex>
|
|
#include <shared_mutex>
|
|
|
|
|
|
|
|
namespace av {
|
|
namespace av {
|
|
|
namespace utils {
|
|
namespace utils {
|
|
|
|
|
|
|
|
-using namespace av::base;
|
|
|
|
|
|
|
+using namespace av;
|
|
|
|
|
|
|
|
PacketQueue::PacketQueue(const PacketQueueConfig& config)
|
|
PacketQueue::PacketQueue(const PacketQueueConfig& config)
|
|
|
: config_(config) {
|
|
: config_(config) {
|
|
|
- Logger::debug("PacketQueue created with max size: {}, max bytes: {}",
|
|
|
|
|
|
|
+ Logger::instance().debugf("PacketQueue created with max size: {}, max bytes: {}",
|
|
|
config_.maxSize, config_.maxBytes);
|
|
config_.maxSize, config_.maxBytes);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -19,7 +19,7 @@ PacketQueue::~PacketQueue() {
|
|
|
notEmpty_.notify_all();
|
|
notEmpty_.notify_all();
|
|
|
notFull_.notify_all();
|
|
notFull_.notify_all();
|
|
|
clear();
|
|
clear();
|
|
|
- Logger::debug("PacketQueue destroyed");
|
|
|
|
|
|
|
+ Logger::instance().debug("PacketQueue destroyed");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
@@ -33,7 +33,7 @@ ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
|
|
|
|
|
|
// 检查流过滤
|
|
// 检查流过滤
|
|
|
if (!isStreamAllowed(item->streamIndex)) {
|
|
if (!isStreamAllowed(item->streamIndex)) {
|
|
|
- Logger::debug("Packet dropped - stream {} not allowed", item->streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Packet dropped - stream {} not allowed", item->streamIndex);
|
|
|
return ErrorCode::SUCCESS;
|
|
return ErrorCode::SUCCESS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -48,7 +48,7 @@ ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
|
stats_.totalDropped++;
|
|
stats_.totalDropped++;
|
|
|
|
|
|
|
|
- Logger::debug("Packet dropped by smart drop policy");
|
|
|
|
|
|
|
+ Logger::instance().debug("Packet dropped by smart drop policy");
|
|
|
return ErrorCode::SUCCESS;
|
|
return ErrorCode::SUCCESS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -73,7 +73,7 @@ ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
|
stats_.totalDropped++;
|
|
stats_.totalDropped++;
|
|
|
|
|
|
|
|
- Logger::debug("Packet dropped - queue full");
|
|
|
|
|
|
|
+ Logger::instance().debug("Packet dropped - queue full");
|
|
|
return ErrorCode::SUCCESS;
|
|
return ErrorCode::SUCCESS;
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
@@ -84,7 +84,7 @@ ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
|
size_t newBytes = totalBytes_.load();
|
|
size_t newBytes = totalBytes_.load();
|
|
|
return (newSize < config_.maxSize && newBytes < config_.maxBytes) || shutdown_;
|
|
return (newSize < config_.maxSize && newBytes < config_.maxBytes) || shutdown_;
|
|
|
})) {
|
|
})) {
|
|
|
- Logger::warning("Enqueue timeout");
|
|
|
|
|
|
|
+ Logger::instance().warning("Enqueue timeout");
|
|
|
return ErrorCode::TIMEOUT;
|
|
return ErrorCode::TIMEOUT;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -99,6 +99,9 @@ ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
|
totalBytes_ += item->packet->size;
|
|
totalBytes_ += item->packet->size;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 在move之前保存item的引用,用于后续的统计和回调
|
|
|
|
|
+ const PacketQueueItem& itemRef = *item;
|
|
|
|
|
+
|
|
|
// 添加到队列
|
|
// 添加到队列
|
|
|
if (config_.priorityQueue) {
|
|
if (config_.priorityQueue) {
|
|
|
enqueueToPriorityQueue(std::move(item));
|
|
enqueueToPriorityQueue(std::move(item));
|
|
@@ -108,7 +111,7 @@ ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
|
|
|
|
|
|
// 更新统计信息
|
|
// 更新统计信息
|
|
|
if (config_.enableStats) {
|
|
if (config_.enableStats) {
|
|
|
- updateStats(*item, true);
|
|
|
|
|
|
|
+ updateStats(itemRef, true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 通知等待的消费者
|
|
// 通知等待的消费者
|
|
@@ -116,7 +119,7 @@ ErrorCode PacketQueue::enqueue(std::unique_ptr<PacketQueueItem> item) {
|
|
|
|
|
|
|
|
// 回调
|
|
// 回调
|
|
|
if (enqueueCallback_) {
|
|
if (enqueueCallback_) {
|
|
|
- enqueueCallback_(*item);
|
|
|
|
|
|
|
+ enqueueCallback_(itemRef);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return ErrorCode::SUCCESS;
|
|
return ErrorCode::SUCCESS;
|
|
@@ -227,7 +230,7 @@ ErrorCode PacketQueue::enqueueWithPriority(AVPacket* packet, int priority, int s
|
|
|
|
|
|
|
|
std::unique_ptr<PacketQueueItem> PacketQueue::dequeueHighestPriority() {
|
|
std::unique_ptr<PacketQueueItem> PacketQueue::dequeueHighestPriority() {
|
|
|
if (!config_.priorityQueue) {
|
|
if (!config_.priorityQueue) {
|
|
|
- Logger::warning("Priority queue not enabled");
|
|
|
|
|
|
|
+ Logger::instance().warning("Priority queue not enabled");
|
|
|
return dequeue();
|
|
return dequeue();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -248,7 +251,7 @@ void PacketQueue::clear() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
totalBytes_ = 0;
|
|
totalBytes_ = 0;
|
|
|
- Logger::debug("Packet queue cleared");
|
|
|
|
|
|
|
+ Logger::instance().debug("Packet queue cleared");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::flush() {
|
|
void PacketQueue::flush() {
|
|
@@ -272,18 +275,18 @@ void PacketQueue::setMaxSize(size_t maxSize) {
|
|
|
currentSize = config_.priorityQueue ? priorityQueue_.size() : normalQueue_.size();
|
|
currentSize = config_.priorityQueue ? priorityQueue_.size() : normalQueue_.size();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- Logger::debug("Packet queue max size set to: {}", maxSize);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Packet queue max size set to: {}", maxSize);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::setMaxBytes(size_t maxBytes) {
|
|
void PacketQueue::setMaxBytes(size_t maxBytes) {
|
|
|
config_.maxBytes = maxBytes;
|
|
config_.maxBytes = maxBytes;
|
|
|
- Logger::debug("Packet queue max bytes set to: {}", maxBytes);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Packet queue max bytes set to: {}", maxBytes);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::setDropPolicy(bool dropOnFull, bool dropOldest) {
|
|
void PacketQueue::setDropPolicy(bool dropOnFull, bool dropOldest) {
|
|
|
config_.dropOnFull = dropOnFull;
|
|
config_.dropOnFull = dropOnFull;
|
|
|
config_.dropOldest = dropOldest;
|
|
config_.dropOldest = dropOldest;
|
|
|
- Logger::debug("Drop policy set: dropOnFull={}, dropOldest={}", dropOnFull, dropOldest);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Drop policy set: dropOnFull={}, dropOldest={}", dropOnFull, dropOldest);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::enablePriorityQueue(bool enable) {
|
|
void PacketQueue::enablePriorityQueue(bool enable) {
|
|
@@ -321,7 +324,7 @@ void PacketQueue::enablePriorityQueue(bool enable) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
config_.priorityQueue = enable;
|
|
config_.priorityQueue = enable;
|
|
|
- Logger::debug("Priority queue {}", enable ? "enabled" : "disabled");
|
|
|
|
|
|
|
+ Logger::instance().debugf("Priority queue {}", enable ? "enabled" : "disabled");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
size_t PacketQueue::size() const {
|
|
size_t PacketQueue::size() const {
|
|
@@ -367,7 +370,7 @@ PacketQueueStats PacketQueue::getStats() const {
|
|
|
void PacketQueue::resetStats() {
|
|
void PacketQueue::resetStats() {
|
|
|
std::lock_guard<std::mutex> lock(statsMutex_);
|
|
std::lock_guard<std::mutex> lock(statsMutex_);
|
|
|
stats_ = PacketQueueStats();
|
|
stats_ = PacketQueueStats();
|
|
|
- Logger::debug("Packet queue stats reset");
|
|
|
|
|
|
|
+ Logger::instance().debug("Packet queue stats reset");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::enablePacketDrop(bool enable, double maxLatency, int dropRatio) {
|
|
void PacketQueue::enablePacketDrop(bool enable, double maxLatency, int dropRatio) {
|
|
@@ -375,7 +378,7 @@ void PacketQueue::enablePacketDrop(bool enable, double maxLatency, int dropRatio
|
|
|
config_.maxLatency = maxLatency;
|
|
config_.maxLatency = maxLatency;
|
|
|
config_.dropRatio = dropRatio;
|
|
config_.dropRatio = dropRatio;
|
|
|
|
|
|
|
|
- Logger::debug("Packet drop enabled: {}, maxLatency: {}ms, dropRatio: {}",
|
|
|
|
|
|
|
+ Logger::instance().debugf("Packet drop enabled: {}, maxLatency: {}ms, dropRatio: {}",
|
|
|
enable, maxLatency, dropRatio);
|
|
enable, maxLatency, dropRatio);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -389,7 +392,7 @@ void PacketQueue::setBlocking(bool blocking) {
|
|
|
notEmpty_.notify_all();
|
|
notEmpty_.notify_all();
|
|
|
notFull_.notify_all();
|
|
notFull_.notify_all();
|
|
|
}
|
|
}
|
|
|
- Logger::debug("Packet queue blocking mode: {}", blocking);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Packet queue blocking mode: {}", blocking);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::wakeup() {
|
|
void PacketQueue::wakeup() {
|
|
@@ -401,14 +404,14 @@ void PacketQueue::setStreamFilter(const std::vector<int>& allowedStreams) {
|
|
|
std::lock_guard<std::mutex> lock(streamFilterMutex_);
|
|
std::lock_guard<std::mutex> lock(streamFilterMutex_);
|
|
|
allowedStreams_ = allowedStreams;
|
|
allowedStreams_ = allowedStreams;
|
|
|
hasStreamFilter_ = !allowedStreams.empty();
|
|
hasStreamFilter_ = !allowedStreams.empty();
|
|
|
- Logger::debug("Stream filter set with {} allowed streams", allowedStreams.size());
|
|
|
|
|
|
|
+ Logger::instance().debugf("Stream filter set with {} allowed streams", allowedStreams.size());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::clearStreamFilter() {
|
|
void PacketQueue::clearStreamFilter() {
|
|
|
std::lock_guard<std::mutex> lock(streamFilterMutex_);
|
|
std::lock_guard<std::mutex> lock(streamFilterMutex_);
|
|
|
allowedStreams_.clear();
|
|
allowedStreams_.clear();
|
|
|
hasStreamFilter_ = false;
|
|
hasStreamFilter_ = false;
|
|
|
- Logger::debug("Stream filter cleared");
|
|
|
|
|
|
|
+ Logger::instance().debug("Stream filter cleared");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 内部方法实现
|
|
// 内部方法实现
|
|
@@ -458,7 +461,7 @@ void PacketQueue::dropOldestPacket() {
|
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
|
stats_.totalDropped++;
|
|
stats_.totalDropped++;
|
|
|
|
|
|
|
|
- Logger::debug("Dropped oldest packet from priority queue");
|
|
|
|
|
|
|
+ Logger::instance().debug("Dropped oldest packet from priority queue");
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
if (!normalQueue_.empty()) {
|
|
if (!normalQueue_.empty()) {
|
|
@@ -477,7 +480,7 @@ void PacketQueue::dropOldestPacket() {
|
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
std::lock_guard<std::mutex> statsLock(statsMutex_);
|
|
|
stats_.totalDropped++;
|
|
stats_.totalDropped++;
|
|
|
|
|
|
|
|
- Logger::debug("Dropped oldest packet from normal queue");
|
|
|
|
|
|
|
+ Logger::instance().debug("Dropped oldest packet from normal queue");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -547,7 +550,7 @@ void PacketQueue::dropNonKeyPackets() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- Logger::debug("Dropped non-key packets, kept {} key packets", keyPackets.size());
|
|
|
|
|
|
|
+ Logger::instance().debugf("Dropped non-key packets, kept {} key packets", keyPackets.size());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PacketQueue::updateStats(const PacketQueueItem& item, bool isEnqueue) {
|
|
void PacketQueue::updateStats(const PacketQueueItem& item, bool isEnqueue) {
|
|
@@ -652,24 +655,24 @@ std::unique_ptr<PacketQueueItem> PacketQueue::dequeueFromPriorityQueue() {
|
|
|
// 多流包队列实现
|
|
// 多流包队列实现
|
|
|
MultiStreamPacketQueue::MultiStreamPacketQueue(const PacketQueueConfig& config)
|
|
MultiStreamPacketQueue::MultiStreamPacketQueue(const PacketQueueConfig& config)
|
|
|
: defaultConfig_(config) {
|
|
: defaultConfig_(config) {
|
|
|
- Logger::debug("MultiStreamPacketQueue created");
|
|
|
|
|
|
|
+ Logger::instance().debug("MultiStreamPacketQueue created");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
MultiStreamPacketQueue::~MultiStreamPacketQueue() {
|
|
MultiStreamPacketQueue::~MultiStreamPacketQueue() {
|
|
|
clear();
|
|
clear();
|
|
|
- Logger::debug("MultiStreamPacketQueue destroyed");
|
|
|
|
|
|
|
+ Logger::instance().debug("MultiStreamPacketQueue destroyed");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ErrorCode MultiStreamPacketQueue::addStream(int streamIndex, const PacketQueueConfig& config) {
|
|
ErrorCode MultiStreamPacketQueue::addStream(int streamIndex, const PacketQueueConfig& config) {
|
|
|
std::unique_lock<std::shared_mutex> lock(streamsMutex_);
|
|
std::unique_lock<std::shared_mutex> lock(streamsMutex_);
|
|
|
|
|
|
|
|
if (streamQueues_.find(streamIndex) != streamQueues_.end()) {
|
|
if (streamQueues_.find(streamIndex) != streamQueues_.end()) {
|
|
|
- Logger::warning("Stream {} already exists", streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().warningf("Stream {} already exists", streamIndex);
|
|
|
return ErrorCode::ALREADY_EXISTS;
|
|
return ErrorCode::ALREADY_EXISTS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
streamQueues_[streamIndex] = std::make_unique<PacketQueue>(config);
|
|
streamQueues_[streamIndex] = std::make_unique<PacketQueue>(config);
|
|
|
- Logger::debug("Added stream: {}", streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Added stream: {}", streamIndex);
|
|
|
|
|
|
|
|
return ErrorCode::SUCCESS;
|
|
return ErrorCode::SUCCESS;
|
|
|
}
|
|
}
|
|
@@ -679,12 +682,12 @@ ErrorCode MultiStreamPacketQueue::removeStream(int streamIndex) {
|
|
|
|
|
|
|
|
auto it = streamQueues_.find(streamIndex);
|
|
auto it = streamQueues_.find(streamIndex);
|
|
|
if (it == streamQueues_.end()) {
|
|
if (it == streamQueues_.end()) {
|
|
|
- Logger::warning("Stream {} not found", streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().warningf("Stream {} not found", streamIndex);
|
|
|
return ErrorCode::NOT_FOUND;
|
|
return ErrorCode::NOT_FOUND;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
streamQueues_.erase(it);
|
|
streamQueues_.erase(it);
|
|
|
- Logger::debug("Removed stream: {}", streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Removed stream: {}", streamIndex);
|
|
|
|
|
|
|
|
return ErrorCode::SUCCESS;
|
|
return ErrorCode::SUCCESS;
|
|
|
}
|
|
}
|
|
@@ -864,7 +867,7 @@ void MultiStreamPacketQueue::clear() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- Logger::debug("All stream queues cleared");
|
|
|
|
|
|
|
+ Logger::instance().debug("All stream queues cleared");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MultiStreamPacketQueue::clearStream(int streamIndex) {
|
|
void MultiStreamPacketQueue::clearStream(int streamIndex) {
|
|
@@ -873,7 +876,7 @@ void MultiStreamPacketQueue::clearStream(int streamIndex) {
|
|
|
auto it = streamQueues_.find(streamIndex);
|
|
auto it = streamQueues_.find(streamIndex);
|
|
|
if (it != streamQueues_.end()) {
|
|
if (it != streamQueues_.end()) {
|
|
|
it->second->clear();
|
|
it->second->clear();
|
|
|
- Logger::debug("Stream {} queue cleared", streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Stream {} queue cleared", streamIndex);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -884,7 +887,7 @@ void MultiStreamPacketQueue::flush() {
|
|
|
pair.second->flush();
|
|
pair.second->flush();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- Logger::debug("All stream queues flushed");
|
|
|
|
|
|
|
+ Logger::instance().debug("All stream queues flushed");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MultiStreamPacketQueue::flushStream(int streamIndex) {
|
|
void MultiStreamPacketQueue::flushStream(int streamIndex) {
|
|
@@ -893,7 +896,7 @@ void MultiStreamPacketQueue::flushStream(int streamIndex) {
|
|
|
auto it = streamQueues_.find(streamIndex);
|
|
auto it = streamQueues_.find(streamIndex);
|
|
|
if (it != streamQueues_.end()) {
|
|
if (it != streamQueues_.end()) {
|
|
|
it->second->flush();
|
|
it->second->flush();
|
|
|
- Logger::debug("Stream {} queue flushed", streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Stream {} queue flushed", streamIndex);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -993,7 +996,7 @@ void MultiStreamPacketQueue::resetStats() {
|
|
|
pair.second->resetStats();
|
|
pair.second->resetStats();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- Logger::debug("All stream queue stats reset");
|
|
|
|
|
|
|
+ Logger::instance().debug("All stream queue stats reset");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MultiStreamPacketQueue::resetStats(int streamIndex) {
|
|
void MultiStreamPacketQueue::resetStats(int streamIndex) {
|
|
@@ -1002,7 +1005,7 @@ void MultiStreamPacketQueue::resetStats(int streamIndex) {
|
|
|
auto it = streamQueues_.find(streamIndex);
|
|
auto it = streamQueues_.find(streamIndex);
|
|
|
if (it != streamQueues_.end()) {
|
|
if (it != streamQueues_.end()) {
|
|
|
it->second->resetStats();
|
|
it->second->resetStats();
|
|
|
- Logger::debug("Stream {} queue stats reset", streamIndex);
|
|
|
|
|
|
|
+ Logger::instance().debugf("Stream {} queue stats reset", streamIndex);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1013,7 +1016,7 @@ void MultiStreamPacketQueue::setBlocking(bool blocking) {
|
|
|
pair.second->setBlocking(blocking);
|
|
pair.second->setBlocking(blocking);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- Logger::debug("All stream queues blocking mode: {}", blocking);
|
|
|
|
|
|
|
+ Logger::instance().debugf("All stream queues blocking mode: {}", blocking);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MultiStreamPacketQueue::wakeupAll() {
|
|
void MultiStreamPacketQueue::wakeupAll() {
|