* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Mayaqua / Memory.h
1 // SoftEther UT-VPN SourceCode\r
2 // \r
3 // Copyright (C) 2004-2010 SoftEther Corporation.\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.\r
6 // All Rights Reserved.\r
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \r
10 // This program is free software; you can redistribute it and/or\r
11 // modify it under the terms of the GNU General Public License\r
12 // version 2 as published by the Free Software Foundation.\r
13 // \r
14 // This program is distributed in the hope that it will be useful,\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
17 // GNU General Public License for more details.\r
18 // \r
19 // You should have received a copy of the GNU General Public License version 2\r
20 // along with this program; if not, write to the Free Software\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // Memory.h\r
79 // Memory.c のヘッダ\r
80 \r
81 #ifndef MEMORY_H\r
82 #define MEMORY_H\r
83 \r
84 // 一度にカーネルに渡すことができるメモリサイズ\r
85 #define MAX_SEND_BUF_MEM_SIZE                           (10 * 1024 * 1024)\r
86 \r
87 // メモリタグ用マジックナンバー\r
88 #define MEMTAG_MAGIC                                            0x49414449\r
89 \r
90 #define CALC_MALLOCSIZE(size)                           ((MAX(size, 1)) + sizeof(MEMTAG))\r
91 #define MEMTAG_TO_POINTER(p)                            ((void *)(((UCHAR *)(p)) + sizeof(MEMTAG)))\r
92 #define POINTER_TO_MEMTAG(p)                            ((MEMTAG *)(((UCHAR *)(p)) - sizeof(MEMTAG)))\r
93 #define IS_NULL_POINTER(p)                                      (((p) == NULL) || ((POINTER_TO_UINT64(p) == (UINT64)sizeof(MEMTAG))))\r
94 \r
95 // メモリプールの 1 ブロックの固定サイズ\r
96 #define MEMPOOL_MAX_SIZE                                        3000\r
97 \r
98 \r
99 // メモリタグ\r
100 struct MEMTAG\r
101 {\r
102         UINT Magic;\r
103         UINT Size;\r
104         bool ZeroFree;\r
105         UINT Padding;\r
106 };\r
107 \r
108 // バッファ\r
109 struct BUF\r
110 {\r
111         void *Buf;\r
112         UINT Size;\r
113         UINT SizeReserved;\r
114         UINT Current;\r
115 };\r
116 \r
117 // FIFO\r
118 struct FIFO\r
119 {\r
120         REF *ref;\r
121         LOCK *lock;\r
122         void *p;\r
123         UINT pos, size, memsize;\r
124         UINT realloc_mem_size;\r
125 };\r
126 \r
127 // リスト\r
128 struct LIST\r
129 {\r
130         REF *ref;\r
131         UINT num_item, num_reserved;\r
132         void **p;\r
133         LOCK *lock;\r
134         COMPARE *cmp;\r
135         bool sorted;\r
136 };\r
137 \r
138 // キュー\r
139 struct QUEUE\r
140 {\r
141         REF *ref;\r
142         UINT num_item;\r
143         FIFO *fifo;\r
144         LOCK *lock;\r
145 };\r
146 \r
147 // スタック\r
148 struct SK\r
149 {\r
150         REF *ref;\r
151         UINT num_item, num_reserved;\r
152         void **p;\r
153         LOCK *lock;\r
154         bool no_compact;\r
155 };\r
156 \r
157 // 候補リスト\r
158 struct CANDIDATE\r
159 {\r
160         wchar_t *Str;                                           // 文字列\r
161         UINT64 LastSelectedTime;                        // 最後に選択された日時\r
162 };\r
163 \r
164 struct STRMAP_ENTRY\r
165 {\r
166         char *Name;\r
167         void *Value;\r
168 };\r
169 \r
170 // マクロ\r
171 #define LIST_DATA(o, i)         (((o) != NULL) ? ((o)->p[(i)]) : NULL)\r
172 #define LIST_NUM(o)                     (((o) != NULL) ? (o)->num_item : 0)\r
173 \r
174 \r
175 // 関数プロトタイプ\r
176 LIST *NewCandidateList();\r
177 void FreeCandidateList(LIST *o);\r
178 int ComapreCandidate(void *p1, void *p2);\r
179 void AddCandidate(LIST *o, wchar_t *str, UINT num_max);\r
180 BUF *CandidateToBuf(LIST *o);\r
181 LIST *BufToCandidate(BUF *b);\r
182 \r
183 void *Malloc(UINT size);\r
184 void *MallocEx(UINT size, bool zero_clear_when_free);\r
185 void *MallocFast(UINT size);\r
186 void *ZeroMalloc(UINT size);\r
187 void *ZeroMallocFast(UINT size);\r
188 void *ZeroMallocEx(UINT size, bool zero_clear_when_free);\r
189 void *ReAlloc(void *addr, UINT size);\r
190 void Free(void *addr);\r
191 void CheckMemTag(MEMTAG *tag);\r
192 \r
193 void *InternalMalloc(UINT size);\r
194 void *InternalReAlloc(void *addr, UINT size);\r
195 void InternalFree(void *addr);\r
196 \r
197 void Copy(void *dst, void *src, UINT size);\r
198 int Cmp(void *p1, void *p2, UINT size);\r
199 void ZeroMem(void *addr, UINT size);\r
200 void Zero(void *addr, UINT size);\r
201 void *Clone(void *addr, UINT size);\r
202 \r
203 char B64_CodeToChar(BYTE c);\r
204 char B64_CharToCode(char c);\r
205 int B64_Encode(char *set, char *source, int len);\r
206 int B64_Decode(char *set, char *source, int len);\r
207 UINT Encode64(char *dst, char *src);\r
208 UINT Decode64(char *dst, char *src);\r
209 \r
210 void Swap(void *buf, UINT size);\r
211 USHORT Swap16(USHORT value);\r
212 UINT Swap32(UINT value);\r
213 UINT64 Swap64(UINT64 value);\r
214 USHORT Endian16(USHORT src);\r
215 UINT Endian32(UINT src);\r
216 UINT64 Endian64(UINT64 src);\r
217 void EndianUnicode(wchar_t *str);\r
218 \r
219 BUF *NewBuf();\r
220 void ClearBuf(BUF *b);\r
221 void WriteBuf(BUF *b, void *buf, UINT size);\r
222 void WriteBufBuf(BUF *b, BUF *bb);\r
223 UINT ReadBuf(BUF *b, void *buf, UINT size);\r
224 BUF *ReadBufFromBuf(BUF *b, UINT size);\r
225 void AdjustBufSize(BUF *b, UINT new_size);\r
226 void SeekBuf(BUF *b, UINT offset, int mode);\r
227 void FreeBuf(BUF *b);\r
228 bool BufToFile(IO *o, BUF *b);\r
229 BUF *FileToBuf(IO *o);\r
230 UINT ReadBufInt(BUF *b);\r
231 UINT64 ReadBufInt64(BUF *b);\r
232 bool WriteBufInt(BUF *b, UINT value);\r
233 bool WriteBufInt64(BUF *b, UINT64 value);\r
234 bool ReadBufStr(BUF *b, char *str, UINT size);\r
235 bool WriteBufStr(BUF *b, char *str);\r
236 void WriteBufLine(BUF *b, char *str);\r
237 void AddBufStr(BUF *b, char *str);\r
238 bool DumpBuf(BUF *b, char *filename);\r
239 bool DumpBufW(BUF *b, wchar_t *filename);\r
240 BUF *ReadDump(char *filename);\r
241 BUF *ReadDumpW(wchar_t *filename);\r
242 \r
243 UINT PeekFifo(FIFO *f, void *p, UINT size);\r
244 UINT ReadFifo(FIFO *f, void *p, UINT size);\r
245 void WriteFifo(FIFO *f, void *p, UINT size);\r
246 void ClearFifo(FIFO *f);\r
247 UINT FifoSize(FIFO *f);\r
248 void LockFifo(FIFO *f);\r
249 void UnlockFifo(FIFO *f);\r
250 void ReleaseFifo(FIFO *f);\r
251 void CleanupFifo(FIFO *f);\r
252 FIFO *NewFifo();\r
253 FIFO *NewFifoFast();\r
254 FIFO *NewFifoEx(UINT realloc_mem_size, bool fast);\r
255 void InitFifo();\r
256 UINT GetFifoDefaultReallocMemSize();\r
257 void SetFifoDefaultReallocMemSize(UINT size);\r
258 \r
259 void *Search(LIST *o, void *target);\r
260 void Sort(LIST *o);\r
261 void Add(LIST *o, void *p);\r
262 void Insert(LIST *o, void *p);\r
263 bool Delete(LIST *o, void *p);\r
264 bool DeleteKey(LIST *o, UINT key);\r
265 void DeleteAll(LIST *o);\r
266 void LockList(LIST *o);\r
267 void UnlockList(LIST *o);\r
268 void ReleaseList(LIST *o);\r
269 void CleanupList(LIST *o);\r
270 LIST *NewList(COMPARE *cmp);\r
271 LIST *NewListFast(COMPARE *cmp);\r
272 LIST *NewListEx(COMPARE *cmp, bool fast);\r
273 LIST *NewListEx2(COMPARE *cmp, bool fast, bool fast_malloc);\r
274 void CopyToArray(LIST *o, void *p);\r
275 void *ToArray(LIST *o);\r
276 void *ToArrayEx(LIST *o, bool fast);\r
277 LIST *CloneList(LIST *o);\r
278 void SetCmp(LIST *o, COMPARE *cmp);\r
279 void SetSortFlag(LIST *o, bool sorted);\r
280 int CompareStr(void *p1, void *p2);\r
281 bool InsertStr(LIST *o, char *str);\r
282 int CompareUniStr(void *p1, void *p2);\r
283 bool IsInList(LIST *o, void *p);\r
284 bool IsInListKey(LIST *o, UINT key);\r
285 void *ListKeyToPointer(LIST *o, UINT key);\r
286 bool IsInListStr(LIST *o, char *str);\r
287 bool IsInListUniStr(LIST *o, wchar_t *str);\r
288 bool ReplaceListPointer(LIST *o, void *oldptr, void *newptr);\r
289 \r
290 void *GetNext(QUEUE *q);\r
291 void InsertQueue(QUEUE *q, void *p);\r
292 void InsertQueueInt(QUEUE *q, UINT value);\r
293 void LockQueue(QUEUE *q);\r
294 void UnlockQueue(QUEUE *q);\r
295 void ReleaseQueue(QUEUE *q);\r
296 void CleanupQueue(QUEUE *q);\r
297 QUEUE *NewQueue();\r
298 QUEUE *NewQueueFast();\r
299 \r
300 SK *NewSk();\r
301 SK *NewSkEx(bool no_compact);\r
302 void ReleaseSk(SK *s);\r
303 void CleanupSk(SK *s);\r
304 void LockSk(SK *s);\r
305 void UnlockSk(SK *s);\r
306 void Push(SK *s, void *p);\r
307 void *Pop(SK *s);\r
308 \r
309 UINT Uncompress(void *dst, UINT dst_size, void *src, UINT src_size);\r
310 UINT Compress(void *dst, UINT dst_size, void *src, UINT src_size);\r
311 UINT CompressEx(void *dst, UINT dst_size, void *src, UINT src_size, UINT level);\r
312 UINT CalcCompress(UINT src_size);\r
313 \r
314 bool IsZero(void *data, UINT size);\r
315 \r
316 void Crash();\r
317 \r
318 LIST *NewStrMap();\r
319 void *StrMapSearch(LIST *map, char *key);\r
320 \r
321 UINT SearchBin(void *data, UINT data_start, UINT data_size, void *key, UINT key_size);\r
322 void CrashNow();\r
323 \r
324 #endif  // MEMORY_H\r
325 \r