Develop and Download Open Source Software

Browse Subversion Repository

Contents of /memman.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Mon Nov 7 12:03:00 2011 UTC (12 years, 4 months ago) by shiraishikazuo
File MIME type: text/x-pascal
File size: 3596 byte(s)


1 unit memman;
2 {$IFDEF FPC}
3 {$MODE DELPHI}{$H+}
4 {$ENDIF}
5
6 (***************************************)
7 (* Copyright (C) 2003, SHIRAISHI Kazuo *)
8 (***************************************)
9
10
11 interface
12
13 procedure MemoryGet(var p:pointer; size:integer);
14 procedure MemoryFree(var p:pointer; size:integer);
15 procedure MemoryManInit;
16
17 implementation
18
19 type
20 PPointer=^pointer;
21 PMemory=^TMemory;
22 TMemory=record
23 next:pointer;
24 memory:array[0..{dummy}16383] of pointer;
25 end;
26
27 type
28 TMemMan=class
29 mother:PMemory;
30 FreeList:pointer;
31 size:integer;
32 count:integer;
33 function get:pointer;
34 procedure release(p:pointer);
35 procedure expand;
36 procedure init;
37 procedure FreeSegment(segment:Pmemory);
38 constructor create(s,c:integer);
39 destructor destroy;override;
40 end;
41
42 procedure TMemman.expand;
43 var
44 i:integer;
45 p:pointer;
46 SectionSize:integer;
47 segment:^PMemory;
48 begin
49 SectionSize:=size div 4;
50 segment:=@mother;
51 while segment^<>nil do
52 segment:=@segment^^.next;
53 getmem(segment^,size*count+4);
54 with segment^^ do
55 begin
56 next:=nil;
57 i:=(Count-1)*SectionSize;
58 memory[i]:=nil;
59 while i>0 do
60 begin
61 p:=@memory[i];
62 dec(i,SectionSize);
63 memory[i]:=p
64 end;
65 FreeList:=@memory[0];
66 end;
67 end;
68
69 constructor TMemMan.create(s,c:integer);
70 begin
71 inherited create;
72 size:=s;
73 count:=c;
74 end;
75
76 procedure TMemMan.FreeSegment(segment:Pmemory);
77 begin
78 if segment<>nil then
79 begin
80 FreeSegment(segment^.next);
81 FreeMem(segment,size*count+4)
82 end;
83 end;
84
85 destructor TMemMan.destroy;
86 begin
87 FreeSegment(mother);
88 inherited destroy;
89 end;
90
91 procedure TMemMan.init;
92 begin
93 FreeSegment(mother);
94 mother:=nil;
95 FreeList:=nil;
96 end;
97
98 function TMemMan.get:pointer;
99 begin
100 if FreeList=nil then
101 expand;
102 result:=FreeList ;
103 FreeList:=PPointer(Result)^;
104 end;
105
106 procedure TMemMan.release(p:pointer);
107 begin
108 PPointer(p)^:=FreeList;
109 FreeList:=p;
110 end;
111
112 var
113 MemMan12,MemMan24,MemMan128,MemMan1024,MemMan4096,MemMan16384:TMemMan;
114
115 procedure MemoryGet(var p:pointer; size:integer);
116 begin
117 if size<=12 then
118 p:=MemMan12.get
119 else if size<=24 then
120 p:=MemMan24.get
121 else if size<=128 then
122 p:=MemMan128.get
123 else if size<=1024 then
124 p:=MemMan1024.get
125 else if size<=4096 then
126 p:=MemMan4096.get
127 else if size<=16384 then
128 p:=MemMan16384.get
129 else
130 GetMem(p,size)
131 end;
132
133 procedure MemoryFree(var p:pointer; size:integer);
134 begin
135 if size<=12 then
136 MemMan12.release(p)
137 else if size<=24 then
138 MemMan24.release(p)
139 else if size<=128 then
140 MemMan128.release(p)
141 else if size<=1024 then
142 MemMan1024.release(p)
143 else if size<=4096 then
144 MemMan4096.release(p)
145 else if size<=16384 then
146 MemMan16384.release(p)
147 else
148 FreeMem(p,size)
149 end;
150
151
152 procedure MemoryManInit;
153 begin
154 MemMan12.init;
155 MemMan24.init;
156 MemMan128.init;
157 MemMan1024.init;
158 MemMan4096.init;
159 MemMan16384.init;
160 end;
161
162
163 initialization
164 MemMan12:=TMemMan.create(12,2048);
165 MemMan24:=TMemMan.create(24,1024);
166 MemMan128:=TMemMan.create(128,32);
167 MemMan1024:=TMemMan.create(1024,8);
168 MemMan4096:=TMemMan.create(4096,4);
169 MemMan16384:=TMemMan.create(16384,4);
170 finalization
171 MemMan12.free;
172 MemMan24.free;
173 MemMan128.free;
174 MemMan1024.free;
175 MemMan4096.free;
176 MemMan16384.free;
177
178 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26