--- libaitio/inc/aitio.h 2012/05/23 14:06:08 1.18.2.5 +++ 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.18.2.5 2012/05/23 14:06:08 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 @@ -49,8 +49,6 @@ SUCH DAMAGE. #define COMPAT_43TTY -#include -#include #include #include #include @@ -60,8 +58,14 @@ SUCH DAMAGE. #include #include #include +#include +#include +#ifndef STRSIZ +#define STRSIZ 256 +#endif + #define IO_SYSM 0 #define IO_MPOOL 1 @@ -96,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 { @@ -118,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) @@ -156,8 +171,8 @@ typedef struct { (_vl) = __val; \ } while (0); #define AIT_SET_PTR(_vl, _p, _len) do { ait_val_t *__val = (_vl); assert(__val); \ - __val->val_type = ptr; AIT_LEN(__val) = _len; \ - __val->val.ptr = _p; } while (0) + __val->val_type = ptr; __val->val.ptr = _p; \ + AIT_LEN(__val) = _len; } while (0) #define AIT_RE_BUF(_vl, _len) do { ait_val_t *__val = (_vl); assert(__val); \ void *__ptr = io_realloc(AIT_GET_BUF(__val), _len); \ if (__ptr) { \ @@ -195,8 +210,8 @@ typedef struct { AIT_LEN(__val)); \ } } while (0) #define AIT_SET_BLOB(_vl, _n, _len) do { ait_val_t *__val = (_vl); assert(__val); \ - __val->val_type = blob; AIT_LEN(__val) = _len; \ - __val->val.blob = _n; } while (0) + __val->val_type = blob; __val->val.blob = _n; \ + AIT_LEN(__val) = _len; } while (0) #define AIT_SET_BLOB2(_vl, _bv) do { ait_val_t *__val = (_vl); assert(__val); assert((_bv)); \ __val->val_type = blob; AIT_LEN(__val) = (_bv)->blob_len; \ __val->val.blob = (_bv)->blob_var; } while (0) @@ -255,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 {