hedgewars/uFLIPC.pas
branchqmlfrontend
changeset 12858 0c6fb706f747
parent 11460 9f2fb0031ef0
child 12859 a03f245243b0
equal deleted inserted replaced
12857:90f927b4b9e1 12858:0c6fb706f747
    10 procedure ipcSetEngineBarrier();
    10 procedure ipcSetEngineBarrier();
    11 procedure ipcRemoveBarrierFromEngineQueue();
    11 procedure ipcRemoveBarrierFromEngineQueue();
    12 //function  ipcReadFromEngine: shortstring;
    12 //function  ipcReadFromEngine: shortstring;
    13 //function  ipcCheckFromEngine: boolean;
    13 //function  ipcCheckFromEngine: boolean;
    14 
    14 
    15 procedure ipcToNet(s: shortstring);
       
    16 procedure ipcToNetRaw(p: pointer; len: Longword);
       
    17 
       
    18 procedure ipcToFrontend(s: shortstring);
    15 procedure ipcToFrontend(s: shortstring);
    19 procedure ipcToFrontendRaw(p: pointer; len: Longword);
    16 procedure ipcToFrontendRaw(p: pointer; len: Longword);
    20 function ipcReadFromFrontend: TIPCMessage;
    17 function ipcReadFromFrontend: TIPCMessage;
    21 function ipcCheckFromFrontend: boolean;
    18 function ipcCheckFromFrontend: boolean;
    22 
    19 
    23 procedure registerIPCCallback(p: pointer; f: TIPCCallback);
    20 procedure registerIPCCallback(p: pointer; f: TIPCCallback);
    24 procedure registerNetCallback(p: pointer; f: TIPCCallback);
       
    25 
    21 
    26 implementation
    22 implementation
    27 
    23 
    28 var callbackPointerF: pointer;
    24 var callbackPointerF: pointer;
    29     callbackFunctionF: TIPCCallback;
    25     callbackFunctionF: TIPCCallback;
    30     callbackListenerThreadF: PSDL_Thread;
    26     callbackListenerThreadF: PSDL_Thread;
    31     callbackPointerN: pointer;
    27     queueFrontend, queueEngine: PIPCQueue;
    32     callbackFunctionN: TIPCCallback;
       
    33     callbackListenerThreadN: PSDL_Thread;
       
    34     queueFrontend, queueEngine, queueNet: PIPCQueue;
       
    35 
    28 
    36 procedure ipcSend(var s: TIPCMessage; queue: PIPCQueue);
    29 procedure ipcSend(var s: TIPCMessage; queue: PIPCQueue);
    37 var pmsg: PIPCMessage;
    30 var pmsg: PIPCMessage;
    38 begin
    31 begin
    39     SDL_LockMutex(queue^.mut);
    32     SDL_LockMutex(queue^.mut);
   172     q^.msg.buf:= nil;
   165     q^.msg.buf:= nil;
   173 
   166 
   174     SDL_UnlockMutex(q^.mut);
   167     SDL_UnlockMutex(q^.mut);
   175 end;
   168 end;
   176 
   169 
   177 procedure ipcToNet(s: shortstring);
       
   178 var msg: TIPCMessage;
       
   179 begin
       
   180     msg.str:= s;
       
   181     msg.buf:= nil;
       
   182     ipcSend(msg, queueNet)
       
   183 end;
       
   184 
       
   185 procedure ipcToEngineRaw(p: pointer; len: Longword);
   170 procedure ipcToEngineRaw(p: pointer; len: Longword);
   186 var msg: TIPCMessage;
   171 var msg: TIPCMessage;
   187 begin
   172 begin
   188     msg.str[0]:= #0;
   173     msg.str[0]:= #0;
   189     msg.len:= len;
   174     msg.len:= len;
   200     msg.buf:= GetMem(len);
   185     msg.buf:= GetMem(len);
   201     Move(p^, msg.buf^, len);
   186     Move(p^, msg.buf^, len);
   202     ipcSend(msg, queueFrontend)
   187     ipcSend(msg, queueFrontend)
   203 end;
   188 end;
   204 
   189 
   205 procedure ipcToNetRaw(p: pointer; len: Longword);
       
   206 var msg: TIPCMessage;
       
   207 begin
       
   208     msg.str[0]:= #0;
       
   209     msg.len:= len;
       
   210     msg.buf:= GetMem(len);
       
   211     Move(p^, msg.buf^, len);
       
   212     ipcSend(msg, queueNet)
       
   213 end;
       
   214 
       
   215 function ipcReadFromEngine: TIPCMessage;
   190 function ipcReadFromEngine: TIPCMessage;
   216 begin
   191 begin
   217     ipcReadFromEngine:= ipcRead(queueFrontend)
   192     ipcReadFromEngine:= ipcRead(queueFrontend)
   218 end;
   193 end;
   219 
   194 
   220 function ipcReadFromFrontend: TIPCMessage;
   195 function ipcReadFromFrontend: TIPCMessage;
   221 begin
   196 begin
   222     ipcReadFromFrontend:= ipcRead(queueEngine)
   197     ipcReadFromFrontend:= ipcRead(queueEngine)
   223 end;
       
   224 
       
   225 function ipcReadToNet: TIPCMessage;
       
   226 begin
       
   227     ipcReadToNet:= ipcRead(queueNet)
       
   228 end;
   198 end;
   229 
   199 
   230 function ipcCheckFromEngine: boolean;
   200 function ipcCheckFromEngine: boolean;
   231 begin
   201 begin
   232     ipcCheckFromEngine:= ipcCheck(queueFrontend)
   202     ipcCheckFromEngine:= ipcCheck(queueFrontend)
   251             FreeMem(msg.buf, msg.len)
   221             FreeMem(msg.buf, msg.len)
   252         end
   222         end
   253     until false
   223     until false
   254 end;
   224 end;
   255 
   225 
   256 function  netListener(p: pointer): Longint; cdecl; export;
       
   257 var msg: TIPCMessage;
       
   258 begin
       
   259     netListener:= 0;
       
   260     repeat
       
   261         msg:= ipcReadToNet();
       
   262         if msg.buf = nil then
       
   263             callbackFunctionN(callbackPointerN, @msg.str[1], byte(msg.str[0]))
       
   264         else
       
   265         begin
       
   266             callbackFunctionN(callbackPointerN, msg.buf, msg.len);
       
   267             FreeMem(msg.buf, msg.len)
       
   268         end
       
   269     until false
       
   270 end;
       
   271 
       
   272 procedure registerIPCCallback(p: pointer; f: TIPCCallback);
   226 procedure registerIPCCallback(p: pointer; f: TIPCCallback);
   273 begin
   227 begin
   274     callbackPointerF:= p;
   228     callbackPointerF:= p;
   275     callbackFunctionF:= f;
   229     callbackFunctionF:= f;
   276     callbackListenerThreadF:= SDL_CreateThread(@engineListener, 'engineListener', nil);
   230     callbackListenerThreadF:= SDL_CreateThread(@engineListener, 'engineListener', nil);
   277 end;
       
   278 
       
   279 procedure registerNetCallback(p: pointer; f: TIPCCallback);
       
   280 begin
       
   281     callbackPointerN:= p;
       
   282     callbackFunctionN:= f;
       
   283     callbackListenerThreadN:= SDL_CreateThread(@netListener, 'netListener', nil);
       
   284 end;
   231 end;
   285 
   232 
   286 function createQueue: PIPCQueue;
   233 function createQueue: PIPCQueue;
   287 var q: PIPCQueue;
   234 var q: PIPCQueue;
   288 begin
   235 begin
   306 
   253 
   307 procedure initIPC;
   254 procedure initIPC;
   308 begin
   255 begin
   309     queueFrontend:= createQueue;
   256     queueFrontend:= createQueue;
   310     queueEngine:= createQueue;
   257     queueEngine:= createQueue;
   311     queueNet:= createQueue;
       
   312 
   258 
   313     callbackPointerF:= nil;
   259     callbackPointerF:= nil;
   314     callbackListenerThreadF:= nil;
   260     callbackListenerThreadF:= nil;
   315 end;
   261 end;
   316 
   262 
   317 procedure freeIPC;
   263 procedure freeIPC;
   318 begin
   264 begin
   319     //FIXME SDL_KillThread(callbackListenerThreadF);
   265     //FIXME SDL_KillThread(callbackListenerThreadF);
   320     //FIXME SDL_KillThread(callbackListenerThreadN);
       
   321     destroyQueue(queueFrontend);
   266     destroyQueue(queueFrontend);
   322     destroyQueue(queueEngine);
   267     destroyQueue(queueEngine);
   323     destroyQueue(queueNet);
       
   324 end;
   268 end;
   325 
   269 
   326 end.
   270 end.