Changeset 25275

Show
Ignore:
Timestamp:
04/30/08 14:47:11 (7 months ago)
Author:
bonefish
Message:

Following Axel's suggestions:
* Added data_node::flags field and currently only flag

DATA_NODE_READ_ONLY, indicating that the node is read-only (i.e.
a clone). If set, the node won't have any header or tail space. Not
being able to write to it is not yet enforced, though.

* Moved data_node::tail_space to data_header.
* Removed data_node:used_header_space/own_header_space.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • haiku/trunk/src/add-ons/kernel/network/stack/net_buffer.cpp

    r25256 r25275  
    4545#include <debug_paranoia.h> 
    4646 
     47#define DATA_NODE_READ_ONLY             0x1 
    4748 
    4849struct header_space { 
    4950        uint16  size; 
    5051        uint16  free; 
     52}; 
     53 
     54struct free_data { 
     55        struct free_data *next; 
     56        uint16          size; 
     57}; 
     58 
     59struct data_header { 
     60        int32           ref_count; 
     61        addr_t          physical_address; 
     62        free_data       *first_free; 
     63        uint8           *data_end; 
     64        header_space    space; 
     65        uint16          tail_space; 
    5166}; 
    5267 
     
    5772        size_t          offset;                 // the net_buffer-wide offset of this node 
    5873        uint8           *start;                 // points to the start of the data 
     74        uint16          flags; 
    5975        uint16          used;                   // defines how much memory is used by this node 
    60         uint16          tail_space; 
    61         header_space    own_header_space; 
    62         header_space    *used_header_space;     // For the "first node" this points to 
    63                                                                                 // the header's space otherwise to 
    64                                                                                 // own_header_space. 
    65  
    66         uint16  HeaderSpace() const     { return used_header_space->free; } 
     76 
     77        uint16 HeaderSpace() const 
     78        { 
     79                if ((flags & DATA_NODE_READ_ONLY) != 0) 
     80                        return 0; 
     81                return header->space.free; 
     82        } 
    6783 
    6884        void AddHeaderSpace(uint16 toAdd) 
    6985        { 
    70                 used_header_space->size += toAdd; 
    71                 used_header_space->free += toAdd; 
     86                if ((flags & DATA_NODE_READ_ONLY) == 0) { 
     87                        header->space.size += toAdd; 
     88                        header->space.free += toAdd; 
     89                } 
    7290        } 
    7391 
    7492        void SubtractHeaderSpace(uint16 toSubtract) 
    7593        { 
    76                 used_header_space->size -= toSubtract; 
    77                 used_header_space->free -= toSubtract; 
    78         } 
    79 }; 
    80  
    81 struct free_data { 
    82         struct free_data *next; 
    83         uint16          size; 
    84 }; 
    85  
    86 struct data_header { 
    87         int32           ref_count; 
    88         addr_t          physical_address; 
    89         free_data       *first_free; 
    90         uint8           *data_end; 
    91         header_space    space; 
     94                if ((flags & DATA_NODE_READ_ONLY) == 0) { 
     95                        header->space.size -= toSubtract; 
     96                        header->space.free -= toSubtract; 
     97                } 
     98        } 
     99 
     100        uint16 TailSpace() const 
     101        { 
     102                if ((flags & DATA_NODE_READ_ONLY) != 0) 
     103                        return 0; 
     104                return header->tail_space; 
     105        } 
     106 
     107        void SetTailSpace(uint16 space) 
     108        { 
     109                if ((flags & DATA_NODE_READ_ONLY) == 0) 
     110                        header->tail_space = space; 
     111        } 
     112 
     113        void FreeSpace() 
     114        { 
     115                if ((flags & DATA_NODE_READ_ONLY) == 0) { 
     116                        uint16 space = used + header->tail_space; 
     117                        header->space.size += space; 
     118                        header->space.free += space; 
     119                        header->tail_space = 0; 
     120                } 
     121        } 
    92122}; 
    93123 
     
    568598        while ((node = (data_node *)list_get_next_item(&buffer->buffers, node)) != NULL) { 
    569599                dprintf("  node %p, offset %lu, used %u, header %u, tail %u, header %p\n", 
    570                         node, node->offset, node->used, node->HeaderSpace(), node->tail_space, node->header); 
     600                        node, node->offset, node->used, node->HeaderSpace(), node->TailSpace(), node->header); 
    571601                //dump_block((char *)node->start, node->used, "    "); 
    572602                dump_block((char *)node->start, min_c(node->used, 32), "    "); 
     
    731761        header->space.free = headerSpace; 
    732762        header->data_end = (uint8 *)header + DATA_HEADER_SIZE; 
     763        header->tail_space = (uint8 *)header + BUFFER_SIZE - header->data_end 
     764                - headerSpace; 
    733765        header->first_free = NULL; 
    734766 
     
    873905        node->start = header->data_end + header->space.free; 
    874906        node->used = 0; 
    875         node->used_header_space = &header->space; 
    876         node->tail_space = (uint8 *)header + BUFFER_SIZE - node->start; 
     907        node->flags = 0; 
    877908 
    878909        return node; 
     
    899930        node->located = located; 
    900931        node->header = header; 
    901         node->used_header_space = &node->own_header_space; 
     932        node->flags = 0; 
    902933        return node; 
    903934} 
     
    915946        // this is the first node of a buffer (i.e. the header is an allocation 
    916947        // header). 
    917         node->used_header_space->size += node->used + node->tail_space; 
     948        node->FreeSpace(); 
    918949 
    919950        if (located != node->header) 
     
    14351466 
    14361467        TRACE(("%ld: prepend_size(buffer %p, size %ld) [has %u]\n", 
    1437                 find_thread(NULL), buffer, size, node->used_header_space.free)); 
     1468                find_thread(NULL), buffer, size, node->HeaderSpace())); 
    14381469        //dump_buffer(buffer); 
    14391470 
     
    15451576        //dump_buffer(buffer); 
    15461577 
    1547         if (node->tail_space < size) { 
     1578        if (node->TailSpace() < size) { 
    15481579                // we need to append at least one new buffer 
    1549                 uint32 previousTailSpace = node->tail_space; 
     1580                uint32 previousTailSpace = node->TailSpace(); 
    15501581                uint32 headerSpace = DATA_NODE_SIZE; 
    15511582                uint32 sizeUsed = MAX_FREE_BUFFER_SIZE - headerSpace; 
    15521583 
    15531584                // allocate space left in the node 
    1554                 node->tail_space = 0; 
     1585                node->SetTailSpace(0); 
    15551586                node->used += previousTailSpace; 
    15561587                buffer->size += previousTailSpace; 
     
    15751606                        node = add_first_data_node(header); 
    15761607 
    1577                         node->tail_space -= sizeUsed; 
     1608                        node->SetTailSpace(node->TailSpace() - sizeUsed); 
    15781609                        node->used = sizeUsed; 
    15791610                        node->offset = buffer->size; 
     
    16021633 
    16031634        // the data fits into this buffer 
    1604         node->tail_space -= size; 
     1635        node->SetTailSpace(node->TailSpace() - size); 
    16051636 
    16061637        if (_contiguousBuffer) 
     
    17471778 
    17481779        int32 diff = node->used + node->offset - newSize; 
    1749         node->tail_space += diff; 
     1780        node->SetTailSpace(node->TailSpace() + diff); 
    17501781        node->used -= diff; 
    17511782 
     
    18181849                clone->start = node->start + offset; 
    18191850                clone->used = min_c(bytes, node->used - offset); 
    1820                 clone->used_header_space->size = 0; 
    1821                 clone->used_header_space->free = 0; 
    1822                 clone->tail_space = 0; 
     1851                clone->flags |= DATA_NODE_READ_ONLY; 
    18231852 
    18241853                list_add_item(&buffer->buffers, clone);