static pwr_tStatus start ( ini_sContext *cp ) { pwr_tStatus sts; char console[80]; #if defined OS_POSIX int fd; if ( strcmp( cp->console, "") == 0) strcpy( console, "/dev/console"); else strcpy( console, cp->console); if ((fd = open(console, O_APPEND | O_WRONLY)) == -1) errl_Init(NULL, ini_errl_cb, cp); else { close(fd); errl_Init(console, ini_errl_cb, cp); } #else errl_Init("CONSOLE:", ini_errl_cb, cp); #endif errh_Init("pwr_ini", errh_eAnix_ini); if ( cp->flags.b.interactive) errh_Interactive(); mh_UtilCreateEvent(); ini_CheckContext(&sts, cp); ini_ReadBootFile(&sts, cp); ini_ReadNodeFile(&sts, cp); ini_CheckNode(&sts, cp); cp->me = tree_Find(&sts, cp->nid_t, &cp->node.nid); if (cp->me == NULL) { errh_LogFatal(&cp->log, "Cannot find my own node in %s\n", cp->nodefile.name); exit(QCOM__WEIRD); } if (!checkErrors(cp)) exit(0); if (cp->flags.b.verbose) logCardinality(cp); ini_CreateDb(&sts, cp); ini_LoadNode(&sts, cp); ini_BuildNode(&sts, cp); if (cp->np != NULL) { if (cp->np->ErrLogTerm[0] != '\0') { errh_LogInfo(&cp->log, "Setting log terminal to: %s", cp->np->ErrLogTerm); errl_SetTerm(cp->np->ErrLogTerm); } /* Logfile is always $pwrp_log/pwr.log from V4.0.0 and handled by Linux log rotation */ char fname[256]; sprintf(fname, "$pwrp_log/pwr_%s.log", cp->nodename); dcli_translate_filename(fname, fname); errl_SetFile(fname); errh_LogInfo(&cp->log, "Setting log file to: %s", fname); /* if (cp->np->ErrLogFile[0] != '\0') { struct tm *tp; char fname[256]; time_t t; time(&t); tp = localtime(&t); strftime(fname, sizeof(fname), cp->np->ErrLogFile, tp ); dcli_translate_filename( fname, fname); errl_SetFile(fname); errh_LogInfo(&cp->log, "Setting log file to: %s", cp->np->ErrLogFile); } */ } ini_SetSystemStatus( cp, PWR__STARTUP); errh_SetStatus( PWR__STARTUP); sts = ini_RcReadAndSet(cp->dir, cp->nodename, cp->busid); if (EVEN(sts)) errh_LogError(&cp->log, "ini_RcReadAndSet, %m", sts); sts = ini_SetAttribute(cp->aliasfile.name, cp->nodename, 0); if (EVEN(sts) && sts != INI__FILE) errh_LogError(&cp->log, "ini_SetAttribute, %m", sts); qini_BuildDb(&sts, cp->nid_t, cp->me, NULL, cp->busid); io_init_signals(); load_backup(); #if defined OS_ELN ker$initialization_done(NULL); #endif ini_ProcTable(&sts, cp); ini_ProcIter(&sts, cp, proc_mProcess_system, 0, ini_ProcLoad); ini_ProcIter(&sts, cp, proc_mProcess_system, 0, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_system, 0, ini_ProcPrio); net_Connect(&sts, &gdbroot->my_aid, &gdbroot->my_qid, NULL, "pwr_ini"); /*if (!qcom_Init(&sts, 0)) {*/ if (EVEN(sts)) { errh_LogFatal(&cp->log, "net_Connect, %m", sts); exit(sts); } qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_newPlcInit | ini_mEvent_newPlcStart); ini_ProcIter(&sts, cp, proc_mProcess_user, 0, ini_ProcLoad); ini_ProcIter(&sts, cp, proc_mProcess_user, 0, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_user, 0, ini_ProcPrio); qcom_CreateQ(&sts, &cp->eventQ, NULL, "iniEvent"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_CreateQ, %m", sts); exit(sts); } qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_newPlcStartDone | cp->plc_sigmask, qcom_cTmoEternal); sts = ini_SetAttributeAfterPlc(cp->aliasfile.name, cp->nodename, 0); if (EVEN(sts) && sts != INI__FILE) errh_LogError(&cp->log, "ini_SetAttributeAfterPlc, %m", sts); ini_SetSystemStatus( cp, PWR__RUNNING); errh_SetStatus( PWR__SRUN); return sts; }
static pwr_tStatus restart ( ini_sContext *cp ) { pwr_tStatus sts; char time[24]; lst_sEntry *pl; ini_sProc *pp; ini_CheckContext(&sts, cp); ini_ReadBootFile(&sts, cp); ini_CheckNode(&sts, cp); checkErrors(cp); if (cp->flags.b.verbose) logCardinality(cp); qcom_SignalAnd(&sts, &qcom_cQini, 0); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_swapInit); ini_ReloadNode(&sts, cp); if (cp->flags.b.verbose) logChanges(cp); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_rebuildInit); ini_RebuildNode(&sts, cp); ini_DecodeBodies(&sts, cp, 0); ini_DecodeBodies(&sts, cp, 1); if (cp->flags.b.verbose) errh_LogInfo(&cp->log, "Update bodies of io objects"); ini_UpdateBodies(&sts, cp, 1); io_init_signals(); ini_ProcTable(&sts, cp); // ini_ProcLoad(&sts, cp, cp->plc); // ini_ProcStart(&sts, cp, cp->plc); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_mProc_plc, ini_ProcLoad); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_mProc_plc, ini_ProcStart); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_newPlcInit); qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_newPlcInitDone | cp->plc_sigmask, qcom_cTmoEternal); errh_LogInfo(&cp->log, "Entering time critical period, stopping old PLC"); qcom_SignalAnd(&sts, &qcom_cQini, ~cp->plc_sigmask); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_oldPlcStop); qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_oldPlcStopDone | cp->plc_sigmask, qcom_cTmoEternal); qcom_SignalAnd(&sts, &qcom_cQini, ~ini_mEvent_oldPlcStop); ini_UpdateBodies(&sts, cp, 0); qcom_SignalAnd(&sts, &qcom_cQini, ~cp->plc_sigmask); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_newPlcStart); qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_newPlcStartDone | cp->plc_sigmask, qcom_cTmoEternal); errh_LogInfo(&cp->log, "Time critical period over, new PLC is running"); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_swapDone); for (pp = lst_Succ(NULL, &cp->proc_lh, &pl); pp != NULL; pp = lst_Succ(NULL, pl, &pl)) { if ( pp->flags.m & ini_mProc_plc && pp->objectp) { pwr_sClass_PlcProcess *plc = pp->objectp; time_GetTime(&plc->LastChgTime); if ( time_Dcomp(&plc->StartTime, &plc->StopTime) == 1) time_Dsub(&plc->StallTime, &plc->StartTime, &plc->StopTime); else plc->StallTime = pwr_cNDeltaTime; time_DtoAscii(&plc->StallTime, 1, time, sizeof(time)); cp->np->RestartStallTime = plc->StallTime; } } cp->log.put.type.s = 2; errh_LogInfo(&cp->log, "IO stall time: %s", time); ini_FreeBodies(&sts, cp, 0); ini_FreeBodies(&sts, cp, 1); return sts; }
static pwr_tStatus start( ini_sContext *cp) { pwr_tStatus sts; char console[80]; qini_sNode *nep; qcom_sAid aid; int fd; if ( strcmp( cp->console, "") == 0) strcpy( console, "/dev/console"); else strcpy( console, cp->console); if ((fd = open(console, O_APPEND | O_WRONLY)) == -1) errl_Init(NULL, ini_errl_cb, cp); else { close(fd); errl_Init(console, ini_errl_cb, cp); } errh_Init("pwr_ini", errh_eAnix_ini); if ( cp->flags.b.interactive) errh_Interactive(); ini_CheckContext(&sts, cp); ini_ReadBootFile(&sts, cp); ini_ReadNodeFile(&sts, cp); for (nep = tree_Minimum(&sts, cp->nid_t); nep != NULL; nep = tree_Successor(&sts, cp->nid_t, nep)) { if ( strcmp( cp->nodename, nep->name) == 0) { cp->me = nep; break; } } if (cp->me == NULL) { errh_LogFatal(&cp->log, "Cannot find my own node in %s\n", cp->nodefile.name); exit(QCOM__WEIRD); } if (!checkErrors(cp)) exit(0); /* Logfile is always $pwrp_log/pwr.log from V4.0.0 and handled by Linux log rotation */ char fname[256]; sprintf(fname, "$pwrp_log/pwr_%s.log", cp->nodename); dcli_translate_filename(fname, fname); errl_SetFile(fname); errh_LogInfo(&cp->log, "Setting log file to: %s", fname); // ini_SetSystemStatus( cp, PWR__STARTUP); errh_SetStatus( PWR__STARTUP); qini_BuildDb(&sts, cp->nid_t, cp->me, NULL, cp->busid); ini_ProcTable(&sts, cp); ini_ProcIter(&sts, cp, proc_mProcess_system, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_system, ini_ProcPrio); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_ProcPrio); qcom_Init(&sts, &aid, "pwr_sev_init"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_Init, %m", sts); exit(sts); } qcom_CreateQ(&sts, &cp->eventQ, NULL, "iniEvent"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_CreateQ, %m", sts); exit(sts); } // ini_SetSystemStatus( cp, PWR__RUNNING); errh_SetStatus( PWR__SRUN); return sts; }