source: Sophya/trunk/ArchTOIPipe/Kernel/ringpipe.h@ 2398

Last change on this file since 2398 was 2386, checked in by aubourg, 22 years ago

ring pipes

File size: 1.6 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2
3// ArchTOIPipe (C) CEA/DAPNIA/SPP IN2P3/LAL
4// Eric Aubourg
5// Christophe Magneville
6// Reza Ansari
7// $Id: ringpipe.h,v 1.2 2003-05-20 10:10:09 aubourg Exp $
8
9#ifndef RINGPIPE_H
10#define RINGPIPE_H
11
12#include "config.h"
13
14#include <vector>
15
16#include <pthread.h>
17
18class RingProcessor;
19class Ring;
20
21class RingPipe {
22public:
23 RingPipe(int winSize=100);
24 virtual ~RingPipe();
25
26 virtual Ring const* getRing(int i);
27 virtual void putRing(int i, Ring const* ring);
28
29 virtual void wontNeedRingBefore(int i);
30 virtual void setWinSize(int n) {winSize = n;}
31
32protected:
33 pthread_mutex_t mutex;
34 pthread_mutexattr_t mutattr;
35 pthread_cond_t ringReady;
36
37 RingProcessor* producer;
38 vector<RingProcessor*> consumers;
39
40 virtual void setProducer(RingProcessor* prod);
41 virtual void addConsumer(RingProcessor* prod);
42
43 friend class RingProcessor;
44
45 void lock() {pthread_mutex_lock(&mutex);}
46 void unlock() {pthread_mutex_unlock(&mutex);}
47 void wait() {pthread_cond_wait(&ringReady, &mutex);}
48 void notify() {pthread_cond_broadcast(&ringReady);}
49
50 int winSize;
51 vector<Ring const*> data;
52 int i0;
53
54 enum DataStatus {DATA_OK=0, DATA_DELETED, DATA_NOT_YET};
55
56 virtual void waitForRing(int i); // should be locked before
57 virtual void waitForRoom(int i); // should be locked before
58 virtual DataStatus isRingAvail(int i); // should be locked before
59
60 virtual void getRingRange(int& min, int& max);
61};
62
63
64#endif
65
Note: See TracBrowser for help on using the repository browser.