minios: free fbfront resources on error/shutdown
Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
diff -r b0d7780794eb extras/mini-os/fbfront.c
--- a/extras/mini-os/fbfront.c Thu May 08 13:40:40 2008 +0100
+++ b/extras/mini-os/fbfront.c Mon May 12 12:10:30 2008 +0200
@@ -47,6 +47,20 @@
files[fd].read = 1;
#endif
wake_up(&kbdfront_queue);
+}
+
+static void free_kbdfront(struct kbdfront_dev *dev)
+{
+ mask_evtchn(dev->evtchn);
+
+ free(dev->backend);
+
+ free_page(dev->page);
+
+ unbind_evtchn(dev->evtchn);
+
+ free(dev->nodename);
+ free(dev);
}
struct kbdfront_dev *init_kbdfront(char *nodename, int abs_pointer)
@@ -122,7 +136,7 @@
abort_transaction:
xenbus_transaction_end(xbt, 1, &retry);
- return NULL;
+ goto error;
done:
@@ -130,7 +144,7 @@
msg = xenbus_read(XBT_NIL, path, &dev->backend);
if (msg) {
printk("Error %s when reading the backend path %s\n", msg, path);
- return NULL;
+ goto error;
}
printk("backend at %s\n", dev->backend);
@@ -153,6 +167,9 @@
printk("************************** KBDFRONT\n");
return dev;
+error:
+ free_kbdfront(dev);
+ return NULL;
}
int kbdfront_receive(struct kbdfront_dev *dev, union xenkbd_in_event *buf, int
n)
@@ -208,12 +225,7 @@
xenbus_unwatch_path(XBT_NIL, path);
- unbind_evtchn(dev->evtchn);
-
- free_pages(dev->page,0);
- free(nodename);
- free(dev->backend);
- free(dev);
+ free_kbdfront(dev);
}
#ifdef HAVE_LIBC
@@ -260,6 +272,20 @@
void fbfront_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
{
wake_up(&fbfront_queue);
+}
+
+static void free_fbfront(struct fbfront_dev *dev)
+{
+ mask_evtchn(dev->evtchn);
+
+ free(dev->backend);
+
+ free_page(dev->page);
+
+ unbind_evtchn(dev->evtchn);
+
+ free(dev->nodename);
+ free(dev);
}
struct fbfront_dev *init_fbfront(char *nodename, unsigned long *mfns, int
width, int height, int depth, int stride, int n)
@@ -357,7 +383,7 @@
abort_transaction:
xenbus_transaction_end(xbt, 1, &retry);
- return NULL;
+ goto error;
done:
@@ -365,7 +391,7 @@
msg = xenbus_read(XBT_NIL, path, &dev->backend);
if (msg) {
printk("Error %s when reading the backend path %s\n", msg, path);
- return NULL;
+ goto error;
}
printk("backend at %s\n", dev->backend);
@@ -391,6 +417,10 @@
printk("************************** FBFRONT\n");
return dev;
+
+error:
+ free_fbfront(dev);
+ return NULL;
}
static void fbfront_out_event(struct fbfront_dev *dev, union xenfb_out_event
*event)
@@ -477,7 +507,7 @@
unbind_evtchn(dev->evtchn);
- free_pages(dev->page,0);
+ free_page(dev->page);
free(nodename);
free(dev->backend);
free(dev);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|