diff --git a/repos/os/src/test/packet_stream/main.cc b/repos/os/src/test/packet_stream/main.cc deleted file mode 100644 index e0005207d4..0000000000 --- a/repos/os/src/test/packet_stream/main.cc +++ /dev/null @@ -1,339 +0,0 @@ -/* - * \brief Test for the packet-streaming interface - * \author Norman Feske - * \date 2009-11-11 - */ - -/* - * Copyright (C) 2009-2013 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU General Public License version 2. - */ - -#include -#include -#include -#include -#include -#include - - -/** - * Specialized policy, using a small queue sizes - * - * Note that the ack queue size is smaller than the submit queue - * size. - */ -typedef Genode::Packet_stream_policy - Test_packet_stream_policy; - - -enum { STACK_SIZE = 4096 }; - - -void Genode::Packet_stream_base::_debug_print_buffers() -{ - Genode::log("_ds_local_base = ", _ds_local_base); - Genode::log("_submit_queue_offset = ", Genode::Hex(_submit_queue_offset)); - Genode::log("_ack_queue_offset = ", Genode::Hex(_ack_queue_offset)); - Genode::log("_bulk_buffer_offset = ", Genode::Hex(_bulk_buffer_offset)); - Genode::log("_bulk_buffer_size = ", Genode::Hex(_bulk_buffer_size)); -} - - -/** - * Thread generating packets - */ -class Source : private Genode::Thread_deprecated, - private Genode::Allocator_avl, - public Genode::Packet_stream_source -{ - private: - - enum Operation { OP_NONE, OP_GENERATE, OP_ACKNOWLEDGE }; - - Operation _operation; /* current mode of operation */ - Genode::Lock _lock; /* lock used as barrier in the thread loop */ - unsigned _cnt; /* number of packets to produce */ - - void _generate_packets(unsigned cnt) - { - for (unsigned i = 0; i < cnt; i++) { - try { - enum { PACKET_SIZE = 1024 }; - Packet_descriptor packet = alloc_packet(PACKET_SIZE); - - char *content = packet_content(packet); - if (!content) { - Genode::warning("source: invalid packet"); - } - Genode::log("Source: allocated packet (" - "offset=", Genode::Hex(packet.offset()), " " - "size=", Genode::Hex(packet.size()), ")"); - - for (unsigned i = 0; i < packet.size(); i++) - content[i] = i; - - bool is_blocking = !ready_to_submit(); - if (is_blocking) - Genode::log("Source: submit queue is full, going to block"); - - submit_packet(packet); - - if (is_blocking) - Genode::log("Source: returned from submit_packet function"); - - } catch (Packet_stream_source<>::Packet_alloc_failed) { - Genode::error("Source: Packet allocation failed"); - } - } - } - - void _acknowledge_packets(unsigned cnt) - { - for (unsigned i = 0; i < cnt; i++) { - if (!ack_avail()) - Genode::log("Source: acknowledgement queue is empty, going to block"); - - Packet_descriptor packet = get_acked_packet(); - char *content = packet_content(packet); - if (!content) { - Genode::warning("source: invalid packet"); - - } else { - - /* validate packet content */ - for (unsigned i = 0; i < packet.size(); i++) { - if (content[i] != (char)i) { - Genode::error("source: packet content is corrupted"); - break; - } - } - } - - Genode::log("Source: release packet (" - "offset=", Genode::Hex(packet.offset()), ", " - "size=", packet.size(), ")"); - release_packet(packet); - } - } - - void entry() - { - for (;;) { - - /* wait for a new 'generate' or 'acknowledge' call */ - _lock.lock(); - - if (_operation == OP_GENERATE) - _generate_packets(_cnt); - - if (_operation == OP_ACKNOWLEDGE) - _acknowledge_packets(_cnt); - } - } - - public: - - /** - * Constructor - */ - Source(Genode::Dataspace_capability ds_cap) - : - /* init bulk buffer allocator, storing its meta data on the heap */ - Thread_deprecated("source"), - Genode::Allocator_avl(Genode::env()->heap()), - Packet_stream_source( - ds_cap, *Genode::env()->rm_session(), *this), - _operation(OP_NONE), - _lock(Genode::Lock::LOCKED), - _cnt(0) - { - Genode::log("Source: packet stream buffers:"); - debug_print_buffers(); - start(); - } - - void generate(unsigned cnt) - { - _cnt = cnt; - _operation = OP_GENERATE; - _lock.unlock(); - } - - void acknowledge(unsigned cnt) - { - _cnt = cnt; - _operation = OP_ACKNOWLEDGE; - _lock.unlock(); - } -}; - - -class Sink : private Genode::Thread_deprecated, - public Genode::Packet_stream_sink -{ - private: - - enum Operation { OP_NONE, OP_PROCESS }; - - Operation _operation; /* current mode of operation */ - Genode::Lock _lock; /* lock used as barrier in the thread loop */ - unsigned _cnt; /* number of packets to produce */ - - void _process_packets(unsigned cnt) - { - for (unsigned i = 0; i < cnt; i++) { - - if (!packet_avail()) - Genode::log("Sink: no packet available, going to block"); - - Packet_descriptor packet = get_packet(); - - char *content = packet_content(packet); - if (!content) - Genode::warning("invalid packet"); - - Genode::log("Sink: got packet (" - "offset=", Genode::Hex(packet.offset()), ", " - "size=", packet.size(), ")"); - - if (!ready_to_ack()) - Genode::log("Sink: ack queue is full, going to block"); - - acknowledge_packet(packet); - } - } - - void entry() - { - for (;;) { - - /* wait for a new 'process' call */ - _lock.lock(); - - if (_operation == OP_PROCESS) - _process_packets(_cnt); - } - } - - public: - - /** - * Constructor - */ - Sink(Genode::Dataspace_capability ds_cap) - : - Thread_deprecated("sink"), - Packet_stream_sink( - ds_cap, *Genode::env()->rm_session()), - _operation(OP_NONE), - _lock(Genode::Lock::LOCKED), - _cnt(0) - { - Genode::log("Sink: packet stream buffers:"); - debug_print_buffers(); - start(); - } - - void process(unsigned cnt) - { - _cnt = cnt; - _operation = OP_PROCESS; - _lock.unlock(); - } -}; - - -void test_1_good_case(Timer::Session *timer, Source *source, Sink *sink, - unsigned batch_size, unsigned rounds) -{ - for (unsigned i = 0; i < rounds; i++) { - - enum { DELAY = 200 }; - - Genode::log("- round ", i, " -"); - - Genode::log("generate ", batch_size, " packets, " - "fitting in bulk buffer and submit queue"); - source->generate(batch_size); - - timer->msleep(DELAY); - - Genode::log("process ", batch_size, " packets"); - sink->process(batch_size); - - timer->msleep(DELAY); - - Genode::log("acknowledge ", batch_size, " packets"); - source->acknowledge(batch_size); - - timer->msleep(DELAY); - } -} - - -void test_2_flood_submit(Timer::Session *timer, Source *source, Sink *sink) -{ - enum { PACKETS = 9 }; /* more than the number of submit queue entries */ - enum { DELAY = 200 }; - - source->generate(PACKETS); - timer->msleep(DELAY); - - Genode::log("- source should block, process 3 packets, source should wake up -"); - - sink->process(1); - timer->msleep(5*DELAY); - sink->process(2); - - Genode::log("- let source acknowledge 3 packets -"); - source->acknowledge(3); - timer->msleep(DELAY); - - Genode::log("- process and acknowledge the remaining packets in batches 3 -\n"); - for (int i = 0; i < 2; i++) { - sink->process(3); - timer->msleep(DELAY); - - source->acknowledge(3); - timer->msleep(DELAY); - } -} - - -using namespace Genode; - -int main(int, char **) -{ - log("--- packet stream test ---"); - - Timer::Connection timer; - - enum { TRANSPORT_DS_SIZE = 16*1024 }; - Dataspace_capability ds_cap = env()->ram_session()->alloc(TRANSPORT_DS_SIZE); - - Source source(ds_cap); - Sink sink(ds_cap); - - /* wire data-flow signals beteen source and sink */ - source.register_sigh_packet_avail(sink.sigh_packet_avail()); - source.register_sigh_ready_to_ack(sink.sigh_ready_to_ack()); - sink.register_sigh_ready_to_submit(source.sigh_ready_to_submit()); - sink.register_sigh_ack_avail(source.sigh_ack_avail()); - - timer.msleep(1000); - - log("\n-- test 1: good case, no queue pressure, no blocking --"); - test_1_good_case(&timer, &source, &sink, 3, 5); - - log("\n-- test 2: flood submit queue, sender blocks, gets woken up --"); - test_2_flood_submit(&timer, &source, &sink); - - log("waiting to settle down"); - timer.msleep(2*1000); - - log("--- end of packet stream test ---"); - return 0; -} diff --git a/repos/os/src/test/packet_stream/target.mk b/repos/os/src/test/packet_stream/target.mk deleted file mode 100644 index 8c5173192b..0000000000 --- a/repos/os/src/test/packet_stream/target.mk +++ /dev/null @@ -1,3 +0,0 @@ -TARGET = test-packet_stream -SRC_CC = main.cc -LIBS = base