Beispiel #1
0
void active_protocol_c::save_config(bool wait)
{
    if (!ipcp) return;
    ts::Time t = ts::Time::current();

    auto w = syncdata.lock_write();
    if (w().flags.is(F_CONFIG_OK))
        if ((t - lastconfig) < 1000) return;

    w().flags.clear(F_CONFIG_OK|F_CONFIG_FAIL|F_SAVE_REQUEST|F_CONFIG_UPDATED);
    w().data.config.clear();
    w.unlock();

    if (!ipcp) return;
    ipcp->send( ipcw(AQ_SAVE_CONFIG) );
    DMSG("save request" << id);

    if (wait)
    {
        Sleep(10);
        while( !syncdata.lock_read()().flags.is(F_CONFIG_OK|F_CONFIG_FAIL) )
        {
            Sleep(10);
            sys_idle();
            if (!syncdata.lock_read()().flags.is(F_WORKER))
                return;
        }
        check_save(RID(),nullptr);

    } else
    {
        syncdata.lock_write()().flags.set(F_CFGSAVE_CHECKER);
        DEFERRED_UNIQUE_CALL( 0, DELEGATE(this,check_save), nullptr );
    }
}
Beispiel #2
0
/***
 *
 * @TODO Could be handled by a lowlevel lookup-table, but this is probably a bit more readable
 *
 * Calling paramters:
 *   param 1 : EBX
 *   param 2 : ECX
 *   param 3 : EDX
 *   param 4 : ESI
 *   param 5 : EDI
 *   param 6 : time for using a structure instead of so many parameters...
 *
 *  This parameter list is defined in the create_syscall_entryX macro's (service.h)
 *
 */
int service_interrupt (regs_t *r) {
    int retval = 0;
    int service = (r->eax & 0x0000FFFF);

    switch (service) {
    default        :
    case  SYS_NULL :
        retval = sys_null ();
        break;
    case  SYS_CONSOLE :
        retval = sys_console (r->ebx, (console_t *)r->ecx, (char *)r->edx);
        break;
    case  SYS_CONWRITE :
        retval = sys_conwrite ((char)r->ebx, r->ecx);
        break;
    case  SYS_CONFLUSH :
        retval = sys_conflush ();
        break;
    case  SYS_FORK :
        retval = sys_fork (r);
        break;
    case  SYS_GETPID :
        retval = sys_getpid ();
        break;
    case  SYS_GETPPID :
        retval = sys_getppid ();
        break;
    case  SYS_SLEEP :
        retval = sys_sleep (r->ebx);
        break;
    case  SYS_IDLE :
        retval = sys_idle ();
        break;
    case  SYS_EXIT :
        retval = sys_exit (r->ebx);
        break;
    case  SYS_EXECVE :
        retval = sys_execve (r, (char *)r->ebx, (char **)r->ecx, (char **)r->edx);
        break;
    }
    return retval;
}