hedgewars/uFLIPC.pas
branchqmlfrontend
changeset 11457 78860824b5a5
parent 11456 6e9b12864856
child 11459 3c5d99013baf
equal deleted inserted replaced
11456:6e9b12864856 11457:78860824b5a5
     5 procedure initIPC;
     5 procedure initIPC;
     6 procedure freeIPC;
     6 procedure freeIPC;
     7 
     7 
     8 procedure ipcToEngine(s: shortstring);
     8 procedure ipcToEngine(s: shortstring);
     9 procedure ipcToEngineRaw(p: pointer; len: Longword);
     9 procedure ipcToEngineRaw(p: pointer; len: Longword);
    10 procedure ipcCleanEngineQueue();
    10 procedure ipcSetEngineBarrier();
       
    11 procedure ipcRemoveBarrierFromEngineQueue();
    11 //function  ipcReadFromEngine: shortstring;
    12 //function  ipcReadFromEngine: shortstring;
    12 //function  ipcCheckFromEngine: boolean;
    13 //function  ipcCheckFromEngine: boolean;
    13 
    14 
    14 procedure ipcToNet(s: shortstring);
    15 procedure ipcToNet(s: shortstring);
    15 procedure ipcToNetRaw(p: pointer; len: Longword);
    16 procedure ipcToNetRaw(p: pointer; len: Longword);
    36 var pmsg: PIPCMessage;
    37 var pmsg: PIPCMessage;
    37 begin
    38 begin
    38     SDL_LockMutex(queue^.mut);
    39     SDL_LockMutex(queue^.mut);
    39 
    40 
    40     s.next:= nil;
    41     s.next:= nil;
       
    42     s.barrier:= 0;
    41 
    43 
    42     if (queue^.msg.next = nil) and (queue^.msg.str[0] = #0) and (queue^.msg.buf = nil) then
    44     if (queue^.msg.next = nil) and (queue^.msg.str[0] = #0) and (queue^.msg.buf = nil) then
    43     begin
    45     begin
    44         queue^.msg:= s;
    46         queue^.msg:= s;
    45     end else
    47     end else
    55 
    57 
    56 function ipcRead(queue: PIPCQueue): TIPCMessage;
    58 function ipcRead(queue: PIPCQueue): TIPCMessage;
    57 var pmsg: PIPCMessage;
    59 var pmsg: PIPCMessage;
    58 begin
    60 begin
    59     SDL_LockMutex(queue^.mut);
    61     SDL_LockMutex(queue^.mut);
    60     while (queue^.msg.str[0] = #0) and (queue^.msg.buf = nil) and (queue^.msg.next = nil) do
    62     while ((queue^.msg.str[0] = #0) and (queue^.msg.buf = nil))
       
    63             and ((queue^.msg.barrier > 0) or (queue^.msg.next = nil) or ((queue^.msg.next^.barrier > 0) and (queue^.msg.next^.str[0] = #0) and (queue^.msg.next^.buf = nil))) do
    61         SDL_CondWait(queue^.cond, queue^.mut);
    64         SDL_CondWait(queue^.cond, queue^.mut);
    62 
    65 
    63     if (queue^.msg.str[0] <> #0) or (queue^.msg.buf <> nil) then
    66     if (queue^.msg.str[0] <> #0) or (queue^.msg.buf <> nil) then
    64         begin
    67         begin
    65             ipcRead:= queue^.msg;
    68             ipcRead:= queue^.msg;
    67             queue^.msg.buf:= nil;
    70             queue^.msg.buf:= nil;
    68         end else
    71         end else
    69         begin
    72         begin
    70             pmsg:= queue^.msg.next;
    73             pmsg:= queue^.msg.next;
    71             ipcRead:= pmsg^;
    74             ipcRead:= pmsg^;
    72             queue^.msg.next:= pmsg^.next;
    75             if pmsg^.barrier > 0 then
    73             if queue^.msg.next = nil then queue^.last:= @queue^.msg;
    76             begin
    74             dispose(pmsg)
    77                 pmsg^.str[0]:= #0;
       
    78                 pmsg^.buf:= nil
       
    79             end else
       
    80             begin
       
    81                 queue^.msg.next:= pmsg^.next;
       
    82                 if queue^.msg.next = nil then queue^.last:= @queue^.msg;
       
    83                 dispose(pmsg)
       
    84             end
    75         end;
    85         end;
    76 
    86 
    77     SDL_UnlockMutex(queue^.mut)
    87     SDL_UnlockMutex(queue^.mut)
    78 end;
    88 end;
    79 
    89 
    80 function ipcCheck(queue: PIPCQueue): boolean;
    90 function ipcCheck(queue: PIPCQueue): boolean;
    81 begin
    91 begin
    82     SDL_LockMutex(queue^.mut);
    92     SDL_LockMutex(queue^.mut);
    83     ipcCheck:= (queue^.msg.str[0] > #0) or (queue^.msg.buf <> nil) or (queue^.msg.next <> nil);
    93     ipcCheck:= (queue^.msg.str[0] > #0) or (queue^.msg.buf <> nil) or
       
    94                ((queue^.msg.barrier = 0) and (queue^.msg.next <> nil) and ((queue^.msg.next^.barrier = 0) or (queue^.msg.next^.str[0] <> #0) or (queue^.msg.next^.buf <> nil)));
    84     SDL_UnlockMutex(queue^.mut)
    95     SDL_UnlockMutex(queue^.mut)
    85 end;
    96 end;
    86 
    97 
    87 procedure ipcToEngine(s: shortstring);
    98 procedure ipcToEngine(s: shortstring);
    88 var msg: TIPCMessage;
    99 var msg: TIPCMessage;
    98     msg.str:= s;
   109     msg.str:= s;
    99     msg.buf:= nil;
   110     msg.buf:= nil;
   100     ipcSend(msg, queueFrontend)
   111     ipcSend(msg, queueFrontend)
   101 end;
   112 end;
   102 
   113 
   103 procedure ipcCleanEngineQueue();
   114 procedure ipcSetEngineBarrier();
       
   115 begin
       
   116     SDL_LockMutex(queueEngine^.mut);
       
   117 
       
   118     inc(queueEngine^.last^.barrier);
       
   119 
       
   120     SDL_UnlockMutex(queueEngine^.mut);
       
   121 end;
       
   122 
       
   123 procedure ipcRemoveBarrierFromEngineQueue();
   104 var pmsg, t: PIPCMessage;
   124 var pmsg, t: PIPCMessage;
   105     q: PIPCQueue;
   125     q: PIPCQueue;
   106 begin
   126 begin
   107     q:= queueEngine;
   127     q:= queueEngine;
   108 
   128 
   109     SDL_LockMutex(q^.mut);
   129     SDL_LockMutex(q^.mut);
   110 
   130 
   111     pmsg:= @q^.msg;
   131     pmsg:= @q^.msg;
   112     q^.last:= pmsg;
   132     q^.last:= @q^.msg;
   113 
   133 
   114     while pmsg <> nil do
   134     while pmsg <> nil do
   115     begin
   135     begin
   116         t:= pmsg^.next;
   136         t:= pmsg^.next;
       
   137         q^.msg.next:= t;
   117 
   138 
   118         if pmsg^.buf <> nil then
   139         if pmsg^.buf <> nil then
   119             FreeMem(pmsg^.buf, pmsg^.len);
   140             FreeMem(pmsg^.buf, pmsg^.len);
   120 
   141 
   121         if pmsg <> @q^.msg then
   142         if pmsg <> @q^.msg then
   122             dispose(pmsg);
   143             if pmsg^.barrier = 0 then
       
   144                 dispose(pmsg)
       
   145             else
       
   146             if pmsg^.barrier = 1 then
       
   147             begin
       
   148                 dispose(pmsg);
       
   149                 t:= nil
       
   150             end else
       
   151             begin
       
   152                 dec(pmsg^.barrier);
       
   153                 q^.msg.next:= pmsg;
       
   154                 t:= nil
       
   155             end
       
   156         else
       
   157             if pmsg^.barrier > 0 then 
       
   158             begin
       
   159                 dec(pmsg^.barrier);
       
   160                 t:= nil
       
   161             end;
       
   162 
   123         pmsg:= t
   163         pmsg:= t
   124     end;
   164     end;
   125 
   165 
   126     q^.msg.next:= nil;
       
   127     q^.msg.str[0]:= #0;
   166     q^.msg.str[0]:= #0;
   128     q^.msg.buf:= nil;
   167     q^.msg.buf:= nil;
   129 
   168 
   130     SDL_UnlockMutex(q^.mut);
   169     SDL_UnlockMutex(q^.mut);
   131 end;
   170 end;