Changeset 25275
- Timestamp:
- 04/30/08 14:47:11 (7 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
haiku/trunk/src/add-ons/kernel/network/stack/net_buffer.cpp
r25256 r25275 45 45 #include <debug_paranoia.h> 46 46 47 #define DATA_NODE_READ_ONLY 0x1 47 48 48 49 struct header_space { 49 50 uint16 size; 50 51 uint16 free; 52 }; 53 54 struct free_data { 55 struct free_data *next; 56 uint16 size; 57 }; 58 59 struct 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; 51 66 }; 52 67 … … 57 72 size_t offset; // the net_buffer-wide offset of this node 58 73 uint8 *start; // points to the start of the data 74 uint16 flags; 59 75 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 to63 // the header's space otherwise to64 // 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 } 67 83 68 84 void AddHeaderSpace(uint16 toAdd) 69 85 { 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 } 72 90 } 73 91 74 92 void SubtractHeaderSpace(uint16 toSubtract) 75 93 { 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 } 92 122 }; 93 123 … … 568 598 while ((node = (data_node *)list_get_next_item(&buffer->buffers, node)) != NULL) { 569 599 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); 571 601 //dump_block((char *)node->start, node->used, " "); 572 602 dump_block((char *)node->start, min_c(node->used, 32), " "); … … 731 761 header->space.free = headerSpace; 732 762 header->data_end = (uint8 *)header + DATA_HEADER_SIZE; 763 header->tail_space = (uint8 *)header + BUFFER_SIZE - header->data_end 764 - headerSpace; 733 765 header->first_free = NULL; 734 766 … … 873 905 node->start = header->data_end + header->space.free; 874 906 node->used = 0; 875 node->used_header_space = &header->space; 876 node->tail_space = (uint8 *)header + BUFFER_SIZE - node->start; 907 node->flags = 0; 877 908 878 909 return node; … … 899 930 node->located = located; 900 931 node->header = header; 901 node-> used_header_space = &node->own_header_space;932 node->flags = 0; 902 933 return node; 903 934 } … … 915 946 // this is the first node of a buffer (i.e. the header is an allocation 916 947 // header). 917 node-> used_header_space->size += node->used + node->tail_space;948 node->FreeSpace(); 918 949 919 950 if (located != node->header) … … 1435 1466 1436 1467 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())); 1438 1469 //dump_buffer(buffer); 1439 1470 … … 1545 1576 //dump_buffer(buffer); 1546 1577 1547 if (node-> tail_space< size) {1578 if (node->TailSpace() < size) { 1548 1579 // we need to append at least one new buffer 1549 uint32 previousTailSpace = node-> tail_space;1580 uint32 previousTailSpace = node->TailSpace(); 1550 1581 uint32 headerSpace = DATA_NODE_SIZE; 1551 1582 uint32 sizeUsed = MAX_FREE_BUFFER_SIZE - headerSpace; 1552 1583 1553 1584 // allocate space left in the node 1554 node-> tail_space = 0;1585 node->SetTailSpace(0); 1555 1586 node->used += previousTailSpace; 1556 1587 buffer->size += previousTailSpace; … … 1575 1606 node = add_first_data_node(header); 1576 1607 1577 node-> tail_space -= sizeUsed;1608 node->SetTailSpace(node->TailSpace() - sizeUsed); 1578 1609 node->used = sizeUsed; 1579 1610 node->offset = buffer->size; … … 1602 1633 1603 1634 // the data fits into this buffer 1604 node-> tail_space -= size;1635 node->SetTailSpace(node->TailSpace() - size); 1605 1636 1606 1637 if (_contiguousBuffer) … … 1747 1778 1748 1779 int32 diff = node->used + node->offset - newSize; 1749 node-> tail_space += diff;1780 node->SetTailSpace(node->TailSpace() + diff); 1750 1781 node->used -= diff; 1751 1782 … … 1818 1849 clone->start = node->start + offset; 1819 1850 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; 1823 1852 1824 1853 list_add_item(&buffer->buffers, clone);
