|
@@ -21,6 +21,7 @@ var
|
|
writeindex: integer;
|
|
writeindex: integer;
|
|
fifo: array[0..1023] of pointer;
|
|
fifo: array[0..1023] of pointer;
|
|
done: boolean;
|
|
done: boolean;
|
|
|
|
+ freefifolock: trtlcriticalsection;
|
|
|
|
|
|
type
|
|
type
|
|
ttestarray = array[0..31] of pointer;
|
|
ttestarray = array[0..31] of pointer;
|
|
@@ -79,7 +80,9 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
freearray(p, sizeof(p) div sizeof(pointer));
|
|
freearray(p, sizeof(p) div sizeof(pointer));
|
|
|
|
+ entercriticalsection(freefifolock);
|
|
freearray(fifo, sizeof(fifo) div sizeof(pointer));
|
|
freearray(fifo, sizeof(fifo) div sizeof(pointer));
|
|
|
|
+ leavecriticalsection(freefifolock);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure consumer;
|
|
procedure consumer;
|
|
@@ -91,6 +94,7 @@ begin
|
|
i := 0;
|
|
i := 0;
|
|
j := 0;
|
|
j := 0;
|
|
k := 0;
|
|
k := 0;
|
|
|
|
+ entercriticalsection(freefifolock);
|
|
while not done do
|
|
while not done do
|
|
begin
|
|
begin
|
|
if readindex <> writeindex then
|
|
if readindex <> writeindex then
|
|
@@ -108,6 +112,7 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
+ leavecriticalsection(freefifolock);
|
|
freearray(p, sizeof(p) div sizeof(pointer));
|
|
freearray(p, sizeof(p) div sizeof(pointer));
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -127,6 +132,7 @@ var
|
|
produce_thread: tproducethread;
|
|
produce_thread: tproducethread;
|
|
consume_thread: tconsumethread;
|
|
consume_thread: tconsumethread;
|
|
begin
|
|
begin
|
|
|
|
+ initcriticalsection(freefifolock);
|
|
done := false;
|
|
done := false;
|
|
filldword(fifo, sizeof(fifo) div sizeof(dword), 0);
|
|
filldword(fifo, sizeof(fifo) div sizeof(dword), 0);
|
|
readindex := 0;
|
|
readindex := 0;
|
|
@@ -139,4 +145,5 @@ begin
|
|
consume_thread.waitfor;
|
|
consume_thread.waitfor;
|
|
produce_thread.free;
|
|
produce_thread.free;
|
|
consume_thread.free;
|
|
consume_thread.free;
|
|
|
|
+ donecriticalsection(freefifolock);
|
|
end.
|
|
end.
|