Removes the alarm_dispatcher
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Jun 2014 21:06:27 +0000 (14:06 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Jun 2014 21:06:27 +0000 (14:06 -0700)
Can just register multiple handlers: one for the global alarm service and
another for the per-vc alarm.

In the future, we'll probably get the full kernel alarm tchain code in
userspace, and each of the #A alarms (global, pvc) will be a separate tchain.

user/benchutil/alarm.c
user/benchutil/alarm_dispatch.c [deleted file]
user/benchutil/include/alarm_dispatch.h [deleted file]
user/benchutil/pvcalarm.c

index 753dd4d..3bbec75 100644 (file)
@@ -37,7 +37,6 @@
 #include <uthread.h>
 #include <spinlock.h>
 #include <timing.h>
-#include <alarm_dispatch.h>
 
 /* Helpers, basically renamed kernel interfaces, with the *tchain. */
 static void __tc_locked_set_alarm(struct timer_chain *tchain,
@@ -123,7 +122,7 @@ static void init_alarm_service(void)
        }
        /* Since we're doing SPAM_PUBLIC later, we actually don't need a big ev_q.
         * But someone might copy/paste this and change a flag. */
-       alarm_dispatch_register(alarmid, handle_user_alarm);
+       register_ev_handler(EV_ALARM, handle_user_alarm, 0);
        if (!(ev_q = get_big_event_q())) {
                perror("Useralarm: Failed ev_q");
                return;
diff --git a/user/benchutil/alarm_dispatch.c b/user/benchutil/alarm_dispatch.c
deleted file mode 100644 (file)
index 56e417c..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Copyright (c) 2013 The Regents of the University of California
- * Kevin Klues <klueska@cs.berkeley.edu>
- * See LICENSE for details. */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <ros/common.h>
-#include <arch/atomic.h>
-#include <spinlock.h>
-#include <alarm_dispatch.h>
-
-#define GROWTH_INC 10
-
-/* The dispatch data structure.  Holds an array of handlers indexed by an
- * alarmid.  The size of the array is initally 0 and grows in increments of
- * GROWTH_INC on demand when a larger alarmid is registering its handler. */
-struct {
-       struct spin_pdr_lock lock;
-       handle_event_t *handlers;
-       int length;
-} dispatch;
-
-/* Dispatch the alarm event to its proper handler */
-static void dispatch_alarm(struct event_msg *ev_msg, unsigned int ev_type,
-                           void *data)
-{
-       assert(ev_type == EV_ALARM);
-       if (ev_msg) {
-               // There is a slight race here if you don't disable the alarm before
-               // deregistering its handler.  Make sure you do this properly.
-               handle_event_t handler = dispatch.handlers[ev_msg->ev_arg2];
-               if (handler)
-                       handler(ev_msg, ev_type, data);
-       }
-}
-
-/* Initalize the alarm_dispatcher. This should only be called once. */
-static void init_alarm_dispatch()
-{
-       spin_pdr_init(&dispatch.lock);
-       dispatch.handlers = NULL;
-       dispatch.length = 0;
-       register_ev_handler(EV_ALARM, dispatch_alarm, 0);
-}
-
-/* Grow the handler array if necessary.  The array lock must be held when
- * calling this function. */
-static void __maybe_grow_handler_array(int index)
-{
-       if (dispatch.length <= index) {
-               int new_size = GROWTH_INC * (1 + index/GROWTH_INC);
-               dispatch.handlers = realloc(dispatch.handlers,
-                                           new_size * sizeof(handle_event_t));
-               for (int i=dispatch.length; i<new_size; i++)
-                       dispatch.handlers[i] = NULL;
-               dispatch.length = new_size;
-       }
-}
-
-/* Register an alarm handler for alarmid. Make sure the alarm is inactive
- * before calling this function. */
-void alarm_dispatch_register(int alarmid, handle_event_t handler)
-{
-       run_once(init_alarm_dispatch());
-
-       spin_pdr_lock(&dispatch.lock);
-       __maybe_grow_handler_array(alarmid);
-       dispatch.handlers[alarmid] = handler;
-       spin_pdr_unlock(&dispatch.lock);
-}
-
-/* Deregister an alarm handler for alarmid. Make sure the alarm is inactive
- * before calling this function. */
-void alarm_dispatch_deregister(int alarmid)
-{
-       spin_pdr_lock(&dispatch.lock);
-       if (alarmid < dispatch.length)
-               dispatch.handlers[alarmid] = NULL;
-       spin_pdr_unlock(&dispatch.lock);
-}
-
diff --git a/user/benchutil/include/alarm_dispatch.h b/user/benchutil/include/alarm_dispatch.h
deleted file mode 100644 (file)
index dcc7797..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Copyright (c) 2013 The Regents of the University of California
- * Kevin Klues <klueska@cs.berkeley.edu>
- * See LICENSE for details. */
-
-#ifndef _ALARM_DISPATCH_H
-#define _ALARM_DISPATCH_H
-
-#include <event.h>
-
-/* Register an alarm handler for alarmid. Make sure the alarm is inactive
- * before calling this function. */
-void alarm_dispatch_register(int alarmid, handle_event_t handler);
-/* Deregister an alarm handler for alarmid. Make sure the alarm is inactive
- * before calling this function. */
-void alarm_dispatch_deregister(int alarmid);
-
-#endif // _ALARM_DISPATCH_H
index 6acb89d..36ea2e7 100644 (file)
@@ -16,7 +16,6 @@
 #include <sys/queue.h>
 #include <fcntl.h>
 #include <pvcalarm.h>
-#include <alarm_dispatch.h>
 
 /* Different states for enabling/disabling the per-vcore alarms. */
 enum {
@@ -204,7 +203,7 @@ static void init_pvcalarm(struct pvcalarm_data *pvcalarm_data, int vcoreid)
                perror("Pvcalarm: Can't open timer");
                return;
        }
-       alarm_dispatch_register(alarmid, handle_pvcalarm);
+       register_ev_handler(EV_ALARM, handle_pvcalarm, 0);
        ev_flags = EVENT_IPI | EVENT_VCORE_PRIVATE;
        ev_q = get_event_q_vcpd(vcoreid, ev_flags);
        if (!ev_q) {
@@ -259,6 +258,9 @@ static inline void __vcore_postamble()
 static void handle_pvcalarm(struct event_msg *ev_msg, unsigned int ev_type,
                             void *data)
 {
+       struct pvcalarm_data *pvcalarm_data = &global_pvcalarm.data[vcore_id()];
+       if (!ev_msg || (ev_msg->ev_arg2 != pvcalarm_data->alarmid))
+               return;
        if (!__vcore_preamble()) return;
        global_pvcalarm.handler(ev_msg, ev_type, data);
        __vcore_postamble();