source: Sophya/trunk/ArchTOIPipe/Kernel/toi.h@ 1740

Last change on this file since 1740 was 1740, checked in by aubourg, 24 years ago

une optim pour quand on n'a que des segmented

File size: 4.7 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: toi.h,v 1.10 2001-11-08 23:23:58 aubourg Exp $
8
9#ifndef TOI_H
10#define TOI_H
11
12#include "config.h"
13#include <vector>
14using namespace std;
15
16#include <pthread.h>
17
18#ifdef WITH_SOPHYA
19#include "array.h"
20#include "pexceptions.h"
21using namespace SOPHYA;
22#else
23#include "apexceptions.h"
24#endif
25
26
27
28class TOIProcessor;
29
30class TOI {
31public:
32 TOI();
33 TOI(string name);
34 virtual ~TOI();
35
36 // ----- Rajouts Reza 12/3/2001
37 virtual void PrintStatus(ostream & os) const;
38 // Fin rajouts Reza 12/3/2001 ------
39
40
41#ifdef WITH_SOPHYA
42 /* l'interface va etre modifiee, NE PAS UTILISER
43 virtual Array getData(int iStart, int iEnd);
44 virtual Array getError(int iStart, int iEnd);
45 virtual TArray<int_4> getFlag(int iStart, int iEnd);
46 l'interface va etre modifiee, NE PAS UTILISER */
47#endif
48
49 enum DataStatus {DATA_OK=0, DATA_DELETED, DATA_NOT_YET};
50
51 virtual double getData(int i);
52 virtual void getData(int i, double &data, uint_8 &flag);
53 //RZCMV virtual DataStatus getDataError(int i,double &data,double &error,int_4 &flag);
54
55 virtual DataStatus isDataAvail(int iStart, int iEnd);
56 virtual DataStatus isDataAvail(int i);
57 virtual void waitForData(int iStart, int iEnd);
58 virtual void waitForData(int i);
59 virtual void waitForAnyData();
60 virtual int nextDataAvail(int iAfter)=0;
61 virtual bool hasSomeData()=0;
62
63 virtual void putData(int i, double value, uint_8 flag=0);
64 //RZCMV virtual void putDataError(int i, double value,
65 // double error, int_4 flag=0);
66 virtual void putDone() {}
67
68 virtual void wontNeedBefore(int i);
69
70 bool dbg;
71
72 void setName(string n) {name =n;}
73 string getName() const {return name;}
74
75 bool needSyncOldWay() const {return syncOldWay;}
76
77protected:
78 TOI* errorTOI;
79 pthread_mutex_t mutex;
80 // ----- Rajouts Reza 12/3/2001
81 pthread_cond_t condv;
82 bool fgwaitput;
83 bool fgwaitget;
84 bool fgsigput;
85 bool fgsigget;
86 int countwaitput;
87 int countwaitget;
88 // Fin rajouts Reza 12/3/2001 ------
89
90 TOIProcessor* producer;
91 vector<TOIProcessor*> consumers;
92 double defaultValue;
93 bool syncOldWay;
94
95#ifdef WITH_SOPHYA
96 /* l'interface va etre modifiee, NE PAS UTILISER
97 virtual Array doGetData(int iStart, int iEnd)=0;
98 virtual TArray<int_4> doGetFlag(int iStart, int iEnd)=0;
99 l'interface va etre modifiee, NE PAS UTILISER */
100#endif
101
102 virtual void doGetData(int i, double& data, uint_8& flag)=0;
103 virtual void doPutData(int i, double value, uint_8 flag=0)=0;
104 virtual void doWontNeedBefore(int i);
105
106 virtual DataStatus isDataAvailNL(int iStart, int iEnd)=0;
107 virtual DataStatus isDataAvailNL(int i);
108
109 virtual void setProducer(TOIProcessor* prod);
110public: // for toiprocessors redefining addInput. Change ?
111 virtual void addConsumer(TOIProcessor* prod);
112protected:
113 friend class TOIProcessor;
114
115 string name;
116
117 virtual int getMinSn();
118 virtual int getMaxSn();
119 void TOIInit();
120
121 // Il faut faire attention avec mutex et condv, si TOI cree sur le stack !
122 // Il faut donc faire new TOI - Reza 11/3/2001
123 void lock() {pthread_mutex_lock(&mutex);}
124 void unlock() {pthread_mutex_unlock(&mutex);}
125
126 // ----- Rajouts Reza 12/3/2001
127 void wait() {pthread_cond_wait(&condv, &mutex);}
128 void signal() {pthread_cond_signal(&condv);}
129 void broadcast() {pthread_cond_broadcast(&condv);}
130 inline void waitPut()
131 {fgwaitput=true; countwaitput++; pthread_cond_wait(&condv, &mutex);}
132 inline void waitGet()
133 {fgwaitget=true; countwaitget++; pthread_cond_wait(&condv, &mutex);}
134 inline bool isPutWaiting() const { return fgwaitput; }
135 inline bool isGetWaiting() const { return fgwaitget; }
136 inline void signalPut() {fgsigput=true;}
137 inline void signalGet() {fgsigget=true;}
138 inline void cleanWaitPut() { fgsigput = fgwaitput = false; }
139 inline void cleanWaitGet() { fgsigget = fgwaitget = false; }
140
141public:
142 inline int getCountWaitPut() const { return countwaitput; }
143 inline int getCountWaitGet() const { return countwaitget; }
144 // Fin rajouts Reza 12/3/2001 ------
145
146};
147
148inline ostream & operator << (ostream & os, TOI const & toi)
149{ toi.PrintStatus(os); return os; }
150
151class TOIRegular : public TOI {
152};
153
154
155#endif
Note: See TracBrowser for help on using the repository browser.