146 lines
3.8 KiB
JavaScript
146 lines
3.8 KiB
JavaScript
|
/*
|
||
|
|
||
|
master.js
|
||
|
|
||
|
Starts "harness.js" to manage a distributed build
|
||
|
This script must be very responsive to Exec calls -
|
||
|
we don't want to hang the UI at all.
|
||
|
|
||
|
It uses MsgQueue to communicate with Harness. This lets
|
||
|
us easily avoid waiting for harness when it is communicating
|
||
|
with remote machines.
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
Include('types.js');
|
||
|
Include('utils.js');
|
||
|
Include('MsgQueue.js');
|
||
|
|
||
|
var g_HarnessQueue;
|
||
|
var g_fUpdatePublicData = false;
|
||
|
var g_nHarnessTimeout = 8000;
|
||
|
var g_nUpdateTimeout = 2000;
|
||
|
|
||
|
var ERROR = 'error';
|
||
|
|
||
|
var HARNESS_SYNCS = ['HarnessThreadReady','HarnessThreadFailed'];
|
||
|
|
||
|
function master_js::OnScriptError(strFile, nLine, nChar, strText, sCode, strSource, strDescription)
|
||
|
{
|
||
|
return CommonOnScriptError("master_js", strFile, nLine, nChar, strText, sCode, strSource, strDescription);
|
||
|
}
|
||
|
|
||
|
function master_js::ScriptMain()
|
||
|
{
|
||
|
var nEvent;
|
||
|
LogMsg('ScriptMain()');
|
||
|
CommonVersionCheck(/* $DROPVERSION: */ "V(########) F(!!!!!!!!!!!!!!)" /* $ */);
|
||
|
|
||
|
PrivateData.fnExecScript = MasterRemoteExec;
|
||
|
|
||
|
g_HarnessQueue = new MsgQueue('harness');
|
||
|
ResetSync(HARNESS_SYNCS.toString());
|
||
|
SpawnScript('harness.js', g_HarnessQueue);
|
||
|
var nWait = WaitForMultipleSyncs(HARNESS_SYNCS.toString(), false, g_nHarnessTimeout);
|
||
|
if (nWait == 1)
|
||
|
{
|
||
|
SignalThreadSync('MasterThreadReady');
|
||
|
do
|
||
|
{
|
||
|
nEvent = g_HarnessQueue.WaitForMsgAndDispatch('MasterThreadExit', MasterMsgProc, g_nUpdateTimeout);
|
||
|
if (g_fUpdatePublicData)
|
||
|
{
|
||
|
g_fUpdatePublicData = false;
|
||
|
NotifyUpdatePublicData();
|
||
|
}
|
||
|
} while (nEvent != 1);
|
||
|
LogMsg('ScriptMain() EXIT');
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
LogMsg('master::failed to launch mode script nWait is ' + nWait);
|
||
|
|
||
|
SignalThreadSync('MasterThreadFailed');
|
||
|
LogMsg('ScriptMain() EXIT');
|
||
|
}
|
||
|
|
||
|
// MTScript.Remote
|
||
|
function MasterMsgProc(queue, params)
|
||
|
{
|
||
|
OLogMsg('MasterMsgProc ! ' + params);
|
||
|
}
|
||
|
|
||
|
function MasterRemoteExec(cmd, params)
|
||
|
{
|
||
|
LogMsg('MasterRemoteExec :' + cmd + ", params is: " + params);
|
||
|
var vRet = 'ok';
|
||
|
var msg;
|
||
|
// debugger;
|
||
|
switch (cmd)
|
||
|
{
|
||
|
case 'msgtest':
|
||
|
MsgTest();
|
||
|
break;
|
||
|
case 'terminate':
|
||
|
msg = g_HarnessQueue.SendMessage('harnessexit', 0);
|
||
|
g_HarnessQueue.WaitForMsg(msg);
|
||
|
break;
|
||
|
case 'abort':
|
||
|
LogMsg("asking harness to abort, then waiting");
|
||
|
msg = g_HarnessQueue.SendMessage('abort', 0);
|
||
|
g_HarnessQueue.WaitForMsg(msg);
|
||
|
break;
|
||
|
case 'remote':
|
||
|
LogMsg("Sending 'remote' cmd to harness, then waiting");
|
||
|
msg = g_HarnessQueue.SendMessage('remote', params);
|
||
|
g_HarnessQueue.WaitForMsg(msg);
|
||
|
vRet = msg.vReplyValue;
|
||
|
break;
|
||
|
default:
|
||
|
g_HarnessQueue.SendMessage(cmd, params);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
LogMsg('master::MasterRemoteExec returns: ' + vRet);
|
||
|
return vRet;
|
||
|
}
|
||
|
|
||
|
function master_js::OnProcessEvent(pid, evt, param)
|
||
|
{
|
||
|
LogMsg('OnProcessEvent('+pid+', '+evt+', '+param+') received!');
|
||
|
}
|
||
|
|
||
|
function NotifyUpdatePublicData()
|
||
|
{
|
||
|
JAssert(false);
|
||
|
var buildindex = 0;
|
||
|
|
||
|
EnsureArray(PrivateData.objEnviron, 'Machine');
|
||
|
var aMachine = PrivateData.objEnviron.Machine;
|
||
|
var strStatus = 'idle';
|
||
|
for (i = 0; i < aMachine.length; ++i)
|
||
|
{
|
||
|
var mach = PublicData.aBuild[buildindex].hMachine[aMachine[i].Name];
|
||
|
}
|
||
|
NotifyScript('UpdatePublicData', 0);
|
||
|
}
|
||
|
|
||
|
function MsgTest()
|
||
|
{
|
||
|
LogMsg('Message test!');
|
||
|
JAssert(false);
|
||
|
var msgs = new Array();
|
||
|
for(var i = 0; i < 10; ++i)
|
||
|
{
|
||
|
LogMsg('Sending message #' + (i + 1));
|
||
|
msgs[i] = g_HarnessQueue.SendMessage('test', 'Message #' + (i + 1));
|
||
|
}
|
||
|
|
||
|
for(i = 10; i > 0; --i)
|
||
|
{
|
||
|
LogMsg('Waiting for message #' + i);
|
||
|
g_HarnessQueue.WaitForMsg(msgs[i - 1]);
|
||
|
}
|
||
|
}
|