hedgewars/uFLRunQueue.pas
author unc0rr
Thu, 17 Dec 2015 00:51:20 +0300
branchqmlfrontend
changeset 11464 30397f91571c
parent 11461 ab77e2ea2f82
child 11465 9f2fb0031ef0
permissions -rw-r--r--
Fix a ton of bugs in engine instances queue and ipc

unit uFLRunQueue;
interface
uses uFLTypes;

procedure queueExecution(var config: TGameConfig);
procedure passFlibEvent(p: pointer); cdecl;

implementation
uses uFLGameConfig, hwengine, uFLThemes, uFLUICallback, uFLIPC;

var runQueue: PGameConfig = nil;

procedure nextRun;
begin
    if runQueue <> nil then
    begin
    writeln('RUNNING ', runQueue^.gameType);
        if runQueue^.gameType = gtPreview then
            sendUI(mtRenderingPreview, nil, 0);

        ipcRemoveBarrierFromEngineQueue();
        RunEngine(runQueue^.argumentsNumber, @runQueue^.argv);
    end
end;

procedure cleanupConfig;
var t: PGameConfig;
begin
    t:= runQueue;
    runQueue:= t^.nextConfig;
    dispose(t)
end;

procedure queueExecution(var config: TGameConfig);
var pConfig, t, tt: PGameConfig;
    i: Longword;
begin
    writeln('QUEUE EXECUTION ', config.gameType);
    new(pConfig);
    pConfig^:= config;

    with pConfig^ do
    begin
        nextConfig:= nil;

        for i:= 0 to Pred(MAXARGS) do
        begin
            if arguments[i][0] = #255 then
                arguments[i][255]:= #0
            else
                arguments[i][byte(arguments[i][0]) + 1]:= #0;
            argv[i]:= @arguments[i][1]
        end;
    end;

    if runQueue = nil then
    begin
        runQueue:= pConfig;

        ipcSetEngineBarrier();
        sendConfig(pConfig);
        nextRun
    end else
    begin
        t:= runQueue;
        while t^.nextConfig <> nil do 
        begin
            if false and (pConfig^.gameType = gtPreview) and (t^.nextConfig^.gameType = gtPreview) and (t <> runQueue) then
            begin
                tt:= t^.nextConfig;
                pConfig^.nextConfig:= tt^.nextConfig;
                t^.nextConfig:= pConfig;
                dispose(tt);
                exit // boo
            end;
            t:= t^.nextConfig;
        end;

        ipcSetEngineBarrier();
        sendConfig(pConfig);
        t^.nextConfig:= pConfig
    end;
end;

procedure passFlibEvent(p: pointer); cdecl;
begin
    case TFLIBEvent(p^) of
        flibGameFinished: begin
                cleanupConfig;
                nextRun
            end;
        flibRunNetGame: begin
                runNetGame
            end;
    end;
end;

end.