@@ -25,20 +25,23 @@ package body LSP.Job_Schedulers is
25
25
(LSP.Server_Jobs.Server_Job'Class, LSP.Server_Jobs.Server_Job_Access);
26
26
27
27
procedure Complete_Last_Fence_Job
28
- (Self : in out Job_Scheduler'Class;
29
- Next : LSP.Server_Messages.Server_Message_Access);
28
+ (Self : in out Job_Scheduler'Class;
29
+ Next : LSP.Server_Messages.Server_Message_Access;
30
+ Waste : out LSP.Server_Messages.Server_Message_Access);
30
31
-- Call Complete on the last done Fence job (if any) and free it
31
32
32
33
-- ---------------------------
33
34
-- Complete_Last_Fence_Job --
34
35
-- ---------------------------
35
36
36
37
procedure Complete_Last_Fence_Job
37
- (Self : in out Job_Scheduler'Class;
38
- Next : LSP.Server_Messages.Server_Message_Access) is
38
+ (Self : in out Job_Scheduler'Class;
39
+ Next : LSP.Server_Messages.Server_Message_Access;
40
+ Waste : out LSP.Server_Messages.Server_Message_Access) is
39
41
begin
40
42
if Self.Done.Assigned then
41
43
Self.Done.Complete (Next);
44
+ Waste := Self.Done.Message;
42
45
Free (Self.Done);
43
46
end if ;
44
47
end Complete_Last_Fence_Job ;
@@ -116,22 +119,6 @@ package body LSP.Job_Schedulers is
116
119
is
117
120
use all type LSP.Server_Jobs.Job_Priority;
118
121
119
- procedure Execute (Job : LSP.Server_Jobs.Server_Job_Access);
120
-
121
- -- -----------
122
- -- Execute --
123
- -- -----------
124
-
125
- procedure Execute (Job : LSP.Server_Jobs.Server_Job_Access) is
126
- begin
127
- Self.Complete_Last_Fence_Job (Job.Message);
128
- Waste := Job.Message;
129
-
130
- while not Job.Is_Done loop
131
- Job.Execute (Client);
132
- end loop ;
133
- end Execute ;
134
-
135
122
Job : LSP.Server_Jobs.Server_Job_Access renames Self.Blocker;
136
123
begin
137
124
if not Job.Assigned then
@@ -149,12 +136,23 @@ package body LSP.Job_Schedulers is
149
136
return ;
150
137
end if ;
151
138
end loop ;
139
+ end if ;
140
+
141
+ Self.Complete_Last_Fence_Job (Job.Message, Waste);
152
142
153
- Execute (Job);
143
+ if Waste.Assigned and Job.Priority /= Fence then
144
+ return ;
145
+ end if ;
146
+
147
+ while not Job.Is_Done loop
148
+ Job.Execute (Client);
149
+ end loop ;
150
+
151
+ if Job.Priority = Fence then
154
152
Self.Done := Job; -- keep Job live till Complete call
155
153
Job := null ;
156
154
else
157
- Execute ( Job) ;
155
+ Waste := Job.Message ;
158
156
Free (Job);
159
157
end if ;
160
158
end Process_High_Priority_Job ;
@@ -173,8 +171,13 @@ package body LSP.Job_Schedulers is
173
171
declare
174
172
Job : LSP.Server_Jobs.Server_Job_Access := List.First_Element;
175
173
begin
174
+ Self.Complete_Last_Fence_Job (Job.Message, Waste);
175
+
176
+ if Waste.Assigned then
177
+ return ;
178
+ end if ;
179
+
176
180
List.Delete_First;
177
- Self.Complete_Last_Fence_Job (Job.Message);
178
181
Job.Execute (Client);
179
182
180
183
if Job.Is_Done then
@@ -189,7 +192,7 @@ package body LSP.Job_Schedulers is
189
192
end ;
190
193
end loop ;
191
194
192
- Self.Complete_Last_Fence_Job (null );
195
+ Self.Complete_Last_Fence_Job (null , Waste );
193
196
end Process_Job ;
194
197
195
198
-- --------------------
0 commit comments