NJU-ProjectN/nemu eb63cf3568dbf4e0c3c6ef462e6ec685550fabbc Merge pull request #76 from rijuyuezhu/master
51 lines
1.5 KiB
C
51 lines
1.5 KiB
C
/***************************************************************************************
|
|
* Copyright (c) 2014-2022 Zihao Yu, Nanjing University
|
|
*
|
|
* NEMU is licensed under Mulan PSL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
* You may obtain a copy of Mulan PSL v2 at:
|
|
* http://license.coscl.org.cn/MulanPSL2
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
*
|
|
* See the Mulan PSL v2 for more details.
|
|
***************************************************************************************/
|
|
|
|
#include <common.h>
|
|
#include <device/alarm.h>
|
|
#include <sys/time.h>
|
|
#include <signal.h>
|
|
|
|
#define MAX_HANDLER 8
|
|
|
|
static alarm_handler_t handler[MAX_HANDLER] = {};
|
|
static int idx = 0;
|
|
|
|
void add_alarm_handle(alarm_handler_t h) {
|
|
assert(idx < MAX_HANDLER);
|
|
handler[idx ++] = h;
|
|
}
|
|
|
|
static void alarm_sig_handler(int signum) {
|
|
int i;
|
|
for (i = 0; i < idx; i ++) {
|
|
handler[i]();
|
|
}
|
|
}
|
|
|
|
void init_alarm() {
|
|
struct sigaction s;
|
|
memset(&s, 0, sizeof(s));
|
|
s.sa_handler = alarm_sig_handler;
|
|
int ret = sigaction(SIGVTALRM, &s, NULL);
|
|
Assert(ret == 0, "Can not set signal handler");
|
|
|
|
struct itimerval it = {};
|
|
it.it_value.tv_sec = 0;
|
|
it.it_value.tv_usec = 1000000 / TIMER_HZ;
|
|
it.it_interval = it.it_value;
|
|
ret = setitimer(ITIMER_VIRTUAL, &it, NULL);
|
|
Assert(ret == 0, "Can not set timer");
|
|
}
|