From ebc2bfbb9c03ec68a5ea63fdbed097053bdbba4a Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 2 Oct 2016 16:43:18 +0200 Subject: [PATCH] Use queue instaed of vector This preserves correctly the order of packets --- kernel/include/net/interface.hpp | 14 ++++---------- kernel/src/drivers/loopback.cpp | 2 +- kernel/src/drivers/rtl8139.cpp | 4 ++-- kernel/src/net/network.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/kernel/include/net/interface.hpp b/kernel/include/net/interface.hpp index f716b2eb..d76c7eaf 100644 --- a/kernel/include/net/interface.hpp +++ b/kernel/include/net/interface.hpp @@ -10,10 +10,9 @@ #include #include -#include #include #include -#include +#include #include "conc/mutex.hpp" #include "conc/semaphore.hpp" @@ -51,13 +50,8 @@ struct interface_descriptor { mutable semaphore tx_sem; ///< Semaphore for transmission mutable deferred_unique_semaphore rx_sem; ///< Semaphore for reception - //TODO We need a queue to handle the packets in order - // (need a deque to be efficient) - std::vector rx_queue; - std::vector tx_queue; - - //circular_buffer rx_queue; ///< The reception queue - //circular_buffer tx_queue; ///< The transmission queue + std::queue rx_queue; + std::queue tx_queue; void (*hw_send)(interface_descriptor&, packet_p& p); ///< Driver hardware send function @@ -66,7 +60,7 @@ struct interface_descriptor { */ void send(packet_p& p){ std::lock_guard l(tx_lock); - tx_queue.push_back(p); + tx_queue.push(p); tx_sem.unlock(); } diff --git a/kernel/src/drivers/loopback.cpp b/kernel/src/drivers/loopback.cpp index e6359ab2..de2cb1c2 100644 --- a/kernel/src/drivers/loopback.cpp +++ b/kernel/src/drivers/loopback.cpp @@ -28,7 +28,7 @@ void send_packet(network::interface_descriptor& interface, network::packet_p& pa { direct_int_lock lock; - interface.rx_queue.push_back(packet); + interface.rx_queue.push(packet); interface.rx_sem.notify(); } diff --git a/kernel/src/drivers/rtl8139.cpp b/kernel/src/drivers/rtl8139.cpp index c8423305..aabe700a 100644 --- a/kernel/src/drivers/rtl8139.cpp +++ b/kernel/src/drivers/rtl8139.cpp @@ -131,7 +131,7 @@ void packet_handler(interrupt::syscall_regs*, void* data){ std::copy_n(packet_payload, packet_only_length, packet_buffer); - interface.rx_queue.emplace_back(std::make_shared(packet_buffer, packet_only_length)); + interface.rx_queue.emplace(std::make_shared(packet_buffer, packet_only_length)); interface.rx_sem.notify(); } @@ -194,7 +194,7 @@ void send_packet(network::interface_descriptor& interface, network::packet_p& pa { direct_int_lock lock; - interface.rx_queue.push_back(packet); + interface.rx_queue.push(packet); interface.rx_sem.notify(); } diff --git a/kernel/src/net/network.cpp b/kernel/src/net/network.cpp index 4821d741..6e27bf68 100644 --- a/kernel/src/net/network.cpp +++ b/kernel/src/net/network.cpp @@ -74,8 +74,8 @@ void rx_thread(void* data){ //TODO This is highly unsafe since back() and pop_back() can suffer interleaving - auto packet = interface.rx_queue.back(); - interface.rx_queue.pop_back(); + auto packet = interface.rx_queue.top(); + interface.rx_queue.pop(); ethernet_layer->decode(interface, packet); @@ -94,8 +94,8 @@ void tx_thread(void* data){ while(true){ interface.tx_sem.lock(); - auto packet = interface.tx_queue.back(); - interface.tx_queue.pop_back(); + auto packet = interface.tx_queue.top(); + interface.tx_queue.pop(); interface.hw_send(interface, packet); thor_assert(!packet->user);