devif: destroy no longer queue specific
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 28 Aug 2017 13:11:07 +0000 (15:11 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 28 Aug 2017 13:11:07 +0000 (15:11 +0200)
To avoid having to know what the queue represents after
having used it, the destroy functionality has to go into
the queue interface. Otherwise, we still have to know
what the queue represents at creation and destruction
time, which does not make sense for destruction since
in between most likely we do not know what exact queue
this is.

Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

include/devif/queue_interface.h
lib/devif/queue_interface.c
lib/devif/queue_interface_internal.c
lib/devif/queue_interface_internal.h

index 25f332d..aee5018 100644 (file)
@@ -159,6 +159,17 @@ errval_t devq_control(struct devq *q,
                       uint64_t value,
                       uint64_t *result);
 
+
+ /**
+  * @brief destroys the device queue
+  *
+  * @param q           The queue state to free (and the device queue to be 
+                       shut down)
+  *
+  * @returns error on failure or SYS_ERR_OK on success
+  */
+errval_t devq_destroy(struct devq *q);
+
 void devq_set_state(struct devq *q, void *state);
 void * devq_get_state(struct devq *q);
 
index 01646f9..e0ed19e 100644 (file)
@@ -238,6 +238,27 @@ errval_t devq_control(struct devq *q,
 
 }
 
+ /**
+  * @brief destroys the device queue
+  *
+  * @param q           The queue state to free (and the device queue to be 
+                       shut down)
+  *
+  * @returns error on failure or SYS_ERR_OK on success
+  */
+errval_t devq_destroy(struct devq *q)
+{
+    errval_t err;
+
+    err = region_pool_destroy(q->pool);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
+    return q->f.destroy(q);
+}
+
+
 void devq_set_state(struct devq *q, void *state)
 {
     q->state = state;
index 021f74f..c5e81fa 100644 (file)
@@ -39,25 +39,6 @@ errval_t devq_init(struct devq *q, bool exp)
     return err;
 }
 
-
- /**
-  * @brief destroys the device queue
-  *
-  * @param q           The queue state to free (and the device queue to be 
-                       shut down in the driver)
-  *
-  * @returns error on failure or SYS_ERR_OK on success
-  */
-errval_t devq_destroy(struct devq *q)
-{
-    errval_t err;
-
-    err = region_pool_destroy(q->pool);
-
-    return err;
-}
-
-
 errval_t devq_add_region(struct devq* q, struct capref cap,
                          regionid_t rid)
 {
index 83c70e2..a2bec08 100644 (file)
@@ -18,7 +18,7 @@ struct devq;
  * Backend function definitions
  * ===========================================================================
  */
-// Creation and Destruction of queues is device specific
+// Creation of queues is device specific
 
  /**
   * @brief Notifies the device of new descriptors in the queue.
@@ -118,8 +118,18 @@ typedef errval_t (*devq_dequeue_t)(struct devq *q, regionid_t* region_id,
                                    genoffset_t* valid_length,
                                    uint64_t* misc_flags);
 
+ /**
+  * @brief Destroys the queue give as an argument, first the state of the 
+  *        library, then the queue specific part by calling a function pointer
+  *
+  * @param q         The device queue
+  *
+  * @returns error on failure or SYS_ERR_OK on success
+  */
+typedef errval_t (*devq_destroy_t) (struct devq *q);
 
-// The functions that the device driver has to export
+
+// The functions that the backend has to set
 struct devq_func_pointer {
     devq_register_t reg;
     devq_deregister_t dereg;
@@ -127,6 +137,7 @@ struct devq_func_pointer {
     devq_notify_t notify;
     devq_enqueue_t enq;
     devq_dequeue_t deq;
+    devq_destroy_t destroy;
 };
 
 struct devq {
@@ -145,9 +156,7 @@ struct devq {
     void *state;
 };
 
-
 errval_t devq_init(struct devq *q, bool exp);
-errval_t devq_destroy(struct devq *q);
 
 errval_t devq_add_region(struct devq*, struct capref cap,
                          regionid_t rid);