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 ); } }
/*** * * @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; }