// DHCP packets are waiting so we don't starve external
// sockets under heavy DHCP load.
struct timeval select_timeout;
- if (getPacketQueue4()->empty()) {
+ if (!getPacketQueue4()->canDequeue()) {
select_timeout.tv_sec = timeout_sec;
select_timeout.tv_usec = timeout_usec;
} else {
int result = select(maxfd + 1, &sockets, NULL, NULL, &select_timeout);
- if ((result == 0) && getPacketQueue4()->empty()) {
+ if ((result == 0) && !getPacketQueue4()->canDequeue()) {
// nothing received and timeout has been reached
return (Pkt4Ptr());
} else if (result < 0) {
// DHCP packets are waiting so we don't starve external
// sockets under heavy DHCP load.
struct timeval select_timeout;
- if (getPacketQueue6()->empty()) {
+ if (!getPacketQueue6()->canDequeue()) {
select_timeout.tv_sec = timeout_sec;
select_timeout.tv_usec = timeout_usec;
} else {
int result = select(maxfd + 1, &sockets, NULL, NULL, &select_timeout);
- if ((result == 0) && getPacketQueue6()->empty()) {
+ if ((result == 0) && !getPacketQueue6()->canDequeue()) {
// nothing received and timeout has been reached
return (Pkt6Ptr());
} else if (result < 0) {
/// @brief return True if the queue is empty.
virtual bool empty() const = 0;
+ /// @brief return True if dequeue will not return null.
+ ///
+ /// In fact it is !empty within a lock guard.
+ virtual bool canDequeue() = 0;
+
/// @brief Returns the current number of packets in the buffer.
virtual size_t getSize() const = 0;
/// @return A pointer to dequeued packet, or an empty pointer
/// if the queue is empty.
virtual PacketTypePtr popPacket(const QueueEnd& from = QueueEnd::FRONT) {
+ std::lock_guard<std::mutex> lock(mutex_);
+
PacketTypePtr packet;
if (queue_.empty()) {
return (packet);
}
- std::lock_guard<std::mutex> lock(mutex_);
if (from == QueueEnd::FRONT) {
packet = queue_.front();
queue_.pop_front();
/// @brief Returns True if the queue is empty.
virtual bool empty() const {
- return(queue_.empty());
+ return (queue_.empty());
+ }
+
+ /// @brief return True if dequeue will not return null.
+ /// Use the mutex so race free with a concurrent enqueue.
+ virtual bool canDequeue() {
+ std::lock_guard<std::mutex> lock(mutex_);
+ return (!queue_.empty());
}
/// @brief Returns the maximum number of packets allowed in the buffer.