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
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
/// 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.
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
};
*/
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) {