genode/repos/gems/src/test/magic_ring_buffer/main.cc
Emery Hemingway 68c1b8675c gems: magic ring buffer
A ring buffer that uses a single dataspace mapped twice in consecutive
regions. This allows any operation that is less or equal to the size of
the buffer to be read or written in a single pass. The capacity of
Magic_ring_buffer is defined at runtime.

Fix #2725
2018-04-10 11:09:47 +02:00

58 lines
1.2 KiB
C++

/*
* \brief Magic ring buffer test
* \author Emery Hemingway
* \date 2018-04-04
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/component.h>
#include <base/log.h>
/* gems includes */
#include <gems/magic_ring_buffer.h>
void Component::construct(Genode::Env &env)
{
using namespace Genode;
Magic_ring_buffer<int> ring_buffer(env, 4097);
log("--- magic ring buffer test, ", ring_buffer.capacity(), " int ring ---");
int const count = ring_buffer.capacity()/3;
int total = 0;
for (int j = 0; j < 99; ++j) {
for (int i = 0; i < count; ++i) {
ring_buffer.write_addr()[i] = i;
}
ring_buffer.fill(count);
for (int i = 0; i < count; ++i) {
if (ring_buffer.read_addr()[i] != i) {
error("ring buffer corruption, ",
ring_buffer.read_addr()[i], " != ", i);
env.parent().exit(total+i);
return;
}
}
ring_buffer.drain(count);
total += count;
}
log("--- test complete, ", total, " ints passed through ring ---");
env.parent().exit(0);
}