-
Notifications
You must be signed in to change notification settings - Fork 1
/
lsplock.pas
68 lines (57 loc) · 2.26 KB
/
lsplock.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
(*----------------------------------------------------------------------------*)
(* Routinen, um Knoten vor Garbage-Collection zu schuetzen. *)
(* Jede Knoten-Adresse soll hoechstens einmal in der Schutzliste vorkommen. *)
(* *)
(* Zu beachten ist: Vor Aufruf von Garbage-Collection muss der gelockte *)
(* Knoten gueltig sein, d.h. nil sein oder auf einen Knoten zeigen. *)
(*----------------------------------------------------------------------------*)
(* Author: Joachim Pimiskern, 1994-2004 *)
(*----------------------------------------------------------------------------*)
unit Lsplock;
interface
uses
lspglobl;
procedure LspLockNodeAddress(pp: ppNode);
procedure LspUnlockNodeAddress(pp: ppNode);
implementation
uses
lspcreat,
strng, dialogs;
procedure LspLockNodeAddress(pp: ppNode);
var p: pNode;
begin
LspNew(p);
p^.Typ := cLspNodeAddress;
p^.NodeAddressVal := pp;
MainTask.LockedNodes := LspCons(p,MainTask.LockedNodes);
end;
(*----------------------------------------------------------------------------*)
(* Eine Knotenadresse von der Sperr-Liste entfernen. Man beachte, dass von *)
(* der Voraussetzung ausgegangen wird, dass die Liste nur Elemente des Typs *)
(* cLspNodeAddress hat. *)
(*----------------------------------------------------------------------------*)
procedure LspUnlockNodeAddress(pp: ppNode);
var laeufer: pNode;
found : boolean;
begin
found := false;
laeufer := MainTask.LockedNodes;
if ((laeufer <> nil) and (laeufer^.CarVal^.NodeAddressVal = pp)) then
begin
found := true;
MainTask.LockedNodes := MainTask.LockedNodes^.CdrVal;
end;
laeufer := MainTask.LockedNodes;
while ((laeufer <> nil) and (not found)) do
begin
if ((laeufer^.CdrVal <> nil) and
(laeufer^.CdrVal^.CarVal^.NodeAddressVal = pp)) then
begin
found := true;
laeufer^.CdrVal := laeufer^.CdrVal^.CdrVal;
end
else
laeufer := laeufer^.CdrVal;
end;
end;
end.