X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Finterfaces%2Fvmm_keyed_stream.h;h=d9a9eeaf80ff183b76a5970216b454d4de9ff5a5;hb=1f0cbd22f1263a6083f0d5fc69f69f98db6006df;hp=e06535dbc2d26823cfb6de41606ad7a3eb36dace;hpb=ba178554a5f6714e5ceb7b77df462ac72de90b0c;p=palacios.git diff --git a/palacios/include/interfaces/vmm_keyed_stream.h b/palacios/include/interfaces/vmm_keyed_stream.h index e06535d..d9a9eea 100644 --- a/palacios/include/interfaces/vmm_keyed_stream.h +++ b/palacios/include/interfaces/vmm_keyed_stream.h @@ -49,6 +49,7 @@ typedef enum {V3_KS_RD_ONLY,V3_KS_WR_ONLY,V3_KS_WR_ONLY_CREATE} v3_keyed_stream_ v3_keyed_stream_t v3_keyed_stream_open(char *url, v3_keyed_stream_open_t open_type); void v3_keyed_stream_close(v3_keyed_stream_t stream); +void v3_keyed_stream_preallocate_hint_key(v3_keyed_stream_t stream, char *key, uint64_t size); v3_keyed_stream_key_t v3_keyed_stream_open_key(v3_keyed_stream_t stream, char *key); void v3_keyed_stream_close_key(v3_keyed_stream_t stream, char *key); sint64_t v3_keyed_stream_write_key(v3_keyed_stream_t stream, @@ -60,7 +61,9 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, void *buf, sint64_t len); -#define STD_SAVE(stream,ks,x) \ + + +#define STD_SAVE_RAW(stream,ks,x) \ do { \ if (sizeof((x)) != v3_keyed_stream_write_key((stream), (ks), &(x), sizeof((x)))) { \ v3_keyed_stream_close_key((stream),(ks)); \ @@ -68,7 +71,7 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, } \ } while (0) -#define STD_LOAD(stream,ks,x) \ +#define STD_LOAD_RAW(stream,ks,x) \ do { \ if (sizeof((x)) != v3_keyed_stream_read_key((stream), (ks), &(x), sizeof((x)))) { \ v3_keyed_stream_close_key((stream),(ks)); \ @@ -77,6 +80,89 @@ sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream, } while (0) #endif +#define KSTREAM_MAGIC_COOKIE 0xabcd0123 + +#define STD_SAVE_TAGGED(stream,ks,tag,size,x) \ +do { \ +uint32_t temp; \ +temp=KSTREAM_MAGIC_COOKIE; \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +temp=strlen(tag); \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp != v3_keyed_stream_write_key((stream),(ks),tag,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +temp=(size); \ +if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if ((size) != v3_keyed_stream_write_key((stream),(ks),&(x),(size))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} while (0) + +#define STD_LOAD_TAGGED(stream,ks,tag,size,x) \ +do { \ +uint32_t temp; \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp!=KSTREAM_MAGIC_COOKIE) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (strlen((tag))!=temp) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +{ char buf[temp+1]; \ + if (temp != v3_keyed_stream_read_key((stream),(ks),buf,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ + buf[temp]=0; \ + if (strncasecmp(buf,tag,temp)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} \ +if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +if (temp!=(size)) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ +} \ +if ((size) != v3_keyed_stream_read_key((stream),(ks),&(x),(size))) { \ + v3_keyed_stream_close_key((stream),(ks)); \ + return -1; \ + } \ +} while (0) + +#ifdef V3_CONFIG_KEYED_STREAMS_WITH_TAGS +#define STD_SAVE(stream,ks,x) STD_SAVE_TAGGED(stream,ks,#x,sizeof(x),x) +#define STD_LOAD(stream,ks,x) STD_LOAD_TAGGED(stream,ks,#x,sizeof(x),x) +#else +#define STD_SAVE(stream,ks,x) STD_SAVE_RAW(stream,ks,x) +#define STD_LOAD(stream,ks,x) STD_LOAD_RAW(stream,ks,x) +#endif + + struct v3_keyed_stream_hooks { // url is meaningful only to the host implementation @@ -85,6 +171,10 @@ struct v3_keyed_stream_hooks { void (*close)(v3_keyed_stream_t stream); + void (*preallocate_hint_key)(v3_keyed_stream_t stream, + char *key, + uint64_t size); + v3_keyed_stream_key_t (*open_key)(v3_keyed_stream_t stream, char *key);