91 template<
typename T, u
int32 _S> Pipe11<T, _S>::Pipe11() : Semaphore(0, 65535) {
94 first_ = last_ =
new Block(NULL);
98 template<
typename T, u
int32 _S> Pipe11<T, _S>::~Pipe11() {
105 template<
typename T, u
int32 _S>
inline void Pipe11<T, _S>::_clear() {
110 delete first_->next_;
111 first_->next_ = NULL;
116 template<
typename T, u
int32 _S>
inline T Pipe11<T, _S>::_pop() {
118 T t = first_->buffer_[head_];
129 first_ = first_->next_;
130 spare_->next_ = NULL;
133 Block *b = first_->next_;
134 first_->next_ = NULL;
145 template<
typename T, u
int32 _S>
inline void Pipe11<T, _S>::push(T &t) {
150 uint32 index = tail_;
155 last_->next_ = spare_;
160 last_ =
new Block(last_);
166 last_->buffer_[index] = t;
170 template<
typename T, u
int32 _S>
inline T Pipe11<T, _S>::pop() {
172 Semaphore::acquire();
176 template<
typename T, u
int32 _S>
inline void Pipe11<T, _S>::clear() {
183 template<
typename T, u
int32 _S> Pipe1N<T, _S>::Pipe1N() {
186 template<
typename T, u
int32 _S> Pipe1N<T, _S>::~Pipe1N() {
189 template<
typename T, u
int32 _S>
void Pipe1N<T, _S>::clear() {
192 Pipe11<T, _S>::_clear();
196 template<
typename T, u
int32 _S> T Pipe1N<T, _S>::pop() {
198 Semaphore::acquire();
200 T t = Pipe11<T, _S>::_pop();
207 template<
typename T, u
int32 _S> PipeN1<T, _S>::PipeN1() {
210 template<
typename T, u
int32 _S> PipeN1<T, _S>::~PipeN1() {
213 template<
typename T, u
int32 _S>
void PipeN1<T, _S>::clear() {
216 Pipe11<T, _S>::_clear();
220 template<
typename T, u
int32 _S>
void PipeN1<T, _S>::push(T &t) {
223 Pipe11<T, _S>::push(t);
229 template<
typename T, u
int32 _S> PipeNN<T, _S>::PipeNN() {
232 template<
typename T, u
int32 _S> PipeNN<T, _S>::~PipeNN() {
235 template<
typename T, u
int32 _S>
void PipeNN<T, _S>::clear() {
239 Pipe11<T, _S>::_clear();
244 template<
typename T, u
int32 _S>
void PipeNN<T, _S>::push(T &t) {
247 Pipe11<T, _S>::push(t);
251 template<
typename T, u
int32 _S> T PipeNN<T, _S>::pop(
bool waitForItem) {
254 Semaphore::acquire();
257 if (Semaphore::acquire(0))
262 T t = Pipe11<T, _S>::_pop();
267 template<
typename T, u
int32 _S,
typename Head,
typename Tail,
class P,
template<
typename, u
int32,
class>
class Push,
template<
typename, u
int32,
class>
class Pop> Pipe<T, _S, Head, Tail, P, Push, Pop>::Pipe() : Semaphore(0, 1) {
274 first_ = last_ =
new Block(NULL);
275 spare_ =
new Block(NULL);
277 _push =
new Push<T, _S, P>(*(P *)
this);
278 _pop =
new Pop<T, _S, P>(*(P *)
this);
281 template<
typename T, u
int32 _S,
typename Head,
typename Tail,
class P,
template<
typename, u
int32,
class>
class Push,
template<
typename, u
int32,
class>
class Pop> Pipe<T, _S, Head, Tail, P, Push, Pop>::~Pipe() {
290 template<
typename T, u
int32 _S,
typename Head,
typename Tail,
class P,
template<
typename, u
int32,
class>
class Push,
template<
typename, u
int32,
class>
class Pop>
inline void Pipe<T, _S, Head, Tail, P, Push, Pop>::shrink() {
295 first_ = first_->next_;
296 spare_->next_ = NULL;
299 Block *b = first_->next_;
300 first_->next_ = NULL;
307 template<
typename T, u
int32 _S,
typename Head,
typename Tail,
class P,
template<
typename, u
int32,
class>
class Push,
template<
typename, u
int32,
class>
class Pop>
inline void Pipe<T, _S, Head, Tail, P, Push, Pop>::grow() {
311 last_->next_ = spare_;
316 last_ =
new Block(last_);
320 template<
typename T, u
int32 _S,
typename Head,
typename Tail,
class P,
template<
typename, u
int32,
class>
class Push,
template<
typename, u
int32,
class>
class Pop>
inline void Pipe<T, _S, Head, Tail, P, Push, Pop>::push(T &t) {
325 template<
typename T, u
int32 _S,
typename Head,
typename Tail,
class P,
template<
typename, u
int32,
class>
class Push,
template<
typename, u
int32,
class>
class Pop>
inline T Pipe<T, _S, Head, Tail, P, Push, Pop>::pop() {
332 template<
class Pipe> PipeFunctor<Pipe>::PipeFunctor(Pipe &p) : pipe(p) {
337 template<
typename T, u
int32 _S,
class Pipe> Push1<T, _S, Pipe>::Push1(Pipe &p) : PipeFunctor<Pipe>(p) {
340 template<
typename T, u
int32 _S,
class Pipe>
void Push1<T, _S, Pipe>::operator ()(T &t) {
342 pipe.last_->buffer_[pipe.tail_] = t;
344 if (++pipe.tail_ == (int32)_S)
347 int32 count = Atomic::Decrement32(&pipe.waitingList_);
354 template<
typename T, u
int32 _S,
class Pipe> PushN<T, _S, Pipe>::PushN(Pipe &p) : PipeFunctor<Pipe>(p), Semaphore(0, 1) {
357 template<
typename T, u
int32 _S,
class Pipe>
void PushN<T, _S, Pipe>::operator ()(T &t) {
359 check_tail: int32 tail = Atomic::Increment32(&pipe.tail_) - 1;
361 if (tail < (int32)_S)
362 pipe.last_->buffer_[tail] = t;
363 else if (tail == (int32)_S) {
367 pipe.last_->buffer_[pipe.tail_++] = t;
378 int32 count = Atomic::Decrement32(&pipe.waitingList_);
385 template<
typename T, u
int32 _S,
class Pipe> Pop1<T, _S, Pipe>::Pop1(Pipe &p) : PipeFunctor<Pipe>(p) {
388 template<
typename T, u
int32 _S,
class Pipe> T Pop1<T, _S, Pipe>::operator ()() {
390 int32 count = Atomic::Increment32(&pipe.waitingList_);
394 if (pipe.head_ == (int32)_S - 1)
397 T t = pipe.first_->buffer_[++pipe.head_];
404 template<
typename T, u
int32 _S,
class Pipe> PopN<T, _S, Pipe>::PopN(Pipe &p) : PipeFunctor<Pipe>(p), Semaphore(0, 1) {
407 template<
typename T, u
int32 _S,
class Pipe> T PopN<T, _S, Pipe>::operator ()() {
409 int32 count = Atomic::Increment32(&pipe.waitingList_);
413 check_head: int32 head = Atomic::Increment32(&pipe.head_);
414 if (head < (int32)_S)
415 return pipe.first_->buffer_[head];
417 if (head == (int32)_S) {
424 return pipe.first_->buffer_[++pipe.head_];
435 template<
typename T, u
int32 S> Pipe11<T, S>::Pipe11() : Pipe<T, S, int32, int32, Pipe11<T, S>, Push1, Pop1>() {
438 template<
typename T, u
int32 S> Pipe11<T, S>::~Pipe11() {
443 template<
typename T, u
int32 S> Pipe1N<T, S>::Pipe1N() : Pipe<T, S, int32, int32 volatile, Pipe1N, Push1, PopN>() {
446 template<
typename T, u
int32 S> Pipe1N<T, S>::~Pipe1N() {
451 template<
typename T, u
int32 S> PipeN1<T, S>::PipeN1() : Pipe<T, S, int32 volatile, int32, PipeN1, PushN, Pop1>() {
454 template<
typename T, u
int32 S> PipeN1<T, S>::~PipeN1() {
459 template<
typename T, u
int32 S> PipeNN<T, S>::PipeNN() : Pipe<T, S, int32 volatile, int32 volatile, PipeNN, PushN, PopN>() {
462 template<
typename T, u
int32 S> PipeNN<T, S>::~PipeNN() {