void signal_itimer (IDTYPE target, void * arg) { master_lock(); if (real_itimer.timeout != (unsigned long) arg) { master_unlock(); return; } real_itimer.timeout += real_itimer.reset; real_itimer.reset = 0; master_unlock(); }
int shim_do_setitimer (int which, struct __kernel_itimerval * value, struct __kernel_itimerval * ovalue) { if (which != ITIMER_REAL) return -ENOSYS; if (!value) return -EFAULT; unsigned long setup_time = DkSystemTimeQuery(); unsigned long next_value = value->it_value.tv_sec * 1000000 + value->it_value.tv_usec; unsigned long next_reset = value->it_interval.tv_sec * 1000000 + value->it_interval.tv_usec; master_lock(); unsigned long current_timeout = real_itimer.timeout > setup_time ? real_itimer.timeout - setup_time : 0; unsigned long current_reset = real_itimer.reset; int ret = install_async_event(next_value, &signal_itimer, (void *) (setup_time + next_value)); if (ret < 0) { master_unlock(); return ret; } real_itimer.timeout = setup_time + next_value; real_itimer.reset = next_reset; master_unlock(); if (ovalue) { ovalue->it_interval.tv_sec = current_reset / 1000000; ovalue->it_interval.tv_usec = current_reset % 1000000; ovalue->it_value.tv_sec = current_timeout / 1000000; ovalue->it_value.tv_usec = current_timeout % 1000000; } return 0; }
static void ipc_broadcast_exit (struct shim_ipc_port * port, IDTYPE vmid, unsigned exitcode) { if (port == broadcast_port) { master_lock(); broadcast_port = NULL; put_ipc_port(port); master_unlock(); } }
int shim_do_getitimer (int which, struct __kernel_itimerval * value) { if (which != ITIMER_REAL) return -ENOSYS; if (!value) return -EFAULT; unsigned long setup_time = DkSystemTimeQuery(); master_lock(); unsigned long current_timeout = real_itimer.timeout > setup_time ? real_itimer.timeout - setup_time : 0; unsigned long current_reset = real_itimer.reset; master_unlock(); value->it_interval.tv_sec = current_reset / 1000000; value->it_interval.tv_usec = current_reset % 1000000; value->it_value.tv_sec = current_timeout / 1000000; value->it_value.tv_usec = current_timeout % 1000000; return 0; }