예제 #1
0
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();
}
예제 #2
0
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;
}
예제 #3
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();
    }
}
예제 #4
0
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;
}