char *nodename;
char *backend;
- xenbus_event_queue events;
+ struct xenbus_event_queue events;
};
#define MINIOS_XENBUS_H__
#include <xen/io/xenbus.h>
+#include <mini-os/queue.h>
typedef unsigned long xenbus_transaction_t;
#define XBT_NIL ((xenbus_transaction_t)0)
/* Keep these two as this for xs.c */
char *path;
char *token;
- struct xenbus_event *next;
+ MINIOS_STAILQ_ENTRY(xenbus_event) entry;
};
-typedef struct xenbus_event *xenbus_event_queue;
+struct xenbus_event_queue {
+ MINIOS_STAILQ_HEAD(, xenbus_event) events;
+};
+
+void xenbus_event_queue_init(struct xenbus_event_queue *queue);
-char *xenbus_watch_path_token(xenbus_transaction_t xbt, const char *path, const char *token, xenbus_event_queue *events);
+char *xenbus_watch_path_token(xenbus_transaction_t xbt, const char *path, const char *token, struct xenbus_event_queue *events);
char *xenbus_unwatch_path_token(xenbus_transaction_t xbt, const char *path, const char *token);
-extern struct wait_queue_head xenbus_watch_queue;
-void xenbus_wait_for_watch(xenbus_event_queue *queue);
-char **xenbus_wait_for_watch_return(xenbus_event_queue *queue);
-char* xenbus_wait_for_value(const char *path, const char *value, xenbus_event_queue *queue);
-char *xenbus_wait_for_state_change(const char* path, XenbusState *state, xenbus_event_queue *queue);
+void xenbus_wait_for_watch(struct xenbus_event_queue *queue);
+char **xenbus_wait_for_watch_return(struct xenbus_event_queue *queue);
+char* xenbus_wait_for_value(const char *path, const char *value, struct xenbus_event_queue *queue);
+char *xenbus_wait_for_state_change(const char* path, XenbusState *state, struct xenbus_event_queue *queue);
char *xenbus_switch_state(xenbus_transaction_t xbt, const char* path, XenbusState state);
/* When no token is provided, use a global queue. */
#define XENBUS_WATCH_PATH_TOKEN "xenbus_watch_path"
-extern xenbus_event_queue xenbus_events;
+extern struct xenbus_event_queue xenbus_events;
#define xenbus_watch_path(xbt, path) xenbus_watch_path_token(xbt, path, XENBUS_WATCH_PATH_TOKEN, NULL)
#define xenbus_unwatch_path(xbt, path) xenbus_unwatch_path_token(xbt, path, XENBUS_WATCH_PATH_TOKEN)
char *backend;
struct blkfront_info info;
- xenbus_event_queue events;
+ struct xenbus_event_queue events;
};
dev->ring_ref = gnttab_grant_access(dev->dom,virt_to_mfn(s),0);
- dev->events = NULL;
+ xenbus_event_queue_init(&dev->events);
again:
err = xenbus_transaction_start(&xbt);
memset(dev->ring, 0, PAGE_SIZE);
dev->ring_ref = gnttab_grant_access(dev->dom, virt_to_mfn(dev->ring), 0);
- dev->events = NULL;
+ xenbus_event_queue_init(&dev->events);
again:
err = xenbus_transaction_start(&xbt);
char *backend;
char *mac;
- xenbus_event_queue events;
+ struct xenbus_event_queue events;
void (*netif_rx)(struct netfront_dev *, unsigned char* data, int len);
dev->netif_rx = thenetif_rx;
- dev->events = NULL;
+ xenbus_event_queue_init(&dev->events);
again:
err = xenbus_transaction_start(&xbt);
char *nodename;
char *backend;
- xenbus_event_queue events;
+ struct xenbus_event_queue events;
};
void pcifront_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
char* nodename = opaque ? opaque : "device/pci/0";
char path[strlen(nodename) + 9];
char fe_state[strlen(nodename) + 7];
- xenbus_event_queue events = NULL;
+ struct xenbus_event_queue events;
+ xenbus_event_queue_init(&events);
snprintf(path, sizeof(path), "%s/backend", nodename);
snprintf(fe_state, sizeof(fe_state), "%s/state", nodename);
dev->info_ref = gnttab_grant_access(dev->dom,virt_to_mfn(dev->info),0);
- dev->events = NULL;
+ xenbus_event_queue_init(&dev->events);
again:
err = xenbus_transaction_start(&xbt);
static spinlock_t xb_lock = SPIN_LOCK_UNLOCKED; /* protects xenbus req ring */
DECLARE_WAIT_QUEUE_HEAD(xenbus_watch_queue);
-xenbus_event_queue xenbus_events;
+struct xenbus_event_queue xenbus_events;
static struct watch {
char *token;
- xenbus_event_queue *events;
+ struct xenbus_event_queue *events;
struct watch *next;
} *watches;
struct xenbus_req_info
void *reply;
};
+
+void xenbus_event_queue_init(struct xenbus_event_queue *queue)
+{
+ MINIOS_STAILQ_INIT(&queue->events);
+}
+
+
#define NR_REQS 32
static struct xenbus_req_info req_info[NR_REQS];
memcpy(dest + c1, ring, c2);
}
-char **xenbus_wait_for_watch_return(xenbus_event_queue *queue)
+char **xenbus_wait_for_watch_return(struct xenbus_event_queue *queue)
{
struct xenbus_event *event;
DEFINE_WAIT(w);
if (!queue)
queue = &xenbus_events;
- while (!(event = *queue)) {
+ while (!(event = MINIOS_STAILQ_FIRST(&queue->events))) {
add_waiter(w, xenbus_watch_queue);
schedule();
}
remove_waiter(w, xenbus_watch_queue);
- *queue = event->next;
+ MINIOS_STAILQ_REMOVE_HEAD(&queue->events, entry);
return &event->path;
}
-void xenbus_wait_for_watch(xenbus_event_queue *queue)
+void xenbus_wait_for_watch(struct xenbus_event_queue *queue)
{
char **ret;
if (!queue)
printk("unexpected path returned by watch\n");
}
-char* xenbus_wait_for_value(const char* path, const char* value, xenbus_event_queue *queue)
+char* xenbus_wait_for_value(const char* path, const char* value, struct xenbus_event_queue *queue)
{
if (!queue)
queue = &xenbus_events;
return msg;
}
-char *xenbus_wait_for_state_change(const char* path, XenbusState *state, xenbus_event_queue *queue)
+char *xenbus_wait_for_state_change(const char* path, XenbusState *state, struct xenbus_event_queue *queue)
{
if (!queue)
queue = &xenbus_events;
if(msg.type == XS_WATCH_EVENT)
{
struct xenbus_event *event = malloc(sizeof(*event) + msg.len);
- xenbus_event_queue *events = NULL;
+ struct xenbus_event_queue *events = NULL;
char *data = (char*)event + sizeof(*event);
struct watch *watch;
}
if (events) {
- event->next = *events;
- *events = event;
+ MINIOS_STAILQ_INSERT_TAIL(&events->events, event, entry);
wake_up(&xenbus_watch_queue);
} else {
printk("unexpected watch token %s\n", event->token);
{
int err;
DEBUG("init_xenbus called.\n");
+ xenbus_event_queue_init(&xenbus_events);
xenstore_buf = mfn_to_virt(start_info.store_mfn);
create_thread("xenstore", xenbus_thread_func, NULL);
DEBUG("buf at %p.\n", xenstore_buf);
return NULL;
}
-char* xenbus_watch_path_token( xenbus_transaction_t xbt, const char *path, const char *token, xenbus_event_queue *events)
+char* xenbus_watch_path_token( xenbus_transaction_t xbt, const char *path, const char *token, struct xenbus_event_queue *events)
{
struct xsd_sockmsg *rep;