|
|
Include('types.js'); Include('utils.js');
var g_nThreads = 8; var g_nLoops = 1000; var g_fMsg = false; var g_DepthCounter = 0;
function stress_js::ScriptMain() { PrivateData.objUtil.fnStress = stresstest; PrivateData.fnExecScript = StressRemoteExec;
JSignalThreadSync('StressThreadReady');
JWaitForSync('StressThreadExit', 0); }
function StressRemoteExec(cmd, params) { var vRet = 'ok';
switch (cmd) { case "sleep": LogMsg("SLEEPING"); Sleep(10000); LogMsg("WAKING"); break; case "threads": StressThreads(); break; case 'ping': ping(1); break; case 'ping2': ping(2); break; case 'exec':
var pid = RunLocalCommand(params, '', 'Stress Program', false, true, false); if (pid == 0) vRet = GetLastRunLocalError(); else vRet = pid;
break;
case 'exec_noout':
var pid = RunLocalCommand(params, '', 'Stress Program', false, false, false, false, false); if (pid == 0) vRet = GetLastRunLocalError(); else vRet = pid;
break;
case 'getoutput': vRet = GetProcessOutput(params); break;
case 'send': var args = params.split(','); vRet = SendToProcess(args[0], args[1], ''); break;
default: vRet = 'invalid command: ' + cmd; }
return vRet; } function stress_js::OnProcessEvent(pid, evt, param) { NotifyScript('ProcEvent: ', pid+','+evt+','+param); }
function stress_js::OnEventSourceEvent(RemoteObj, DispID) { var RC_COPYSTARTED = 1; var RC_COPYFILE = 2; var RC_PROGRESS = 3; var RC_COPYERROR = 4; var RC_COPYDONE = 5;
debugger; if (g_robocopy == RemoteObj) { switch(DispID) { case RC_COPYSTARTED: case RC_COPYFILE : case RC_PROGRESS : case RC_COPYERROR : case RC_COPYDONE : break; } } }
function ping(nMode) { var nEvent; var i, j; var aStrPing = new Array(); var aStrWait = new Array(); for(j = 0; j < g_nThreads; ++j) { ResetSync("pingtestThreadExit,pingtestThreadReady"); aStrPing[j] = "ping" + j; aStrWait[j] = "wait" + j;
SpawnScript('pingtest.js', aStrPing[j] + "," + aStrWait[j]); nEvent = JWaitForSync('pingtestThreadReady', 1000); if (nEvent == 0) { LogMsg("timeout on pingtest " + j); JSignalThreadSync("pingtestThreadExit"); return; } }
ResetSync(aStrWait.toString()); for(i = 0; i < g_nLoops; ++i) { // if (i % 100 == 0)
LogMsg("Signal #" + (i + 1));
JSignalThreadSync(aStrPing.toString());
if (nMode == 1) JWaitForMultipleSyncs(aStrWait.toString(), true, 0); else { for(j = 0; j < g_nThreads; ++j) JWaitForSync(aStrWait[j], 0); } ResetSync(aStrWait.toString()); } JSignalThreadSync("pingtestThreadExit"); }
function StressThreads() { var nEvent; var i, j; for(j = 0; j < g_nThreads; ++j) { ResetSync("threadstestThreadExit,threadstestThreadReady");
SpawnScript('threadstest.js', "stresswait,Thread#" + j); nEvent = JWaitForSync('threadstestThreadReady', 1000); if (nEvent == 0) { LogMsg("timeout on threadtest " + j); JSignalThreadSync("threadThreadExit"); return; } } JSignalThreadSync("stresswait"); Sleep(1000); JSignalThreadSync("threadstestThreadExit"); }
function JSignalThreadSync(strSigs) { if (g_fMsg) LogMsg("SIGNALLING " + strSigs);
SignalThreadSync(strSigs); }
function JWaitForMultipleSyncs(strSigs, fWaitAll, nTimeOut) { if (g_fMsg) LogMsg("WAITING " + strSigs);
var nEvent = WaitForMultipleSyncs(strSigs, fWaitAll, nTimeOut); if (g_fMsg) { if (nEvent == 0) LogMsg("TIMEOUT"); else LogMsg("RECEIVED " + strSigs.split(',')[nEvent - 1]); } return nEvent; }
function JWaitForSync(strSigs, nTimeOut) { if (g_fMsg) return JWaitForMultipleSyncs(strSigs, false, nTimeOut);
return WaitForSync(strSigs, nTimeOut); }
function stresstest(strID) { var i; var n = ++g_DepthCounter; var x; var y;
LogMsg("On entry(" + strID + "), stress test depth is " + g_DepthCounter); for(i = 0 ; i < 50; ++i) {
for(x in PublicData) { if (!PublicData.__isPublicMember(x)) continue; y = PublicData[x]; }
} LogMsg("On exit(" + strID + "), stress test depth is " + g_DepthCounter + " was " + n); --g_DepthCounter; }
|