2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2011, Peter Dinda <pdinda@northwestern.edu>
11 * Copyright (c) 2011, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Peter Dinda <pdinda@northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
21 #ifndef __VMM_KEYED_STREAM_H__
22 #define __VMM_KEYED_STREAM_H__
24 #include <palacios/vmm.h>
28 A keyed stream essentially supports this:
30 URL => {collection of key->stream pairs}
32 If you open a key for reading, you get the read pointer set to its beginning.
33 You can then make repeated reads to advance the read pointer. You cannot seek.
34 Reading is done with a tag supplied, and we will match the requested tag
35 against the actual tag. If they do not match, we immediately return
38 Writing works similarly.
40 You cannot both read and write.
44 /* A keyed stream and its components are opaque to palacios */
45 typedef void * v3_keyed_stream_t;
46 typedef void * v3_keyed_stream_key_t;
48 typedef enum {V3_KS_RD_ONLY,V3_KS_WR_ONLY,V3_KS_WR_ONLY_CREATE} v3_keyed_stream_open_t;
53 v3_keyed_stream_t v3_keyed_stream_open(char *url, v3_keyed_stream_open_t open_type);
54 void v3_keyed_stream_close(v3_keyed_stream_t stream);
55 void v3_keyed_stream_preallocate_hint_key(v3_keyed_stream_t stream, char *key, uint64_t size);
56 v3_keyed_stream_key_t v3_keyed_stream_open_key(v3_keyed_stream_t stream, char *key);
57 void v3_keyed_stream_close_key(v3_keyed_stream_t stream, char *key);
58 sint64_t v3_keyed_stream_write_key(v3_keyed_stream_t stream,
59 v3_keyed_stream_key_t key,
64 sint64_t v3_keyed_stream_read_key(v3_keyed_stream_t stream,
65 v3_keyed_stream_key_t key,
73 /* We will kill this stuff since it's now in the interface
75 #define STD_SAVE_RAW(stream,ks,x) \
77 if (sizeof((x)) != v3_keyed_stream_write_key((stream), (ks), &(x), sizeof((x)))) { \
78 v3_keyed_stream_close_key((stream),(ks)); \
83 #define STD_LOAD_RAW(stream,ks,x) \
85 if (sizeof((x)) != v3_keyed_stream_read_key((stream), (ks), &(x), sizeof((x)))) { \
86 v3_keyed_stream_close_key((stream),(ks)); \
92 #define KSTREAM_MAGIC_COOKIE 0xabcd0123
95 #define STD_SAVE_TAGGED(stream,ks,tag,size,x) \
98 temp=KSTREAM_MAGIC_COOKIE; \
99 if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \
100 v3_keyed_stream_close_key((stream),(ks)); \
104 if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \
105 v3_keyed_stream_close_key((stream),(ks)); \
108 if (temp != v3_keyed_stream_write_key((stream),(ks),tag,temp)) { \
109 v3_keyed_stream_close_key((stream),(ks)); \
113 if (sizeof(temp) != v3_keyed_stream_write_key((stream),(ks),&temp,sizeof(temp))) { \
114 v3_keyed_stream_close_key((stream),(ks)); \
117 if ((size) != v3_keyed_stream_write_key((stream),(ks),&(x),(size))) { \
118 v3_keyed_stream_close_key((stream),(ks)); \
123 #define STD_LOAD_TAGGED(stream,ks,tag,size,x) \
126 if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \
127 v3_keyed_stream_close_key((stream),(ks)); \
130 if (temp!=KSTREAM_MAGIC_COOKIE) { \
131 v3_keyed_stream_close_key((stream),(ks)); \
134 if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \
135 v3_keyed_stream_close_key((stream),(ks)); \
138 if (strlen((tag))!=temp) { \
139 v3_keyed_stream_close_key((stream),(ks)); \
142 { char buf[temp+1]; \
143 if (temp != v3_keyed_stream_read_key((stream),(ks),buf,temp)) { \
144 v3_keyed_stream_close_key((stream),(ks)); \
148 if (strncasecmp(buf,tag,temp)) { \
149 v3_keyed_stream_close_key((stream),(ks)); \
153 if (sizeof(temp) != v3_keyed_stream_read_key((stream),(ks),&temp,sizeof(temp))) { \
154 v3_keyed_stream_close_key((stream),(ks)); \
157 if (temp!=(size)) { \
158 v3_keyed_stream_close_key((stream),(ks)); \
161 if ((size) != v3_keyed_stream_read_key((stream),(ks),&(x),(size))) { \
162 v3_keyed_stream_close_key((stream),(ks)); \
167 #ifdef V3_CONFIG_KEYED_STREAMS_WITH_TAGS
168 #define STD_SAVE(stream,ks,x) STD_SAVE_TAGGED(stream,ks,#x,sizeof(x),x)
169 #define STD_LOAD(stream,ks,x) STD_LOAD_TAGGED(stream,ks,#x,sizeof(x),x)
171 #define STD_SAVE(stream,ks,x) STD_SAVE_RAW(stream,ks,x)
172 #define STD_LOAD(stream,ks,x) STD_LOAD_RAW(stream,ks,x)
180 struct v3_keyed_stream_hooks {
181 // url is meaningful only to the host implementation
182 v3_keyed_stream_t (*open)(char *url,
183 v3_keyed_stream_open_t open_type);
185 void (*close)(v3_keyed_stream_t stream);
187 void (*preallocate_hint_key)(v3_keyed_stream_t stream,
191 v3_keyed_stream_key_t (*open_key)(v3_keyed_stream_t stream,
194 void (*close_key)(v3_keyed_stream_t stream,
195 v3_keyed_stream_key_t key);
198 sint64_t (*write_key)(v3_keyed_stream_t stream,
199 v3_keyed_stream_key_t key,
205 sint64_t (*read_key)(v3_keyed_stream_t stream,
206 v3_keyed_stream_key_t key,
215 extern void V3_Init_Keyed_Streams(struct v3_keyed_stream_hooks *hooks);