flounder: moving receiving cap slots from a thread to a dispatcher
authorAdam Turowski <adam.turowski@inf.ethz.ch>
Tue, 26 Sep 2017 09:55:01 +0000 (11:55 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Tue, 26 Sep 2017 10:27:30 +0000 (12:27 +0200)
Signed-off-by: Adam Turowski <adam.turowski@inf.ethz.ch>

include/barrelfish/dispatcher.h
lib/barrelfish/include/threads_priv.h
lib/barrelfish/threads.c

index 8a5f34d..5a9679e 100644 (file)
@@ -25,6 +25,9 @@ struct ump_chan;
 struct deferred_event;
 struct notificator;
 
+/// Maximum number of buffered capability receive slots
+#define MAX_RECV_SLOTS   4
+
 // Architecture generic user only dispatcher struct
 struct dispatcher_generic {
     /// stack for traps and disabled pagefaults
@@ -92,6 +95,10 @@ struct dispatcher_generic {
     struct waitset_chanstate *polled_channels;
     
     struct notificator *notificators;
+
+    struct capref recv_slots[MAX_RECV_SLOTS];///< Queued cap recv slots
+    int8_t recv_slot_count;                 ///< number of currently queued recv slots
+
 };
 
 #endif // BARRELFISH_DISPATCHER_H
index afad998..80452b3 100644 (file)
@@ -16,9 +16,6 @@
 /// Maximum number of thread-local storage keys
 #define MAX_TLS         16
 
-/// Maximum number of buffered capability receive slots
-#define MAX_RECV_SLOTS   4
-
 /** \brief TLS dynamic thread vector data structure
  *
  * See: ELF handling for thread-local storage. Ulrich Drepper, Dec 2005.
@@ -84,8 +81,6 @@ struct thread {
     bool    rpc_in_progress;               ///< RPC in progress
     errval_t    async_error;                ///< RPC async error
     uint32_t    outgoing_token;             ///< Token of outgoing message
-    struct capref recv_slots[MAX_RECV_SLOTS];///< Queued cap recv slots
-    int8_t recv_slot_count;                 ///< number of currently queued recv slots
     struct waitset_chanstate *local_trigger; ///< Trigger for a local thread event
 };
 
index 5613b2f..1275a26 100644 (file)
@@ -701,25 +701,30 @@ errval_t thread_get_async_error(void)
  */
 void thread_store_recv_slot(struct capref recv_slot)
 {
-    struct thread *me = thread_self();
-    assert(me);
+    dispatcher_handle_t handle = disp_disable();
+    struct dispatcher_generic *disp_gen = get_dispatcher_generic(handle);
 
-    assert(me->recv_slot_count < MAX_RECV_SLOTS);
-    assert(me->recv_slot_count >= 0);
+    assert(disp_gen->recv_slot_count < MAX_RECV_SLOTS);
+    assert(disp_gen->recv_slot_count >= 0);
+    disp_gen->recv_slots[disp_gen->recv_slot_count++] = recv_slot;
 
-    me->recv_slots[me->recv_slot_count++] = recv_slot;
+    disp_enable(handle);
 }
 
 struct capref thread_get_next_recv_slot(void)
 {
-    struct thread *me = thread_self();
+    dispatcher_handle_t handle = disp_disable();
+    struct dispatcher_generic *disp_gen = get_dispatcher_generic(handle);
+    struct capref retcap;
 
     // HERE: recv_slot_count is > 0 if we have one+ caps stored
-    if (me->recv_slot_count <= 0) {
-        return NULL_CAP;
+    if (disp_gen->recv_slot_count <= 0) {
+        retcap = NULL_CAP;
+    } else {
+        retcap = disp_gen->recv_slots[--disp_gen->recv_slot_count];
     }
-
-    return me->recv_slots[--me->recv_slot_count];
+    disp_enable(handle);
+    return retcap;
 }
 
 void thread_set_status(int status) {