* init_data_node() is now called init_first_data_node(), and also sets
data_header::first_node to that node. It will also remove some of the burden of the callers with regard to setting its members correctly. * Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20651 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2006, Haiku, Inc. All Rights Reserved.
|
* Copyright 2006-2007, Haiku, Inc. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
@@ -55,6 +55,8 @@ struct data_header {
|
|||||||
data_node *first_node;
|
data_node *first_node;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MAX_FREE_BUFFER_SIZE (BUFFER_SIZE - sizeof(data_header))
|
||||||
|
|
||||||
struct net_buffer_private : net_buffer {
|
struct net_buffer_private : net_buffer {
|
||||||
struct list buffers;
|
struct list buffers;
|
||||||
data_node first_node;
|
data_node first_node;
|
||||||
@@ -140,6 +142,9 @@ free_data_header_space(data_header *header, uint8 *data, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Tries to allocate \a size bytes from the free space in the header.
|
||||||
|
*/
|
||||||
static uint8 *
|
static uint8 *
|
||||||
alloc_data_header_space(data_header *header, size_t size)
|
alloc_data_header_space(data_header *header, size_t size)
|
||||||
{
|
{
|
||||||
@@ -184,14 +189,22 @@ alloc_data_header_space(data_header *header, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Initializes the first data_node of a data_header.
|
||||||
|
The node must have been assigned to the header already.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
init_data_node(data_node *node, size_t headerSpace)
|
init_first_data_node(data_node *node)
|
||||||
{
|
{
|
||||||
|
data_header *header = node->header;
|
||||||
|
|
||||||
node->offset = 0;
|
node->offset = 0;
|
||||||
node->start = (uint8 *)node->header + sizeof(data_header) + headerSpace;
|
node->start = header->data_end + header->data_space;
|
||||||
node->used = 0;
|
node->used = 0;
|
||||||
node->header_space = headerSpace;
|
node->header_space = header->data_space;
|
||||||
node->tail_space = BUFFER_SIZE - headerSpace - sizeof(data_header);
|
node->tail_space = MAX_FREE_BUFFER_SIZE - header->data_space;
|
||||||
|
|
||||||
|
header->first_node = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -201,7 +214,8 @@ add_data_node(data_header *header, data_header *located = NULL)
|
|||||||
if (located == NULL)
|
if (located == NULL)
|
||||||
located = header;
|
located = header;
|
||||||
|
|
||||||
data_node *node = (data_node *)alloc_data_header_space(located, sizeof(data_node));
|
data_node *node = (data_node *)alloc_data_header_space(located,
|
||||||
|
sizeof(data_node));
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -222,7 +236,8 @@ remove_data_node(data_node *node)
|
|||||||
{
|
{
|
||||||
data_header *located = node->located;
|
data_header *located = node->located;
|
||||||
|
|
||||||
TRACE((" remove data node %p from header %p (located %p)\n", node, node->header, located));
|
TRACE((" remove data node %p from header %p (located %p)\n",
|
||||||
|
node, node->header, located));
|
||||||
|
|
||||||
if (located != node->header)
|
if (located != node->header)
|
||||||
release_data_header(node->header);
|
release_data_header(node->header);
|
||||||
@@ -260,7 +275,8 @@ get_node_at_offset(net_buffer_private *buffer, size_t offset)
|
|||||||
static net_buffer *
|
static net_buffer *
|
||||||
create_buffer(size_t headerSpace)
|
create_buffer(size_t headerSpace)
|
||||||
{
|
{
|
||||||
net_buffer_private *buffer = (net_buffer_private *)malloc(sizeof(struct net_buffer_private));
|
net_buffer_private *buffer = (net_buffer_private *)malloc(
|
||||||
|
sizeof(struct net_buffer_private));
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -274,8 +290,7 @@ create_buffer(size_t headerSpace)
|
|||||||
|
|
||||||
buffer->first_node.header = header;
|
buffer->first_node.header = header;
|
||||||
buffer->first_node.located = NULL;
|
buffer->first_node.located = NULL;
|
||||||
init_data_node(&buffer->first_node, headerSpace);
|
init_first_data_node(&buffer->first_node);
|
||||||
header->first_node = &buffer->first_node;
|
|
||||||
|
|
||||||
list_init(&buffer->buffers);
|
list_init(&buffer->buffers);
|
||||||
list_add_item(&buffer->buffers, &buffer->first_node);
|
list_add_item(&buffer->buffers, &buffer->first_node);
|
||||||
@@ -365,7 +380,8 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace)
|
|||||||
|
|
||||||
TRACE(("clone_buffer(buffer %p)\n", buffer));
|
TRACE(("clone_buffer(buffer %p)\n", buffer));
|
||||||
|
|
||||||
net_buffer_private *clone = (net_buffer_private *)malloc(sizeof(struct net_buffer_private));
|
net_buffer_private *clone = (net_buffer_private *)malloc(
|
||||||
|
sizeof(struct net_buffer_private));
|
||||||
if (clone == NULL)
|
if (clone == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -636,7 +652,7 @@ prepend_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer)
|
|||||||
size_t bytesLeft = size;
|
size_t bytesLeft = size;
|
||||||
do {
|
do {
|
||||||
if (node->header_space == 0) {
|
if (node->header_space == 0) {
|
||||||
size_t headerSpace = BUFFER_SIZE - sizeof(data_header);
|
size_t headerSpace = MAX_FREE_BUFFER_SIZE;
|
||||||
data_header *header = create_data_header(headerSpace);
|
data_header *header = create_data_header(headerSpace);
|
||||||
if (header == NULL) {
|
if (header == NULL) {
|
||||||
// TODO: free up headers we already allocated!
|
// TODO: free up headers we already allocated!
|
||||||
@@ -644,11 +660,9 @@ prepend_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
data_node *previous = node;
|
data_node *previous = node;
|
||||||
node = (data_node *)add_data_node(header);
|
|
||||||
|
|
||||||
init_data_node(node, headerSpace);
|
node = (data_node *)add_data_node(header);
|
||||||
node->header_space = header->data_space;
|
init_first_data_node(node);
|
||||||
header->first_node = node;
|
|
||||||
|
|
||||||
list_insert_item_before(&buffer->buffers, previous, node);
|
list_insert_item_before(&buffer->buffers, previous, node);
|
||||||
}
|
}
|
||||||
@@ -661,10 +675,12 @@ prepend_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer)
|
|||||||
bytesLeft -= willConsume;
|
bytesLeft -= willConsume;
|
||||||
} while (bytesLeft > 0);
|
} while (bytesLeft > 0);
|
||||||
|
|
||||||
|
// correct data offset in all nodes
|
||||||
|
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
for (node = (data_node *)list_get_first_item(&buffer->buffers);
|
node = NULL;
|
||||||
node != NULL; node = (data_node *)
|
while ((node = (data_node *)list_get_next_item(&buffer->buffers,
|
||||||
list_get_next_item(&buffer->buffers, node)) {
|
node)) != NULL) {
|
||||||
node->offset = offset;
|
node->offset = offset;
|
||||||
offset += node->used;
|
offset += node->used;
|
||||||
}
|
}
|
||||||
@@ -734,7 +750,7 @@ append_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer)
|
|||||||
uint32 count = (sizeNeeded + BUFFER_SIZE - minimalHeaderSpace - 1)
|
uint32 count = (sizeNeeded + BUFFER_SIZE - minimalHeaderSpace - 1)
|
||||||
/ (BUFFER_SIZE - minimalHeaderSpace);
|
/ (BUFFER_SIZE - minimalHeaderSpace);
|
||||||
uint32 headerSpace = BUFFER_SIZE - sizeNeeded / count - sizeof(data_header);
|
uint32 headerSpace = BUFFER_SIZE - sizeNeeded / count - sizeof(data_header);
|
||||||
uint32 sizeUsed = BUFFER_SIZE - sizeof(data_header) - headerSpace;
|
uint32 sizeUsed = MAX_FREE_BUFFER_SIZE - headerSpace;
|
||||||
uint32 sizeAdded = tailSpace;
|
uint32 sizeAdded = tailSpace;
|
||||||
|
|
||||||
// allocate space left in the node
|
// allocate space left in the node
|
||||||
@@ -748,7 +764,7 @@ append_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer)
|
|||||||
if (i == count - 1) {
|
if (i == count - 1) {
|
||||||
// last data_header - compensate rounding errors
|
// last data_header - compensate rounding errors
|
||||||
sizeUsed = size - sizeAdded;
|
sizeUsed = size - sizeAdded;
|
||||||
headerSpace = BUFFER_SIZE - sizeof(data_header) - sizeUsed;
|
headerSpace = MAX_FREE_BUFFER_SIZE - sizeUsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
data_header *header = create_data_header(headerSpace);
|
data_header *header = create_data_header(headerSpace);
|
||||||
@@ -760,13 +776,11 @@ append_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer)
|
|||||||
node = (data_node *)add_data_node(header);
|
node = (data_node *)add_data_node(header);
|
||||||
// this can't fail as we made sure there will be enough header space
|
// this can't fail as we made sure there will be enough header space
|
||||||
|
|
||||||
init_data_node(node, headerSpace);
|
init_first_data_node(node);
|
||||||
node->header_space = header->data_space;
|
|
||||||
node->tail_space -= sizeUsed;
|
node->tail_space -= sizeUsed;
|
||||||
node->used = sizeUsed;
|
node->used = sizeUsed;
|
||||||
node->offset = buffer->size;
|
node->offset = buffer->size;
|
||||||
|
|
||||||
header->first_node = node;
|
|
||||||
buffer->size += sizeUsed;
|
buffer->size += sizeUsed;
|
||||||
sizeAdded += sizeUsed;
|
sizeAdded += sizeUsed;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user