annotate ref/buffer.d @ 4:a1202aac1124

Started implementing separate encoder class
author fraserofthenight
date Wed, 08 Jul 2009 19:16:39 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
1 /**
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
2 * Hoofbaby -- http://www.dsource.org/projects/hoofbaby
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
3 * Copyright (C) 2009 Robert Fraser
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
4 *
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
5 * This program is free software; you can redistribute it andor
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
6 * modify it under the terms of the GNU General Public License
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
7 * as published by the Free Software Foundation; either version 2
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
8 * of the License, or (at your option) any later version.
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
9 *
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
13 * GNU General Public License for more details.
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
14 */
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
15
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
16 module hoofbaby.util.buffer;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
17
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
18 import tango.time.StopWatch;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
19 import tango.core.sync.Condition;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
20 import tango.core.sync.Mutex;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
21
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
22 version(Windows)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
23 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
24 import tango.stdc.stringz;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
25 import tango.text.convert.Format;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
26 import tango.sys.win32.UserGdi;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
27
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
28 import hoofbaby.util.exception;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
29
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
30 private extern(Windows)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
31 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
32 HANDLE CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCTSTR);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
33 LPVOID MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, DWORD);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
34 LPVOID MapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap, LPVOID lpBaseAddress);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
35 BOOL UnmapViewOfFile(LPCVOID);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
36 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
37
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
38 private uint bufNum = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
39
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
40 /**
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
41 * Allocates a buffer of the given size. ALl accesses up to buf + (size * 2)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
42 * are valid; those over buf + size will reach around
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
43 *
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
44 * Params:
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
45 * size = The size of the buffer (must be multiple of page size; use large powers of two)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
46 * Returns: A pointer to the beginning of that memory
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
47 */
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
48 private void* _allocBuffer(uint size)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
49 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
50 // Ensure page file is the right size
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
51 SYSTEM_INFO info;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
52 GetSystemInfo(&info);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
53 uint pageSize = info.dwAllocationGranularity;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
54 if(size % pageSize) // PERHAPS next multiple of instead of error?
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
55 throw new IllegalOperationException(Format("Memory map pagefile mismatch -- "
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
56 "requested {0}, but page size is {1}", size, pageSize));
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
57
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
58 // Try to allocate the buffer
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
59 HANDLE mmap = CreateFileMappingA(INVALID_HANDLE_VALUE, null, PAGE_READWRITE, 0, size, null);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
60 if(!mmap) throw new UnrecoverableException("Could not create memory mapping for buffer");
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
61 void* buf = MapViewOfFile(mmap, FILE_MAP_ALL_ACCESS, 0, 0, size);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
62 if(!buf) throw new UnrecoverableException("Could not map view of buffer");
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
63 void* buf2 = MapViewOfFileEx(mmap, FILE_MAP_ALL_ACCESS, 0, 0, size, buf + size);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
64 if(!buf2) throw new UnrecoverableException("Could not map second view of buffer");
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
65 if(buf2 != buf + size) throw new UnrecoverableException("Memory mapped buffers are not contiguous");
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
66 return buf;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
67 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
68
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
69 private void _freeBuffer(void* buffer, uint size)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
70 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
71 UnmapViewOfFile(buffer);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
72 UnmapViewOfFile(buffer + size);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
73 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
74 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
75 else
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
76 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
77 static assert(false, "Unsupported operating system");
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
78 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
79
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
80 // IMPORTANT synchronization!!!!
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
81 public struct RingBuffer
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
82 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
83 private const double WAIT_TIME = 0.01; // 10 ms
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
84 private static Condition NULL_CONDITION;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
85
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
86 private uint size;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
87 private void* addr;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
88
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
89 private uint readOfs;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
90 private uint writeOfs;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
91
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
92 /**
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
93 * The callback function to be called upon an overflow or underflow.
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
94 *
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
95 * Params:
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
96 * buffer = The RIngBuffer instance with the issue
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
97 * sizeRequested = the size the operation requested
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
98 * sizeAvailable = how much is actually there
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
99 * Returns: true if the function should return null, false if the buffer should still
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
100 * return the requested pointer (i.e. if the function waited until something
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
101 * was available)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
102 */
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
103 public alias bool delegate(RingBuffer* buffer, uint sizeRequested, uint sizeAvialbale) BufferCallback;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
104 public BufferCallback onUnderflow;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
105 public BufferCallback onOverflow;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
106
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
107 debug(AVBuffer)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
108 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
109 private uint readRequested = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
110 private uint writeRequested = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
111 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
112
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
113 public static RingBuffer opCall(uint size)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
114 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
115 // Not really a singleton; who cares if more than one is constructed?
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
116 if(!NULL_CONDITION)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
117 NULL_CONDITION = new Condition(new Mutex());
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
118
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
119 RingBuffer r;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
120 assert(size > 0);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
121 r.size = size;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
122 r.addr = _allocBuffer(size);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
123 return r;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
124 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
125
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
126 public void free()
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
127 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
128 _freeBuffer(addr, size);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
129 addr = null;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
130 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
131
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
132 public void* beginRead(uint requested)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
133 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
134 debug(AVBuffer)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
135 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
136 assert(readRequested == 0);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
137 readRequested = requested;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
138 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
139
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
140 if(requested > available)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
141 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
142 if(!onUnderflow || onUnderflow(this, requested, available))
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
143 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
144 debug(AVBuffer) readRequested = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
145 return null;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
146 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
147 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
148
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
149 return addr + readOfs;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
150 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
151
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
152 public void endRead(uint bytes)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
153 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
154 debug(AVBuffer)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
155 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
156 assert(bytes == readRequested);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
157 readRequested = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
158 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
159
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
160 readOfs += bytes;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
161 if(readOfs > size)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
162 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
163 readOfs -= bytes;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
164 writeOfs -= bytes;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
165 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
166 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
167
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
168 public void* beginWrite(uint requested)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
169 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
170 debug(AVBuffer)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
171 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
172 assert(writeRequested == 0);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
173 writeRequested = requested;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
174 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
175
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
176 if(requested > freeSpace)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
177 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
178 if(!onOverflow || onOverflow(this, requested, available))
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
179 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
180 return null;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
181 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
182 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
183
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
184 return addr + writeOfs;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
185 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
186
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
187 public void endWrite(uint bytes)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
188 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
189 debug(AVBuffer)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
190 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
191 assert(bytes == writeRequested);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
192 writeRequested = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
193 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
194
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
195 writeOfs += bytes;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
196 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
197
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
198 public uint available()
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
199 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
200 return writeOfs - readOfs;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
201 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
202
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
203 public uint freeSpace()
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
204 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
205 return size - available();
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
206 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
207
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
208 public uint totalSize()
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
209 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
210 return size;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
211 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
212
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
213 public void clear()
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
214 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
215 readOfs = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
216 writeOfs = 0;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
217 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
218
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
219 public void isEmpty()
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
220 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
221 return readOfs == writeOfs;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
222 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
223
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
224 private bool _waitFor(char[] exp)(uint bytes, uint timeoutMs, Condition cond = null)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
225 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
226 if(!cond)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
227 cond = NULL_CONDITION;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
228
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
229 ulong microsecs = timeoutMs * 1000;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
230 StopWatch sw;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
231 sw.start();
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
232 do
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
233 {
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
234 if(mixin(exp) >= bytes)
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
235 return true;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
236 if(cond.wait(WAIT_TIME))
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
237 return false;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
238 } while(sw.microsec() < microsecs);
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
239 return false;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
240 }
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
241
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
242 public alias _waitFor!("available") waitAvailable;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
243 public alias _waitFor!("freeSpace") waitFreeSpace;
a1202aac1124 Started implementing separate encoder class
fraserofthenight
parents:
diff changeset
244 }