--- libaitio/inc/aitio.h 2012/07/22 00:30:01 1.20.2.1 +++ libaitio/inc/aitio.h 2012/07/22 10:04:27 1.20.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.20.2.1 2012/07/22 00:30:01 misho Exp $ +* $Id: aitio.h,v 1.20.2.2 2012/07/22 10:04:27 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -100,7 +100,15 @@ typedef enum { typedef struct { uint8_t val_type; - uint8_t val_pad; + union { + struct { + uint8_t val_zcpy:1; + uint8_t val_be:1; + uint8_t val_le:1; + uint8_t val_pad:5; + }; + uint8_t val_opt; + }; uint16_t val_key; uint32_t val_len; union { @@ -122,13 +130,16 @@ typedef struct { int64_t i64; } val; uint8_t val_data[0]; -} __packed ait_val_t; +} __packed ait_val_t; /* sizeof 16 bytes */ #define AIT_TYPE(_vl) ((ait_type_t) (_vl)->val_type) #define AIT_LEN(_vl) (_vl)->val_len #define AIT_KEY(_vl) (_vl)->val_key #define AIT_RAW(_vl) (_vl)->val.net #define AIT_ADDR(_vl) (_vl)->val.ptr +#define AIT_ZEROCOPY(_vl) (_vl)->val_zcpy +#define AIT_BE(_vl) (_vl)->val_be +#define AIT_LE(_vl) (_vl)->val_le #define AIT_BLOB_CHUNKS(_vl, _n) (AIT_LEN((_vl)) / _n + (AIT_LEN((_vl)) % _n) ? 1 : 0) #define AIT_ISEMPTY(_vl) (AIT_TYPE((_vl)) == empty) @@ -259,22 +270,24 @@ typedef struct { #define AIT_FREE_VAL(_vl) do { ait_val_t *__val = (_vl); assert(__val); \ switch (AIT_TYPE(__val)) { \ case buffer: \ - if (__val->val.buffer) { \ + if (!__val->val_zcpy && \ + __val->val.buffer) \ io_free(__val->val.buffer); \ - __val->val.buffer = NULL; \ - } \ + __val->val.buffer = NULL; \ break; \ case string: \ - if (__val->val.string) { \ + if (!__val->val_zcpy && \ + __val->val.string) \ io_free(__val->val.string); \ - __val->val.string = NULL; \ - } \ + __val->val.string = NULL; \ break; \ default: \ break; \ } \ __val->val_type = empty; \ + __val->val_opt ^= __val->val_opt; \ AIT_LEN(__val) = 0; \ + AIT_KEY(__val) = 0; \ } while (0) struct io_ether_addr {