windows-nt/Source/XPSP1/NT/sdktools/mtscript/scripts/stress.js
2020-09-26 16:20:57 +08:00

234 lines
5.2 KiB
JavaScript

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;
}