source: lab.git/Dev/utvpn/utvpn-unix-v101-7101-public/src/Mayaqua/Memory.h @ 9353238

Last change on this file since 9353238 was a1bae3e, checked in by mitty <mitty@…>, 12 years ago
  • copy vendor drop to trunk

git-svn-id: https://lab.mitty.jp/svn/lab/trunk@147 7d2118f6-f56c-43e7-95a2-4bb3031d96e7

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