previous release of BufferQueue. IOW #2594 should be fixed now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28943 a95241bf-73f2-0310-859d-f6bbb57e9c96
137 lines
2.2 KiB
C++
137 lines
2.2 KiB
C++
#define DEBUG_BUFFER_QUEUE 1
|
|
|
|
#include "BufferQueue.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
|
|
extern "C" status_t _add_builtin_module(module_info *info);
|
|
|
|
extern struct net_buffer_module_info gNetBufferModule;
|
|
// from net_buffer.cpp
|
|
|
|
struct net_socket_module_info gNetSocketModule;
|
|
struct net_buffer_module_info* gBufferModule;
|
|
|
|
BufferQueue gQueue(32768);
|
|
|
|
|
|
net_buffer*
|
|
create_filled_buffer(size_t bytes)
|
|
{
|
|
const static uint8 data[4096] = {0};
|
|
|
|
net_buffer* buffer = gBufferModule->create(256);
|
|
if (buffer == NULL) {
|
|
printf("creating a buffer failed!\n");
|
|
return NULL;
|
|
}
|
|
|
|
status_t status = gBufferModule->append(buffer, data, bytes);
|
|
if (status != B_OK) {
|
|
printf("appending %lu bytes to buffer %p failed: %s\n", bytes, buffer,
|
|
strerror(status));
|
|
gBufferModule->free(buffer);
|
|
return NULL;
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
|
|
void
|
|
add(size_t bytes, uint32 at)
|
|
{
|
|
gQueue.Add(create_filled_buffer(bytes), at);
|
|
}
|
|
|
|
|
|
void
|
|
eat(size_t bytes)
|
|
{
|
|
net_buffer* buffer = NULL;
|
|
status_t status = gQueue.Get(bytes, true, &buffer);
|
|
if (status == B_OK) {
|
|
ASSERT(buffer->size == bytes);
|
|
gBufferModule->free(buffer);
|
|
} else
|
|
printf("getting %lu bytes failed: %s\n", bytes, strerror(status));
|
|
}
|
|
|
|
|
|
void
|
|
dump(const char* text = "")
|
|
{
|
|
printf("%s (available %lu at %lu)\n", text, gQueue.Available(),
|
|
(uint32)gQueue.FirstSequence());
|
|
gQueue.Dump();
|
|
}
|
|
|
|
|
|
int
|
|
main()
|
|
{
|
|
_add_builtin_module((module_info*)&gNetBufferModule);
|
|
get_module(NET_BUFFER_MODULE_NAME, (module_info**)&gBufferModule);
|
|
gQueue.SetInitialSequence(100);
|
|
|
|
add(100, 100);
|
|
add(100, 300);
|
|
add(100, 250);
|
|
add(100, 175);
|
|
ASSERT(gQueue.Available() == 300);
|
|
dump("add 4");
|
|
|
|
eat(99);
|
|
dump("ate 99");
|
|
|
|
eat(1);
|
|
eat(1);
|
|
eat(149);
|
|
eat(50);
|
|
|
|
add(10, 100);
|
|
add(0, 400);
|
|
add(1, 399);
|
|
dump("add nothing");
|
|
|
|
add(1, 1000);
|
|
dump("add far away");
|
|
|
|
add(2, 399);
|
|
dump("add 1");
|
|
|
|
add(100, 500);
|
|
add(10, 480);
|
|
add(19, 401);
|
|
add(10, 460);
|
|
add(10, 420);
|
|
add(30, 430);
|
|
add(35, 465);
|
|
dump("added with holes");
|
|
|
|
add(50, 425);
|
|
dump("added no new data");
|
|
|
|
eat(19);
|
|
eat(1);
|
|
eat(40);
|
|
eat(50);
|
|
dump("ate some");
|
|
|
|
add(1, 999);
|
|
dump("add 1");
|
|
add(2, 999);
|
|
add(2, 999);
|
|
dump("add 2");
|
|
add(3, 999);
|
|
dump("add 3");
|
|
|
|
add(60, 540);
|
|
dump("add at the end of previous data");
|
|
|
|
put_module(NET_BUFFER_MODULE_NAME);
|
|
return 0;
|
|
}
|