Commit d1b69caf authored by Claes Sjofors's avatar Claes Sjofors

Plc, several plc processes with possibility to set affinity, and plc version removed

parent 6951f26f
......@@ -52,6 +52,7 @@
#include "co_tree.h"
#include "co_time.h"
#include "co_errno.h"
#include "co_dcli.h"
#include "rt_gdh.h"
#include "rt_qcom.h"
#include "rt_io_base.h"
......@@ -860,8 +861,8 @@ ini_CheckContext (
cp->nodefile.logOpenFail = errh_LogFatal;
// cdh_ToLower(cp->plcfile.name, cp->plcfile.name);
cp->plcfile.errcount = NULL;
cp->plcfile.logOpenFail = errh_LogInfo;
// cp->plcfile.errcount = NULL;
// cp->plcfile.logOpenFail = errh_LogInfo;
return cp;
}
......@@ -1053,13 +1054,12 @@ ini_ReadBootFile (
{
char day[80];
char time[80];
char buffer[256];
char buffer[1000];
char *s;
int i;
int n;
int nvol;
char plcname[256];
char vname[80];
char vids[80];
pwr_tVolumeId vid;
......@@ -1104,49 +1104,52 @@ ini_ReadBootFile (
cp->group[0] = '\0';
n = sscanf(s, "%s", cp->group);
break;
case 3: { /* Find PLC version. */
char *t;
case 3: { /* Find PLC programs. */
char prog_array[50][80];
int progs;
int j;
i++;
n = sscanf(s, "%s %s", plcname, vids);
if (n < 2) {
errh_LogError(&cp->log, "Bootfile corrupt, error in plc data");
cp->errors++;
if (!cp->flags.b.plcfile) {
if ( *s == '-') {
/* No plc programs */
cp->plcfile = 0;
continue;
}
t = strrchr( plcname, '_');
n = sscanf(t+1, "%d", &cp->node.plcVersion);
if (n < 1) {
if ( s[strlen(s)-1] == '\n')
s[strlen(s)-1] = 0;
progs = dcli_parse( s, ",", "",
(char *) prog_array, sizeof( prog_array)/sizeof( prog_array[0]),
sizeof( prog_array[0]), 0);
if ( progs < 1) {
errh_LogError(&cp->log, "Bootfile corrupt, error in plc data");
cp->errors++;
cp->plcfile = 0;
continue;
}
if (!cp->flags.b.plcfile) {
cp->plcfile = (ini_sFile *) calloc( progs, sizeof(ini_sFile));
cp->plcfile_cnt = progs;
for ( j = 0; j < progs; j++) {
#if defined OS_POSIX
sprintf(cp->plcfile.name, dbs_cNamePlc, "", cdh_Low(cp->nodename), cp->busid, cp->node.plcVersion);
snprintf(cp->plcfile[j].name, sizeof(cp->plcfile[0].name), "%s", prog_array[j]);
#elif defined OS_VMS
sprintf(cp->plcfile.name, dbs_cNamePlc, "pwrp_exe:", cdh_Low(cp->nodename), cp->busid, cp->node.plcVersion);
snprintf(cp->plcfile[j].name, sizeof(cp->plcfile[0].name), "%s%s", "pwrp_exe:", prog_array[j]);
#else
sprintf(cp->plcfile.name, dbs_cNamePlc, cp->dir, cdhLow(cp->nodename), cp->busid, cp->node.plcVersion);
snprintf(cp->plcfile[j].name, sizeof(cp->plcfile[0].name), "%s%s", cp->dir, prog_array[j]);
#endif
errh_LogInfo(&cp->log, "This node vill run PLC file: %s", cp->plcfile[j].name);
cp->plcfile[j].logOpenFail = errh_LogInfo;
}
#if 0
char tempname[256];
#if defined OS_POSIX
/* The path should be defined by the PATH variable
* We want short path names because LYNX's ps command only
* displays the first 31 characters of the file name.
*/
sprintf(cp->plcfile.name, "%s", tempname);
#else
sprintf(cp->plcfile.name, "%s%s", cp->hostspec, tempname);
#endif
#endif
// cdh_ToLower(cp->plcfile.name, cp->plcfile.name);
errh_LogInfo(&cp->log, "This node vill run PLC file: %s", cp->plcfile.name);
}
break;
}
case 4: /* Find root volume. */
......@@ -1866,7 +1869,8 @@ ini_ProcInsert (
char *file,
int prio,
int debug,
char *arg
char *arg,
void *objectp
)
{
ini_sProc *pp;
......@@ -1913,6 +1917,7 @@ ini_ProcInsert (
}
if (prio != -1) pp->proc.p_prio = prio;
if (debug != -1) pp->proc.flags.b.debug = debug != 0;
pp->objectp = objectp;
if (!lst_IsLinked(NULL, &pp->proc_ll)) {
lst_InsertPred(NULL, &cp->proc_lh, &pp->proc_ll, pp);
}
......@@ -2004,6 +2009,7 @@ ini_ProcIter (
pwr_tStatus *status,
ini_sContext *cp,
int mask,
int pmask,
void (*func)(pwr_tStatus*, ini_sContext*, ini_sProc*)
)
{
......@@ -2013,9 +2019,11 @@ ini_ProcIter (
pwr_dStatus(sts, status, INI__SUCCESS);
for (pp = lst_Succ(NULL, &cp->proc_lh, &pl); pp != NULL; pp = lst_Succ(NULL, pl, &pl)) {
if (pp->proc.flags.m & mask)
if (pp->proc.flags.m & mask) {
if ( !pmask || (pp->flags.m & pmask))
func(sts, cp, pp);
}
}
}
void
......@@ -2030,108 +2038,135 @@ ini_ProcTable (
ini_sProc *pp;
char *s;
char buffer[256];
pwr_tStatus lsts;
pwr_dStatus(sts, status, INI__SUCCESS);
pp = ini_ProcInsert(sts, cp, "pwr_neth", "pwr_neth_%d", 0, 1, "rt_neth", cPrio_neth, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_neth", "pwr_neth_%d", 0, 1, "rt_neth", cPrio_neth, 0, "", 0);
pp->flags.b.neth = 1;
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_qmon", "pwr_qmon_%d", 0, 1, "rt_qmon", cPrio_qmon, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_qmon", "pwr_qmon_%d", 0, 1, "rt_qmon", cPrio_qmon, 0, "", 0);
pp->flags.b.qmon = 1;
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_nacp", "pwr_nacp_%d", 0, 1, "rt_neth_acp", cPrio_neth_acp, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_nacp", "pwr_nacp_%d", 0, 1, "rt_neth_acp", cPrio_neth_acp, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_io", "pwr_io_%d", 0, 1, "rt_io_comm", cPrio_io_comm, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_io", "pwr_io_%d", 0, 1, "rt_io_comm", cPrio_io_comm, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_tmon", "pwr_tmon_%d", 0, 1, "rt_tmon", cPrio_tmon, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_tmon", "pwr_tmon_%d", 0, 1, "rt_tmon", cPrio_tmon, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_emon", "pwr_emon_%d", 0, 1, "rt_emon", cPrio_emon, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_emon", "pwr_emon_%d", 0, 1, "rt_emon", cPrio_emon, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_alim", "pwr_alim_%d", 0, 1, "rt_alimserver", cPrio_alimserver, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_alim", "pwr_alim_%d", 0, 1, "rt_alimserver", cPrio_alimserver, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_bck", "pwr_bck_%d", 0, 1, "rt_bck", cPrio_bck, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_bck", "pwr_bck_%d", 0, 1, "rt_bck", cPrio_bck, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_linksup", "pwr_linksup_%d", 0, 1, "rt_linksup", cPrio_linksup, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_linksup", "pwr_linksup_%d", 0, 1, "rt_linksup", cPrio_linksup, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_trend", "pwr_trend_%d", 0, 1, "rt_trend", cPrio_trend, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_trend", "pwr_trend_%d", 0, 1, "rt_trend", cPrio_trend, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_fast", "pwr_fast_%d", 0, 1, "rt_fast", cPrio_fast, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_fast", "pwr_fast_%d", 0, 1, "rt_fast", cPrio_fast, 0, "", 0);
pp->proc.flags.b.system = 1;
#if defined OS_POSIX
pp = ini_ProcInsert(sts, cp, "pwr_remh", "pwr_remh_%d", 0, 1, "rs_remotehandler", cPrio_remh, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_remh", "pwr_remh_%d", 0, 1, "rs_remotehandler", cPrio_remh, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_remlog", "pwr_remlog_%d", 0, 1, "rs_remote_logg", cPrio_remotelogg, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_remlog", "pwr_remlog_%d", 0, 1, "rs_remote_logg", cPrio_remotelogg, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_elog", "pwr_elog_%d", 0, 1, "rt_elog", cPrio_elog, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_elog", "pwr_elog_%d", 0, 1, "rt_elog", cPrio_elog, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_sysmon", "pwr_sysmon_%d", 0, 1, "rt_sysmon", cPrio_sysmon, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_sysmon", "pwr_sysmon_%d", 0, 1, "rt_sysmon", cPrio_sysmon, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_webmon", "pwr_webmon_%d", 0, 1, "rt_webmon.sh", cPrio_webmon, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_webmon", "pwr_webmon_%d", 0, 1, "rt_webmon.sh", cPrio_webmon, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_webmonmh", "pwr_webmonmh_%d", 0, 1, "rt_webmonmh.sh", cPrio_webmonmh, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_webmonmh", "pwr_webmonmh_%d", 0, 1, "rt_webmonmh.sh", cPrio_webmonmh, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_webmonelog", "pwr_webmonelog_%d", 0, 1, "rt_webmonelog.sh", cPrio_webmonelog, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_webmonelog", "pwr_webmonelog_%d", 0, 1, "rt_webmonelog.sh", cPrio_webmonelog, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_opc_server", "pwr_opc_server_%d", 0, 1, "opc_server", cPrio_opc_server, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_opc_server", "pwr_opc_server_%d", 0, 1, "opc_server", cPrio_opc_server, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_statussrv", "pwr_statussrv_%d", 0, 1, "rt_statussrv", cPrio_statussrv, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_statussrv", "pwr_statussrv_%d", 0, 1, "rt_statussrv", cPrio_statussrv, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_post", "pwr_post_%d", 0, 1, "rt_post", cPrio_post, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_post", "pwr_post_%d", 0, 1, "rt_post", cPrio_post, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_report", "pwr_report_%d", 0, 1, "rt_report", cPrio_report, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_report", "pwr_report_%d", 0, 1, "rt_report", cPrio_report, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_sevhistmon", "pwr_sevhistmon_%d", 0, 1, "rt_sevhistmon", cPrio_sevhistmon, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_sevhistmon", "pwr_sevhistmon_%d", 0, 1, "rt_sevhistmon", cPrio_sevhistmon, 0, "", 0);
pp->proc.flags.b.system = 1;
pp = ini_ProcInsert(sts, cp, "pwr_sev_server", "pwr_sev_server_%d", 0, 1, "sev_server", cPrio_sev_server, 0, "");
pp = ini_ProcInsert(sts, cp, "pwr_sev_server", "pwr_sev_server_%d", 0, 1, "sev_server", cPrio_sev_server, 0, "", 0);
pp->proc.flags.b.system = 1;
#endif
do {
for ( lsts = gdh_GetClassList(pwr_cClass_PlcProcess, &oid);
ODD(lsts);
lsts = gdh_GetNextObject( oid, &oid)) {
pwr_sClass_PlcProcess *plc;
pwr_tObjid oid;
char p_name[40];
pwr_tObjName ppname;
pwr_tObjName name;
char p_name[80];
int i;
char busidstr[10];
int found;
char idstr[80];
*sts = gdh_GetClassList(pwr_cClass_PlcProcess, &oid);
if (EVEN(*sts)) {
errh_LogError(&cp->log, "Found no PlcProcess-object\n%m", sts);
break;
}
*sts = gdh_ObjidToName(oid, ppname, sizeof(ppname), cdh_mName_object);
if (EVEN(*sts)) break;
*sts = gdh_ObjidToPointer(oid, (void *)&plc);
if (EVEN(*sts)) break;
cp->PlcProcess = plc;
sprintf(p_name, "pwr_plc_%%d_%d", plc->ChgCount++ % 10);
pp = ini_ProcInsert(sts, cp, "pwr_plc", p_name, 1, 1, cp->plcfile.name, cPrio_plc_init, plc->StartWithDebug, "");
sprintf( busidstr, "_%04d_", cp->busid);
found = 0;
for ( i = 0; i < cp->plcfile_cnt; i++) {
s = strstr( cp->plcfile[i].name, busidstr);
if ( s) {
strncpy( name, s + 6, sizeof(name));
if ( (s = strchr( name, '.')))
*s = 0;
if ( cdh_NoCaseStrcmp( ppname, name) == 0) {
found = 1;
break;
}
}
}
if ( !found) {
continue;
}
// cp->PlcProcess = plc;
snprintf( idstr, sizeof(idstr), "pwr_plc_%s", name);
snprintf(p_name, sizeof(p_name), "pwr_plc_%s_%%d_%d", name, plc->ChgCount++ % 10);
pp = ini_ProcInsert(sts, cp, idstr, p_name, 1, 1, cp->plcfile[i].name, cPrio_plc_init, plc->StartWithDebug, "", plc);
pp->flags.b.plc = 1;
cp->plc = pp;
pp->proc.flags.b.user = 1;
pp->proc.flags.b.k_mode = 1;
pp->proc.k_size = 30;
} while (0);
}
for (
*sts = gdh_GetClassList(pwr_eClass_Appl, &oid);
......@@ -2144,7 +2179,7 @@ ini_ProcTable (
if (ODD(*sts = gdh_ObjidToPointer(oid, (pwr_tAddress *)&ap))) {
pp = ini_ProcInsert(sts, cp, name, ap->ProgramName, ap->Load, ap->Run,
ap->FileName, ap->JobPriority, ap->StartWithDebug, ap->Arg);
ap->FileName, ap->JobPriority, ap->StartWithDebug, ap->Arg, ap);
pp->proc.flags.b.user = 1;
}
}
......@@ -2216,7 +2251,7 @@ ini_ProcTable (
else
i_prio = atoi(prio);
pp = ini_ProcInsert(sts, cp, id, name, i_load, i_run, file, i_prio, i_debug, arg);
pp = ini_ProcInsert(sts, cp, id, name, i_load, i_run, file, i_prio, i_debug, arg, 0);
if (!pp->proc.flags.b.system && !pp->proc.flags.b.base)
pp->proc.flags.b.user = 1;
} while (0);
......
......@@ -141,6 +141,7 @@ typedef struct {
char id[40];
ini_mProc flags;
proc_sProcess proc;
void *objectp;
} ini_sProc;
typedef struct {
......@@ -158,7 +159,8 @@ typedef struct {
ini_sFile applfile;
ini_sFile bootfile;
ini_sFile nodefile;
ini_sFile plcfile;
ini_sFile *plcfile;
int plcfile_cnt;
int busid;
char dir[256];
char bdir[256]; /* Base dir (pwr_load) */
......@@ -206,8 +208,8 @@ char * ini_LoadDirectory (pwr_tStatus*, ini_sContext*);
pwr_tBoolean ini_LoadNode (pwr_tStatus*, ini_sContext*);
pwr_tBoolean ini_LoadVolume (pwr_tStatus*, ini_sContext*, ivol_sVolume*);
FILE *ini_OpenFile (pwr_tStatus*, ini_sContext*, ini_sFile*);
ini_sProc *ini_ProcInsert (pwr_tStatus*, ini_sContext*, char*, char*, int, int, char*, int, int, char*);
void ini_ProcIter (pwr_tStatus*, ini_sContext*, int,
ini_sProc *ini_ProcInsert (pwr_tStatus*, ini_sContext*, char*, char*, int, int, char*, int, int, char*, void*);
void ini_ProcIter (pwr_tStatus*, ini_sContext*, int, int,
void (*func) (pwr_tStatus*, ini_sContext*, ini_sProc*));
void ini_ProcLoad (pwr_tStatus*, ini_sContext*, ini_sProc*);
void ini_ProcStart (pwr_tStatus*, ini_sContext*, ini_sProc*);
......
......@@ -227,9 +227,9 @@ start (
#endif
ini_ProcTable(&sts, cp);
ini_ProcIter(&sts, cp, proc_mProcess_system, ini_ProcLoad);
ini_ProcIter(&sts, cp, proc_mProcess_system, ini_ProcStart);
ini_ProcIter(&sts, cp, proc_mProcess_system, ini_ProcPrio);
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)) {*/
......@@ -240,9 +240,9 @@ start (
qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_newPlcInit | ini_mEvent_newPlcStart);
ini_ProcIter(&sts, cp, proc_mProcess_user, ini_ProcLoad);
ini_ProcIter(&sts, cp, proc_mProcess_user, ini_ProcStart);
ini_ProcIter(&sts, cp, proc_mProcess_user, ini_ProcPrio);
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)) {
......@@ -406,6 +406,9 @@ restart (
)
{
pwr_tStatus sts;
char time[24];
lst_sEntry *pl;
ini_sProc *pp;
ini_CheckContext(&sts, cp);
......@@ -437,8 +440,11 @@ restart (
ini_ProcTable(&sts, cp);
ini_ProcLoad(&sts, cp, cp->plc);
ini_ProcStart(&sts, cp, cp->plc);
// 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, qcom_cTmoEternal);
......@@ -454,16 +460,21 @@ restart (
errh_LogInfo(&cp->log, "Time critical period over, new PLC is running");
qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_swapDone);
if (cp->PlcProcess != NULL) {
char time[24];
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(&cp->PlcProcess->LastChgTime);
time_Dsub(&cp->PlcProcess->StallTime, &cp->PlcProcess->StartTime, &cp->PlcProcess->StopTime);
time_DtoAscii(&cp->PlcProcess->StallTime, 1, time, sizeof(time));
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);
cp->np->RestartStallTime = cp->PlcProcess->StallTime;
}
ini_FreeBodies(&sts, cp, 0);
ini_FreeBodies(&sts, cp, 1);
......@@ -671,7 +682,10 @@ createContext (int argc, char **argv)
exit(0);
}
cp->flags.b.plcfile = 1;
strcpy(cp->plcfile.name, argv[i+1]);
cp->plcfile = (ini_sFile *) calloc( 1, sizeof(ini_sFile));
cp->plcfile_cnt = 1;
strcpy(cp->plcfile[0].name, argv[i+1]);
cp->plcfile[0].logOpenFail = errh_LogInfo;
i++;
i_incr = 1;
break;
......
......@@ -51,6 +51,9 @@
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#if defined OS_LINUX
#include <sched.h>
#endif
#include <pwd.h>
#include "pwr.h"
......@@ -79,7 +82,7 @@
#include "rt_pwr_msg.h"
static plc_sProcess *init_process ();
static pwr_tStatus init_plc (plc_sProcess*);
static pwr_tStatus init_plc (plc_sProcess*, char *name);
static void init_threads (plc_sProcess*);
static void start_threads (plc_sProcess*);
static void run_threads (plc_sProcess*);
......@@ -179,7 +182,7 @@ int main (
qcom_WaitAnd(&sts, &pp->eventQ, &qcom_cQini, ini_mEvent_newPlcInit, qcom_cTmoEternal);
init_plc(pp);
init_plc(pp, argv[0]);
create_threads(pp);
init_threads(pp);
......@@ -302,7 +305,8 @@ init_process ()
static pwr_tStatus
init_plc (
plc_sProcess *pp
plc_sProcess *pp,
char *name
)
{
pwr_tStatus sts = PLC__SUCCESS;
......@@ -314,6 +318,12 @@ init_plc (
int msec;
int i;
pwr_tCid cid;
int busid;
int found;
char busidstr[10];
char pp_name[80];
pwr_tObjName oname;
char *s;
sts = gdh_GetNodeObject(0, &oid);
if (EVEN(sts)) {
......@@ -324,15 +334,58 @@ init_plc (
sts = gdh_ObjidToPointer(oid, (void *)&pp->Node);
if (EVEN(sts)) return sts;
sts = gdh_GetClassList(pwr_cClass_PlcProcess, &pp_oid);
if (EVEN(sts)) {
errh_Error("Found no PlcProcess-object\n%m", sts);
return sts;
busid = qcom_MyBus( &sts);
if ( EVEN(sts)) return sts;
sprintf( busidstr, "_%04d_", busid);
s = strstr( name, busidstr);
if ( s) {
strncpy( pp_name, s + 6, sizeof(pp_name));
if ( (s = strchr( pp_name, '.')))
*s = 0;
}
else {
strcpy( pp_name, "");
}
for ( sts = gdh_GetClassList(pwr_cClass_PlcProcess, &pp_oid);
ODD(sts);
sts = gdh_GetNextObject(pp_oid, &pp_oid)) {
sts = gdh_ObjidToName(pp_oid, oname, sizeof(oname), cdh_mName_object);
if (EVEN(sts)) return sts;
if ( cdh_NoCaseStrcmp( pp_name, oname) == 0) {
found = 1;
break;
}
}
if (!found) {
errh_Error("Found no PlcProcess-object %s", pp_name);
return 0;
}
sts = gdh_ObjidToPointer(pp_oid, (void *)&pp->PlcProcess);
if (EVEN(sts)) return sts;
#if defined OS_LINUX
if ( pp->PlcProcess->CpuMask != 0) {
cpu_set_t mask;
CPU_ZERO(&mask);
for ( i = 0; i < 32; i++) {
if ( pp->PlcProcess->CpuMask & 1 << i)
CPU_SET( i, &mask);
}
sts = sched_setaffinity( 0, sizeof(mask), &mask);
if ( sts < 0)
errh_Error("Unable to set affinity mask");
else
errh_Info("Affinity mask set to %d", pp->PlcProcess->CpuMask);
}
#endif
i = 0;
sts = gdh_GetChild( pp_oid, &thread_oid);
while ( ODD(sts)) {
......
......@@ -35,11 +35,10 @@
%#if defined OS_VMS || defined OS_ELN
%# define load_cNameDirectory "pwrp_load:"
%# define load_cDirectory "pwrp_load:"
%# define load_cNamePlc "%splc_%s_%04d_%05d.exe"
%# define load_cNamePlc "%splc_%s_%04d_%s.exe"
%
%# define load_cNameBootList "pwrp_root:[src.db]pwrp_cnf_bootlist.dat"
%# define load_cNameVolumeList "pwrp_root:[src.db]pwrp_cnf_volumelist.dat"
%# define load_cNamePlcVersion "pwrp_root:[src.db]pwrp_cnf_plcvers_%s.dat"
%# define load_cNameDistribute "pwrp_root:[src.db]pwrp_cnf_distribute.dat"
%# define load_cNameSysObject "pwrp_root:[src.db]pwrp_cnf_sysobject.dat"
%# define load_cNameGblVolumeList "pwra_db:pwr_volumelist.dat"
......@@ -52,11 +51,10 @@
%#elif defined OS_POSIX
%# define load_cNameDirectory "pwrp_load"
%# define load_cDirectory "$pwrp_load/"
%# define load_cNamePlc "%splc_%s_%04d_%05d"
%# define load_cNamePlc "%splc_%s_%04d_%s"
%
%# define load_cNameBootList "$pwrp_root/src/db/pwrp_cnf_bootlist.dat"
%# define load_cNameVolumeList "$pwrp_root/src/db/pwrp_cnf_volumelist.dat"
%# define load_cNamePlcVersion "$pwrp_root/src/db/pwrp_cnf_plcvers_%s.dat"
%# define load_cNameDistribute "$pwrp_root/src/db/pwrp_cnf_distribute.dat"
%# define load_cNameSysObject "$pwrp_root/src/db/pwrp_cnf_sysobject.dat"
%# define load_cNameFilePath "$pwrp_root/src/db/pwrp_cnf_dirlist.dat"
......@@ -77,7 +75,7 @@
%
%#define load_cNameAlias "%spwrp_alias.dat"
%#define load_cNameAppl "%sld_appl_%s_%d.txt"
%#define load_cNameOpt "%splc_%s_%04d.opt"
%#define load_cNameOpt "%splc_%s_%04d_%s.opt"
%#define load_cNameBoot "%sld_boot_%s_%04d.dat"
%#define load_cNameNode "%sld_node_%s_%04d.dat"
%#define load_cNameRc "%sld_rc_%s_%04d.dat"
......
......@@ -129,6 +129,7 @@ maxsize <MaxSize is larger than cell size> /error
noseqreset <No SequenceReset object found in main object> /error
compmethod <Invalid compile method> /error
libref <Invalid reference to library hierarchy> /error
misplacedthread <Misplaced thread object> /error
.facility FOE,280 /prefix = FOE__ ! Function object editor
......
......@@ -37,7 +37,7 @@
!
SObject pwrb:Class
!/**
! @Version 2.0
! @Version 3.0
! @Group ProjectConfiguration
! @Summary Build options for plc program
! Configures the build options for the plc program.
......@@ -55,7 +55,12 @@ SObject pwrb:Class
! - function objects from the class volumes NMps, Remote, Misc or Ssabox are
! used.
!
! The object creates an option file $pwrp_exe/plc_'nodename'_'busnumber'.opt
! From V4.8.4 serveral PLC processes can be configured in the same node, and also
! several BuildOptions object can be configured. Which process a BuildOptions belongs
! to is specified by inserting the name of the PlcProcess object into the PlcProcess
! attribute,
!
! The object creates an option file $pwrp_exe/plc_'nodename'_'busnumber'_'plcprocess'.opt
! with options that is added to the link command. If other requirements are
! needed in this file than the BuildOptions object offers, the file can be
! edited and handled manually if no BuildOptions object is present.
......@@ -70,6 +75,15 @@ SObject pwrb:Class
Attr StructName = "BuildOptions"
EndBody
!/**
! Name of PlcProcess object for the executable that these options
! are specifications for. Only the last name segment should be stated.
!*/
Object PlcProcess $Attribute 5
Body SysBody
Attr TypeRef = "pwrs:Type-$String32"
EndBody
EndObject
!/**
! System archives and system modules.
!*/
Object SystemModules $Attribute 1
......
......@@ -75,6 +75,11 @@ SObject pwrb:Class
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
Object CpuMask $Attribute 15
Body SysBody
Attr TypeRef = "pwrs:Type-$Mask"
EndBody
EndObject
Object BootVersion $Attribute 5
Body SysBody
Attr TypeRef = "pwrs:Type-$UInt32"
......
......@@ -121,7 +121,7 @@ void wb_build::node( char *nodename, void *volumelist, int volumecnt)
for ( int i = 0; i < volumecnt; i++) {
if ( cdh_NoCaseStrcmp( nodename, vlist[i].p1) == 0) {
if ( bussid == -1) {
char systemname[80], systemgroup[80], pname[80];
char systemname[80], systemgroup[80];
pwr_tVid *vl;
pwr_tString40 *vnl;
int vcnt;
......@@ -137,7 +137,7 @@ void wb_build::node( char *nodename, void *volumelist, int volumecnt)
cdh_ToLower( fname, fname);
dcli_translate_filename( fname, fname);
status = lfu_ReadBootFile( fname, &btime, systemname, systemgroup, &vl, &vnl,
&vcnt, pname);
&vcnt, 0, 0);
if ( EVEN(status)) {
rebuild = 1;
}
......
......@@ -148,6 +148,7 @@ extern "C" {
typedef struct {
pwr_tObjid thread_objid;
pwr_tObjid plcproc_objid;
float scantime;
int prio;
pwr_tObjid *plclist;
......@@ -554,10 +555,6 @@ static int gcg_sort_threadlist(
);
static int gcg_check_ra_plc_user( char *filename);
static pwr_tStatus gcg_read_volume_plclist( gcg_ctx gcgctx, pwr_tVolumeId volid,
unsigned long *plc_count, gcg_t_plclist **plclist,
unsigned long *thread_count,
gcg_t_threadlist **threadlist);
static int gcg_parname_to_pgmname( ldh_tSesContext ldhses, pwr_tClassId cid,
char *parname, char *pgmname);
static pwr_tStatus gcg_replace_ref( gcg_ctx gcgctx, pwr_sAttrRef *attrref,
......@@ -4846,6 +4843,61 @@ static int gcg_get_plc_windows(
return GSX__SUCCESS;
}
/*************************************************************************
*
* Name: gcg_get_rtnode_plcproc()
*
* Type void
*
* Type Parameter IOGF Description
* unsigned long gcgctx I gcg context.
* unsigned long *plcproc_count O number of plcproc objects in list.
* gcg_t_plcproclist **plcproclist O found thread's.
*
* Description:
* This routine returns a list of all plcprocess objects in the volume.
* The list should be freed by the caller.
*
**************************************************************************/
static int gcg_get_rtnode_plcproc(
gcg_ctx gcgctx,
unsigned long *plcproc_count,
gcg_t_plcproclist **plcproclist
)
{
int sts;
pwr_tObjid oid;
int size;
gcg_t_plcproclist *plcproclist_pointer;
/* Get all the plcprocess objects in this volume */
*plcproc_count = 0;
for ( sts = ldh_GetClassList( gcgctx->ldhses, pwr_cClass_PlcProcess, &oid);
ODD(sts);
sts = ldh_GetNextObject( gcgctx->ldhses, oid, &oid)) {
if ( gcg_in_libhier( gcgctx, oid))
continue;
sts = utl_realloc((char **) plcproclist,
*plcproc_count * sizeof(gcg_t_plcproclist),
(*plcproc_count + 1) * sizeof(gcg_t_plcproclist));
if ( EVEN(sts)) return sts;
plcproclist_pointer = *plcproclist;
(plcproclist_pointer + *plcproc_count)->oid = oid;
sts = ldh_ObjidToName( gcgctx->ldhses, oid,
ldh_eName_Object,
(plcproclist_pointer + *plcproc_count)->name,
sizeof( (plcproclist_pointer + *plcproc_count)->name),
&size);
if ( EVEN(sts)) return sts;
(*plcproc_count)++;
}
return GSX__SUCCESS;
}
/*************************************************************************
*
......@@ -4878,12 +4930,13 @@ static int gcg_get_child_plcthread(
gcg_t_threadlist **threadlist
)
{
pwr_tClassId cid;
pwr_tClassId cid, pcid;
int sts, size;
gcg_t_threadlist *threadlist_pointer;
float *scantime_ptr;
pwr_tInt32 *prio_ptr;
int timebase;
pwr_tOid parent;
/* Get all the children of this node */
sts = ldh_GetChild( gcgctx->ldhses, objdid, &objdid);
......@@ -4909,6 +4962,21 @@ static int gcg_get_child_plcthread(
}
else {
/* Get plcprocess, should be parent */
sts = ldh_GetParent( gcgctx->ldhses, objdid, &parent);
if ( EVEN(sts)) {
gcg_plc_msg( gcgctx, GSX__MISPLACEDTHREAD, objdid);
return sts;
}
sts = ldh_GetObjectClass( gcgctx->ldhses, parent, &pcid);
if ( EVEN(sts)) return sts;
if ( pcid != pwr_cClass_PlcProcess) {
gcg_plc_msg( gcgctx, GSX__MISPLACEDTHREAD, objdid);
return GSX__MISPLACEDTHREAD;
}
/* Get the priority */
sts = ldh_GetObjectPar( gcgctx->ldhses, objdid, "RtBody",
"Prio",
......@@ -4921,6 +4989,7 @@ static int gcg_get_child_plcthread(
if ( EVEN(sts)) return sts;
threadlist_pointer = *threadlist;
(threadlist_pointer + *thread_count)->objdid = objdid;
(threadlist_pointer + *thread_count)->plcproc_oid = parent;
(threadlist_pointer + *thread_count)->scantime = *scantime_ptr;
(threadlist_pointer + *thread_count)->prio = *prio_ptr;
sts = ldh_ObjidToName( gcgctx->ldhses, objdid,
......@@ -4953,6 +5022,7 @@ static int gcg_get_child_plcthread(
/*************************************************************************
*
* Name: gcg_get_rtnode_plcthread()
......@@ -5005,6 +5075,7 @@ static int gcg_get_rtnode_plcthread(
}
return GSX__SUCCESS;
}
/*************************************************************************
*
* Name: gcg_get_child_plc()
......@@ -5246,13 +5317,14 @@ static int gcg_sort_plclist(
}
static pwr_tStatus gcg_read_volume_plclist(
gcg_ctx gcgctx,
pwr_tStatus gcg_read_volume_plclist(
pwr_tVolumeId volid,
unsigned long *plc_count,
gcg_t_plclist **plclist,
unsigned long *thread_count,
gcg_t_threadlist **threadlist)
gcg_t_threadlist **threadlist,
unsigned long *plcproc_count,
gcg_t_plcproclist **plcproclist)
{
FILE *file;
pwr_tFileName filenames;
......@@ -5261,6 +5333,7 @@ static pwr_tStatus gcg_read_volume_plclist(
int line_count = 0;
char line[256];
char objid_str[40];
char plcproc_objid_str[40];
char thread_str[40];
float scantime;
int executeorder;
......@@ -5268,6 +5341,7 @@ static pwr_tStatus gcg_read_volume_plclist(
int sts;
gcg_t_plclist *plclist_pointer;
gcg_t_threadlist *threadlist_pointer;
gcg_t_plcproclist *plcproclist_pointer;
pwr_tOName name;
sprintf( filenames, "%s%s", gcgmv_filenames[0],
......@@ -5278,12 +5352,25 @@ static pwr_tStatus gcg_read_volume_plclist(
if ( !file )
return GSX__NOLOADFILE;
while(
ODD( sts = utl_read_line( line, sizeof(line), file, &line_count)))
{
if ( strncmp( line, "PlcThread", 9) == 0)
{
sscanf( line, "%s %s %f %d %s", type, objid_str, &scantime, &prio,
while( ODD( sts = utl_read_line( line, sizeof(line), file, &line_count))) {
if ( strncmp( line, "PlcProcess", 10) == 0) {
if ( plcproclist) {
sscanf( line, "%s %s %s", type, objid_str, name);
sts = utl_realloc((char **) plcproclist,
*plcproc_count * sizeof(gcg_t_plcproclist),
(*plcproc_count + 1) * sizeof(gcg_t_plcproclist));
if ( EVEN(sts)) return sts;
plcproclist_pointer = *plcproclist;
sts = cdh_StringToObjid( objid_str,
&(plcproclist_pointer + *plcproc_count)->oid);
strcpy( (plcproclist_pointer + *plcproc_count)->name, name);
(*plcproc_count)++;
}
}
else if ( strncmp( line, "PlcThread", 9) == 0) {
if ( threadlist) {
sscanf( line, "%s %s %s %f %d %s", type, objid_str, plcproc_objid_str, &scantime, &prio,
name);
sts = utl_realloc((char **) threadlist,
*thread_count * sizeof(gcg_t_threadlist),
......@@ -5293,12 +5380,16 @@ static pwr_tStatus gcg_read_volume_plclist(
sts = cdh_StringToObjid( objid_str,
&(threadlist_pointer + *thread_count)->objdid);
if ( EVEN(sts)) return sts;
sts = cdh_StringToObjid( plcproc_objid_str,
&(threadlist_pointer + *thread_count)->plcproc_oid);
if ( EVEN(sts)) return sts;
(threadlist_pointer + *thread_count)->scantime = scantime;
(threadlist_pointer + *thread_count)->prio = prio;
(*thread_count)++;
}
else
{
}
else if ( strncmp( line, "PlcPgm", 6) == 0) {
if ( plclist) {
sscanf( line, "%s %s %s %d %s", type, objid_str, thread_str,
&executeorder, name);
sts = utl_realloc((char **) plclist,
......@@ -5316,6 +5407,10 @@ static pwr_tStatus gcg_read_volume_plclist(
(*plc_count)++;
}
}
else {
printf( "** Syntax error in plcpgm list\n");
}
}
return GSX__SUCCESS;
}
......@@ -5379,6 +5474,8 @@ int gcg_comp_rtnode(
int max_no_timebase;
gcg_t_threadlist *threadlist;
unsigned long thread_count;
gcg_t_plcproclist *plcproclist;
unsigned long plcproc_count;
char text[80];
char nodename_low[80];
......@@ -5388,8 +5485,7 @@ int gcg_comp_rtnode(
strcpy(gcdir, GCDIR);
strncpy( nodename_low, cdh_Low(nodename), sizeof(nodename_low));
switch ( os)
{
switch ( os) {
case pwr_mOpSys_VAX_ELN:
strcpy( objdir, "pwrp_root:[vax_eln.obj]");
strcpy( os_str, "VAX_ELN");
......@@ -5463,13 +5559,13 @@ int gcg_comp_rtnode(
/* Get the plclist for this node */
plc_count = 0;
thread_count = 0;
plcproc_count = 0;
volumelist_ptr = volumelist;
for( i = 0; i < volume_count; i++)
{
sts = gcg_read_volume_plclist( gcgctx, *volumelist_ptr,
&plc_count, &plclist, &thread_count, &threadlist);
if ( EVEN(sts))
{
for( i = 0; i < volume_count; i++) {
sts = gcg_read_volume_plclist( *volumelist_ptr,
&plc_count, &plclist, &thread_count, &threadlist,
&plcproc_count, &plcproclist);
if ( EVEN(sts)) {
/* No plcpgm's in this volume */
*volumelist_ptr = 0;
}
......@@ -5484,35 +5580,29 @@ int gcg_comp_rtnode(
sts = gcg_sort_threadlist( gcgctx, threadlist, thread_count);
if ( EVEN(sts)) return sts;
if ( plc_count == 0)
{
if ( plc_count == 0) {
/* No plcpgms on this node */
printf( "-- No plcpgms found on node %s\n", nodename);
return GSX__NOPLC;
}
/* Check that every plcpgm has a valid thread */
for ( i = 0; i < (int)plc_count; i++)
{
for ( i = 0; i < (int)plc_count; i++) {
found = 0;
for ( j = 0; j < (int)thread_count; j++)
{
for ( j = 0; j < (int)thread_count; j++) {
if ( cdh_ObjidIsEqual( (plclist + i)->thread,
(threadlist+ j)->objdid))
{
(threadlist+ j)->objdid)) {
found = 1;
break;
}
}
if ( !found)
{
if ( !found) {
sprintf( text, "in plcpgm %s", (plclist+i)->name);
gcg_text_msg( gcgctx, GSX__NOTHREAD, text);
}
}
if ( thread_count == 0)
{
if ( thread_count == 0) {
/* No threads on this node */
printf( "-- No PlcThreads found on node %s\n", nodename);
return GSX__NOPLC;
......@@ -5521,18 +5611,16 @@ int gcg_comp_rtnode(
/* Insert the plc objects in the timebaselists */
timebase = (gcg_t_timebase *) calloc( thread_count,
sizeof( gcg_t_timebase));
for ( i = 0; i < (int)thread_count; i++ )
{
for ( i = 0; i < (int)thread_count; i++ ) {
(timebase+i)->thread_objid = (threadlist+i)->objdid;
(timebase+i)->plcproc_objid = (threadlist+i)->plcproc_oid;
(timebase+i)->scantime = (threadlist+i)->scantime;
(timebase+i)->prio = (threadlist+i)->prio;
(timebase+i)->plc_count = 0;
(timebase+i)->plclist = (pwr_tObjid *)calloc( plc_count,
sizeof( pwr_tObjid));
for ( k = 0; k < (int)plc_count; k++ )
{
if ( cdh_ObjidIsEqual((plclist+k)->thread, (threadlist+i)->objdid))
{
for ( k = 0; k < (int)plc_count; k++ ) {
if ( cdh_ObjidIsEqual((plclist+k)->thread, (threadlist+i)->objdid)) {
(timebase+i)->plclist[(timebase+i)->plc_count] =
(plclist+k)->objdid;
(timebase+i)->plc_count++;
......@@ -5541,18 +5629,13 @@ int gcg_comp_rtnode(
}
timebase_count = thread_count;
if ( single_scantime != 0)
{
if ( single_scantime != 0) {
/* Insert all plcpgm's into one timebase */
/* timebase->scantime = single_scantime; */
timebase->prio = 1;
timebase_count = 1;
for ( i = 1; i < (int)thread_count; i++ )
{
for ( k = 0; k < (timebase+i)->plc_count; k++)
{
timebase->plclist[timebase->plc_count] =
(timebase+i)->plclist[k];
for ( i = 1; i < (int)thread_count; i++ ) {
for ( k = 0; k < (timebase+i)->plc_count; k++) {
timebase->plclist[timebase->plc_count] = (timebase+i)->plclist[k];
timebase->plc_count++;
}
free( (char *)(timebase+i)->plclist);
......@@ -5560,46 +5643,45 @@ int gcg_comp_rtnode(
printf ("-- SimulateSingleProcess is configured for this node\n");
}
if ( timebase_count > max_no_timebase)
{
if ( timebase_count > max_no_timebase) {
printf( "** Error, %d frequencies is supported on %s, %d is found\n",
max_no_timebase, os_str, timebase_count);
return GSX__NONODE;
}
/* Generate one c module for every timebase, and one optfile */
if ( codetype)
{
if ( codetype) {
sprintf( fullfilename,"%s%s%s_%4.4d%s", gcdir, gcgmn_filenames[0],
nodename_low, bus, GCEXT);
for ( j = 0; j < (int)plcproc_count; j++) {
sprintf( fullfilename,"%s%s%s_%4.4d_%s%s", gcdir, gcgmn_filenames[0],
nodename_low, bus, cdh_Low(plcproclist[j].name), GCEXT);
dcli_translate_filename( fullfilename, fullfilename);
if ((files[0] = fopen( fullfilename,"w")) == NULL)
{
if ((files[0] = fopen( fullfilename,"w")) == NULL) {
printf("Cannot open file: %s\n", fullfilename);
return GSX__OPENFILE;
}
fprintf( files[0],"#include \"%s\"\n\n", PLCINC);
fprintf( files[0],"#include \"%s\"\n\n", PROCINC);
if (IS_VMS_OR_ELN(os))
{
sprintf( fullfilename,"%splc_%s_%4.4d.opt", "pwrp_tmp:", nodename_low, bus);
if (IS_VMS_OR_ELN(os)) {
sprintf( fullfilename,"%splc_%s_%4.4d_%s.opt", "pwrp_tmp:", nodename_low, bus,
cdh_Low(plcproclist[j].name));
dcli_translate_filename( fullfilename, fullfilename);
if ((files[1] = fopen( fullfilename,"w")) == NULL)
{
if ((files[1] = fopen( fullfilename,"w")) == NULL) {
printf("Cannot open file: %s\n", fullfilename);
fclose(files[0]);
return GSX__OPENFILE;
}
}
for ( i = 0; i < timebase_count; i++ )
{
for ( i = 0; i < timebase_count; i++ ) {
if ( cdh_ObjidIsEqual( timebase[i].plcproc_objid, plcproclist[j].oid)) {
timebase_ms = (int)((timebase+i)->scantime * 1000 + 0.5);
timebase_ptr = (timebase+i)->plclist;
printf (
"-- Plc thread generated priority %d, scantime %9.5f s, %d plcpgm's \n",
printf ( "-- Plc thread generated priority %d, scantime %9.5f s, %d plcpgm's \n",
(timebase+i)->prio, (timebase+i)->scantime,
(timebase+i)->plc_count);
......@@ -5607,8 +5689,7 @@ int gcg_comp_rtnode(
fprintf( files[0],
"void plc_p%d_init( int DirectLink, plc_sThread *tp){\n",
i + 1);
for ( k = 0; k < (timebase+i)->plc_count; k++ )
{
for ( k = 0; k < (timebase+i)->plc_count; k++ ) {
fprintf( files[0],
" %c%s_init( DirectLink, tp);\n",
GCG_PREFIX_MOD, vldh_IdToStr(0, (timebase+i)->plclist[k]));
......@@ -5619,8 +5700,7 @@ int gcg_comp_rtnode(
fprintf( files[0],
"void plc_p%d_exec( int DirectLink, plc_sThread *tp){\n",
i + 1);
for ( k = 0; k < (timebase+i)->plc_count; k++ )
{
for ( k = 0; k < (timebase+i)->plc_count; k++ ) {
fprintf( files[0],
" %c%s_exec( tp);\n",
GCG_PREFIX_MOD, vldh_IdToStr(0, (timebase+i)->plclist[k]));
......@@ -5638,31 +5718,33 @@ int gcg_comp_rtnode(
}
}
fprintf( files[0],"struct plc_proctbl *plc_proctbllist[] = {\n");
for ( i = 0; i < timebase_count; i++ )
for ( i = 0; i < timebase_count; i++ ) {
if ( cdh_ObjidIsEqual( timebase[i].plcproc_objid, plcproclist[j].oid))
fprintf( files[0]," &plc_proc%d,\n", i + 1);
}
fprintf( files[0]," (void *)0\n};\n");
fclose(files[0]);
files[0] = NULL;
/* Create an object file */
sprintf( module_name, "%s%s_%4.4d", gcgmn_filenames[0], nodename_low, bus);
sprintf( module_name, "%s%s_%4.4d_%s", gcgmn_filenames[0], nodename_low, bus,
cdh_Low(plcproclist[j].name));
gcg_cc( GCG_PROC, module_name, NULL, NULL, os, GCG_NOSPAWN);
/* print module in option file */
if (IS_VMS_OR_ELN(os))
fprintf( files[1],"%s%s%s_%4.4d\n", objdir, gcgmn_filenames[0],
nodename_low, bus);
fprintf( files[1],"%s%s%s_%4.4d_%s\n", objdir, gcgmn_filenames[0],
nodename_low, bus, cdh_Low(plcproclist[j].name));
/* Print plc libraries in option file */
volumelist_ptr = volumelist;
*plclib_frozen = '\0';
for (i = l = 0; i < volume_count; i++, volumelist_ptr++)
{
if ( *volumelist_ptr )
{
switch ( os)
{
for (i = l = 0; i < volume_count; i++, volumelist_ptr++) {
if ( *volumelist_ptr ) {
switch ( os) {
case pwr_mOpSys_VAX_ELN:
sprintf( plclib_frozen, "%s%s.olb", PLCLIB_FROZEN_VAX_ELN,
vldh_VolumeIdToStr( *volumelist_ptr));
......@@ -5692,38 +5774,36 @@ int gcg_comp_rtnode(
return GSX__UNKNOPSYS;
}
if (IS_VMS_OR_ELN(os))
fprintf( files[1],"%s/lib\n", plclib_frozen);
fprintf(files[1],"%s/lib\n", plclib_frozen);
}
}
if (IS_VMS_OR_ELN(os))
{
if (IS_VMS_OR_ELN(os)) {
fclose(files[1]);
files[1] = NULL;
}
/* Link */
if (IS_VMS_OR_ELN(os))
{
sprintf( plcfilename, "pwrp_exe:plc_%s_%4.4d_%5.5ld.exe",
nodename_low, bus, plc_version);
sprintf( fullfilename,"%s%s_%4.4d", gcgmn_filenames[0], nodename_low, bus);
if (IS_VMS_OR_ELN(os)) {
sprintf( plcfilename, "pwrp_exe:plc_%s_%4.4d_%s.exe",
nodename_low, bus, cdh_Low(plcproclist[j].name));
sprintf( fullfilename,"%s%s_%4.4d_%s", gcgmn_filenames[0], nodename_low, bus,
cdh_Low(plcproclist[j].name));
gcg_cc( GCG_RTNODE, fullfilename, plcfilename, NULL, os,
GCG_NOSPAWN);
}
else
{
sprintf( plcfilename, "plc_%s_%4.4d_%5.5ld",
nodename_low, bus, plc_version);
sprintf( fullfilename,"%s%s_%4.4d", gcgmn_filenames[0], nodename_low, bus);
else {
sprintf( plcfilename, "plc_%s_%4.4d_%s",
nodename_low, bus, cdh_Low(plcproclist[j].name));
sprintf( fullfilename,"%s%s_%4.4d_%s", gcgmn_filenames[0], nodename_low, bus,
cdh_Low(plcproclist[j].name));
gcg_cc( GCG_RTNODE, fullfilename, plcfilename,
plclib_frozen, os, GCG_NOSPAWN);
}
}
}
for ( i = 0; i < timebase_count; i++ )
{
for ( i = 0; i < timebase_count; i++ ) {
if ( (timebase+i)->plc_count > 0)
free((char *) (timebase+i)->plclist);
}
......@@ -5780,6 +5860,9 @@ int gcg_comp_volume(
gcg_t_threadlist *threadlist;
unsigned long thread_count;
char thread_objid_str[40];
gcg_t_plcproclist *plcproclist;
unsigned long plcproc_count;
char plcproc_oidstr[40];
/* Get the volumeid from the ldh session */
sts = ldh_GetVolumeInfo( ldh_SessionToVol( ldhses), &info);
......@@ -5800,6 +5883,10 @@ int gcg_comp_volume(
operating_system = *os;
free((char *)os);
/* Get all plcproc objects in this volume */
sts = gcg_get_rtnode_plcproc( gcgctx, &plcproc_count, &plcproclist);
if ( EVEN(sts)) return sts;
/* Get all plcthread objects in this volume */
sts = gcg_get_rtnode_plcthread( gcgctx, volobjid, operating_system,
&thread_count, &threadlist);
......@@ -5836,11 +5923,21 @@ int gcg_comp_volume(
return GSX__OPENFILE;
}
for ( i = 0; i < (int)plcproc_count; i++ )
{
fprintf( file, "%s %s %s\n",
"PlcProcess",
cdh_ObjidToString( NULL, (plcproclist+i)->oid, 0),
(plcproclist+i)->name);
}
for ( i = 0; i < (int)thread_count; i++ )
{
fprintf( file, "%s %s %f %ld %s\n",
strcpy( plcproc_oidstr, cdh_ObjidToString( NULL, (threadlist+i)->plcproc_oid, 0));
fprintf( file, "%s %s %s %f %ld %s\n",
"PlcThread",
cdh_ObjidToString( NULL, (threadlist+i)->objdid, 0),
plcproc_oidstr,
(threadlist+i)->scantime,
(threadlist+i)->prio,
(threadlist+i)->name);
......
......@@ -133,11 +133,17 @@ typedef struct {
typedef struct {
pwr_tObjid objdid;
pwr_tObjid plcproc_oid;
float scantime;
unsigned long prio;
char name[120];
pwr_tOName name;
} gcg_t_threadlist;
typedef struct {
pwr_tObjid oid;
pwr_tOName name;
} gcg_t_plcproclist;
typedef struct {
pwr_tObjid objdid;
char prefix;
......@@ -326,6 +332,16 @@ int gcg_comp_volume(
ldh_tSesContext ldhses
);
pwr_tStatus gcg_read_volume_plclist(
pwr_tVolumeId volid,
unsigned long *plc_count,
gcg_t_plclist **plclist,
unsigned long *thread_count,
gcg_t_threadlist **threadlist,
unsigned long *plcproc_count,
gcg_t_plcproclist **plcproclist
);
#ifdef __cplusplus
}
#endif
......
......@@ -268,7 +268,7 @@ pwr_tStatus lfu_create_bootfile(
int volumecount,
int debug)
{
int j;
int i, j;
FILE *file;
lfu_t_volumelist *volumelist_ptr;
lfu_t_volumelist *first_volumelist_ptr;
......@@ -281,19 +281,21 @@ pwr_tStatus lfu_create_bootfile(
pwr_mOpSys os;
unsigned long errorcount;
unsigned long warningcount;
unsigned long plc_version;
pwr_tFloat32 single_scantime;
char nodeconfigname_upper[80];
char vollistname_upper[80];
char systemname[80];
char systemgroup[80];
char timstr[32];
gcg_t_plcproclist *plcproclist;
unsigned long plcproc_count;
int noplc;
char plcname[80];
volumelist_ptr = volumelist;
utl_toupper( nodeconfigname_upper, nodeconfigname);
for ( j = 0; j < volumecount; j++)
{
for ( j = 0; j < volumecount; j++) {
utl_toupper( vollistname_upper, volumelist_ptr->p1);
if ( !strcmp( nodeconfigname_upper, vollistname_upper)) {
strcpy( nodename, volumelist_ptr->p2);
......@@ -319,19 +321,15 @@ pwr_tStatus lfu_create_bootfile(
/* Get data for plc and print volumes on terminal */
printf( "-- Creating bootfile for node %s\n", nodename);
sprintf( filename, load_cNamePlcVersion, nodeconfigname);
cdh_ToLower( filename, filename);
sts = lfu_IncrementAndGetVersion( filename, &plc_version);
if ( EVEN(sts)) return sts;
sprintf( plcname, load_cNamePlc, "", cdh_Low(nodename), bus, (int)plc_version);
sts = gcg_comp_rtnode( nodename, os,
bus, 1, &errorcount, &warningcount, debug, node_vollist,
node_vollist_count, plc_version, single_scantime);
node_vollist_count, 0, single_scantime);
if ( EVEN(sts)) return sts;
if ( sts == GSX__NOPLC)
plc_version = 0;
noplc = 1;
else
noplc = 0;
/* Open the file and print boot data */
sprintf( filename, load_cNameBoot,
......@@ -356,8 +354,22 @@ pwr_tStatus lfu_create_bootfile(
fprintf( file, "%s\n", systemgroup);
}
fprintf( file, "%s %s\n", plcname, cdh_VolumeIdToString( NULL, 0, 0, 0));
plcproc_count = 0;
gcg_read_volume_plclist( first_volumelist_ptr->volume_id, 0, 0, 0, 0,
&plcproc_count, &plcproclist);
if ( noplc || plcproc_count == 0)
fprintf( file, "-\n");
else {
for ( i = 0; i < (int)plcproc_count; i++) {
if ( i != 0)
fprintf( file, ",");
strncpy( plcname, cdh_Low(plcproclist[i].name), sizeof(plcname));
fprintf( file, load_cNamePlc, "", cdh_Low(nodename), bus, plcname);
}
fprintf( file, "\n");
}
node_vollist_count = 0;
volumelist_ptr = first_volumelist_ptr;
utl_toupper( vollistname_upper, volumelist_ptr->p1);
......@@ -1342,8 +1354,8 @@ pwr_tStatus lfu_SaveDirectoryVolume(
free( (char *) single_scan_ptr);
lfu_check_appl_file( nodename_ptr, *bus_number_ptr);
// lfu_check_opt_file( nodename_ptr, *bus_number_ptr, (pwr_mOpSys) os);
lfu_check_appl_file( ldhses, nodename_ptr, *bus_number_ptr);
// lfu_check_opt_file( ldhses, nodename_ptr, *bus_number_ptr, (pwr_mOpSys) os);
/* Find the volumes in this node */
sts = ldh_GetChild( ldhses, nodeobjid, &volobjid);
......@@ -2011,10 +2023,15 @@ pwr_tStatus lfu_SaveDirectoryVolume(
char str[2000] = "";
FILE *optfile;
char dir[80];
pwr_tObjName plcproc;
if ( os == pwr_mOpSys_CustomBuild && custom_os == pwr_mOpSys__)
break;
sts = ldh_ObjidToName( ldhses, applobjid, ldh_eName_Object,
appl_name, sizeof(appl_name), &size);
if ( EVEN(sts)) return sts;
sts = ldh_GetObjectBody( ldhses, applobjid, "RtBody", (void **)&bop, &size);
if ( EVEN(sts)) return sts;
......@@ -2098,13 +2115,23 @@ pwr_tStatus lfu_SaveDirectoryVolume(
else
sprintf( &str[strlen(str)], "-lpwr_nodave_dummy ");
if ( strcmp( bop->PlcProcess, "") == 0) {
char msg[200];
sprintf( msg, "Error in BuildOptions object '%s', PlcProcess is missing\n",
appl_name);
MsgWindow::message( 'E', msg, msgw_ePop_Default);
syntax_error = 1;
free( (char *)bop);
}
else {
strncpy( plcproc, bop->PlcProcess, sizeof(plcproc));
free( (char *)bop);
if ( os == pwr_mOpSys_CustomBuild)
sprintf( dir, "$pwrp_root/bld/%s/exe/", cdh_OpSysToStr( (pwr_mOpSys)custom_os));
else
sprintf( dir, "$pwrp_root/bld/%s/exe/", cdh_OpSysToStr( (pwr_mOpSys)os));
sprintf( fname, load_cNameOpt, dir, nodename_ptr, *bus_number_ptr);
sprintf( fname, load_cNameOpt, dir, nodename_ptr, *bus_number_ptr, cdh_Low(plcproc));
dcli_translate_filename( fname, fname);
optfile = fopen( fname, "w");
if ( optfile == 0) {
......@@ -2115,6 +2142,7 @@ pwr_tStatus lfu_SaveDirectoryVolume(
}
fprintf( optfile, "%s", str);
fclose( optfile);
}
break;
}
default: ;
......@@ -2667,76 +2695,84 @@ pwr_tStatus lfu_ReadBootFile(
pwr_tVolumeId **vollist,
pwr_tString40 **volnamelist,
int *volcount,
char *plc_name
pwr_tString80 **plclist,
int *plccount
)
{
FILE *file;
char timstr[40];
char vol_name[40];
char vol_str[20];
int plc_found;
pwr_tVolumeId volid;
pwr_tStatus sts;
char fname[120];
char buff[1000];
pwr_tString80 plcarray[50];
dcli_translate_filename( fname, filename);
file = fopen( fname, "r");
if ( file == 0)
return LFU__NOFILE;
if (fgets( timstr, sizeof( timstr), file) == NULL)
{
if (fgets( timstr, sizeof( timstr), file) == NULL) {
fclose( file);
return LFU__FILECRP;
}
sts = time_AsciiToA(timstr, date);
if ( EVEN(sts)) return sts;
if ( EVEN(sts))
{
if ( EVEN(sts)) {
fclose( file);
return sts;
}
if ( utl_read_line( systemname, sizeof(pwr_tString80), file, NULL) == 0)
{
if ( utl_read_line( systemname, sizeof(pwr_tString80), file, NULL) == 0) {
fclose( file);
return LFU__FILECRP;
}
if ( utl_read_line( systemgroup, sizeof(pwr_tString80), file, NULL) == 0)
{
if ( utl_read_line( systemgroup, sizeof(pwr_tString80), file, NULL) == 0) {
fclose( file);
return LFU__FILECRP;
}
if ( utl_read_line( buff, sizeof(buff), file, NULL) == 0) {
fclose( file);
return LFU__FILECRP;
}
if ( plclist) {
if ( buff[0] == '-') {
*plccount = 0;
*plclist = (pwr_tString80 *)0;
}
else {
*plccount = dcli_parse( buff, ",", "", (char *)plcarray,
sizeof(plcarray)/sizeof(plcarray[0]),
sizeof(plcarray[0]), 0);
*plclist = (pwr_tString80 *) calloc( *plccount, sizeof(pwr_tString80));
memcpy( *plclist, plcarray, *plccount * sizeof(pwr_tString80));
}
}
if ( vollist) {
*volcount = 0;
*vollist =
(pwr_tVolumeId *) calloc( LFU_MAX_NODE_VOLUMES, sizeof(**vollist));
*volnamelist =
(pwr_tString40 *) calloc( LFU_MAX_NODE_VOLUMES, sizeof(**volnamelist));
plc_found = 0;
while ( fscanf( file, "%s %s", vol_name, vol_str) == 2) {
sts = cdh_StringToVolumeId( vol_str, &volid);
if ( EVEN(sts)) {
fclose( file);
return sts;
}
if ( *volcount == 0 && volid == 0) {
strcpy( plc_name, vol_name);
plc_found = 1;
continue;
}
*(*vollist + *volcount) = volid;
strcpy( *(*volnamelist + *volcount), vol_name);
(*volcount)++;
}
}
fclose( file);
if ( !plc_found)
strcpy( plc_name, "");
return LFU__SUCCESS;
}
......@@ -2961,7 +2997,8 @@ pwr_tStatus lfu_ParseDbmsServer( char *server, char *user, char *password,
return LFU__SUCCESS;
}
pwr_tStatus lfu_check_appl_file( char *nodename, int bus_number)
pwr_tStatus lfu_check_appl_file( ldh_tSesContext ldhses,
char *nodename, int bus_number)
{
pwr_tFileName fname;
pwr_tTime t;
......@@ -2993,7 +3030,7 @@ pwr_tStatus lfu_check_appl_file( char *nodename, int bus_number)
"# System processes" << endl <<
"# System processes can be disabled by removing the #" << endl <<
"#pwr_neth, , noload, norun, , 5, debug, \"\"" << endl <<
"#pwr_plc, , noload, norun, , , debug, \"\"" << endl <<
"#pwr_plc_plc, , noload, norun, , , debug, \"\"" << endl <<
"#pwr_alim, , noload, norun, , 5, debug, \"\"" << endl <<
"#pwr_emon, , noload, norun, , 10, debug, \"\"" << endl <<
"#pwr_tmon, , noload, norun, , 5, debug, \"\"" << endl <<
......@@ -3021,22 +3058,36 @@ pwr_tStatus lfu_check_appl_file( char *nodename, int bus_number)
return LFU__SUCCESS;
}
pwr_tStatus lfu_check_opt_file( char *nodename, int bus_number, pwr_mOpSys opsys)
pwr_tStatus lfu_check_opt_file( ldh_tSesContext ldhses, char *nodename, int bus_number,
pwr_mOpSys opsys)
{
pwr_tFileName fname;
pwr_tTime t;
char dir[80];
pwr_tFileName dir;
pwr_tObjName name;
int size;
pwr_tStatus sts;
pwr_tOid oid;
sprintf( dir, "$pwrp_root/%s/exe/", cdh_OpSysToStr( opsys));
sprintf( fname, load_cNameOpt, dir, nodename, bus_number);
for ( sts = ldh_GetClassList( ldhses, pwr_cClass_PlcProcess, &oid);
ODD(sts);
sts = ldh_GetNextObject( ldhses, oid, &oid)) {
sts = ldh_ObjidToName( ldhses, oid, ldh_eName_Object,
name, sizeof(name), &size);
if( EVEN(sts)) return sts;
sprintf( fname, load_cNameOpt, dir, nodename, bus_number, cdh_Low(name));
dcli_translate_filename( fname, fname);
if ( ODD(dcli_file_time( fname, &t)))
return LFU__SUCCESS;
continue;
strcat( fname, "_template");
if ( ODD(dcli_file_time( fname, &t)))
return LFU__SUCCESS;
continue;
// Create a template file
ofstream fp( fname);
......@@ -3052,12 +3103,13 @@ pwr_tStatus lfu_check_opt_file( char *nodename, int bus_number, pwr_mOpSys opsys
case pwr_mOpSys_X86_64_MACOS:
case pwr_mOpSys_CustomBuild:
fp <<
"$pwr_obj/rt_io_user.o -lpwr_rt -lpwr_usbio_dummy" << endl;
"$pwr_obj/rt_io_user.o -lpwr_rt -lpwr_pnak_dummy -lpwr_cifx_dummy -lpwr_usb_dummy -lpwr_usbio_dummy -lpwr_nodave_dummy" << endl;
break;
default : ;
}
fp.close();
}
return LFU__SUCCESS;
}
......
......@@ -115,7 +115,8 @@ pwr_tStatus lfu_ReadBootFile( char *filename,
pwr_tVolumeId **vollist,
pwr_tString40 **volnamelist,
int *volcount,
char *plc_name);
pwr_tString80 **plclist,
int *plccount);
pwr_tStatus lfu_ReadSysObjectFile( char *SystemName,
char *SystemGroup);
......@@ -136,8 +137,9 @@ pwr_tStatus lfu_GetVolumeCnf( char *name, pwr_tVid *vid, pwr_tCid *cid, ldh_eVol
pwr_tStatus lfu_ParseDbmsServer( char *server, char *user, char *passw,
unsigned int *port, char *host);
pwr_tStatus lfu_check_appl_file( char *nodename, int bus_number);
pwr_tStatus lfu_check_opt_file( char *nodename, int bus_number, pwr_mOpSys opsys);
pwr_tStatus lfu_check_appl_file( ldh_tSesContext ldhses,
char *nodename, int bus_number);
pwr_tStatus lfu_check_opt_file( ldh_tSesContext ldhses, char *nodename, int bus_number, pwr_mOpSys opsys);
#ifdef __cplusplus
}
......
......@@ -176,7 +176,8 @@ void wb_pkg::readConfig()
pwr_tVolumeId *vollist;
pwr_tString40 *volnamelist;
int volcount;
char plcname[80];
pwr_tString80 *plclist;
int plccount;
char systemname[80];
char systemgroup[80];
pwr_tTime date;
......@@ -199,12 +200,12 @@ void wb_pkg::readConfig()
// Read bootfile, get plc and volumes
sts = lfu_ReadBootFile( fname, &date, systemname,
systemgroup, &vollist, &volnamelist, &volcount, plcname);
systemgroup, &vollist, &volnamelist, &volcount, &plclist, &plccount);
if ( EVEN(sts))
throw wb_error_str("Bootfile is corrupt");
// Add plc
if ( plcname[0] != 0) {
for ( int j = 0; j < plccount; j++) {
pwr_tFileName dir;
if ( n.opsys() == pwr_mOpSys_CustomBuild &&
......@@ -212,7 +213,7 @@ void wb_pkg::readConfig()
sprintf( dir, "$pwrp_root/bld/%s/exe/", n.customPlatform());
else
sprintf( dir, "$pwrp_root/bld/%s/exe/", cdh_OpSysToStr( n.opsys()));
sprintf( fname, "%s%s", dir, plcname);
sprintf( fname, "%s%s", dir, plclist[j]);
sprintf( dir, "$pwrp_exe/");
pkg_pattern pplc( fname, dir, 'W');
n.push_back( pplc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment