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); |
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. |