equal
deleted
inserted
replaced
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; |