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

Last change on this file since 3032 was 2454, checked in by aubourg, 22 years ago

pb longs sur magique

File size: 5.1 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.18 2003-11-14 12:34:55 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(long i);
52 virtual void getData(long i, double &data, uint_8 &flag);
53 //RZCMV virtual DataStatus getDataError(long i,double &data,double &error,int_4 &flag);
54 virtual void getData(long i, int n, double* data, uint_8* flg=0);
55
56 virtual DataStatus isDataAvail(long iStart, long iEnd);
57 virtual DataStatus isDataAvail(long i);
58 virtual void waitForData(long iStart, long iEnd);
59 virtual void waitForData(long i);
60 virtual void waitForAnyData();
61 virtual long nextDataAvail(long iAfter)=0;
62 virtual bool hasSomeData()=0;
63
64 virtual void putData(long i, double value, uint_8 flag=0);
65 //RZCMV virtual void putDataError(long i, double value,
66 // double error, int_4 flag=0);
67 virtual void putData(long i, int n, double const* val, uint_8 const* flg);
68 virtual void putDone() {}
69
70 virtual void wontNeedBefore(long i);
71
72 bool dbg;
73
74 void setName(string n) {name =n;}
75 string getName() const {return name;}
76
77 bool needSyncOldWay() const {return syncOldWay;}
78
79protected:
80 TOI* errorTOI;
81 pthread_mutex_t mutex;
82 // ----- Rajouts Reza 12/3/2001
83 pthread_cond_t condv;
84 bool fgwaitput;
85 bool fgwaitget;
86 bool fgsigput;
87 bool fgsigget;
88 int countwaitput;
89 int countwaitget;
90 // Fin rajouts Reza 12/3/2001 ------
91
92 // variables pour propagation
93 TOIProcessor* producer; //producteur du toi
94 vector<TOIProcessor*> consumers; //consomateurs du toi
95
96 double defaultValue;
97 bool syncOldWay;
98
99#ifdef WITH_SOPHYA
100 /* l'interface va etre modifiee, NE PAS UTILISER
101 virtual Array doGetData(long iStart, long iEnd)=0;
102 virtual TArray<int_4> doGetFlag(long iStart, long iEnd)=0;
103 l'interface va etre modifiee, NE PAS UTILISER */
104#endif
105
106 virtual void doGetData(long i, double& data, uint_8& flag)=0;
107 virtual void doPutData(long i, double value, uint_8 flag=0)=0;
108 virtual void doWontNeedBefore(long i);
109
110 virtual DataStatus isDataAvailNL(long iStart, long iEnd)=0;
111 virtual DataStatus isDataAvailNL(long i);
112
113 virtual void setProducer(TOIProcessor* prod);
114public: // for toiprocessors redefining addInput. Change ?
115 virtual void addConsumer(TOIProcessor* prod);
116protected:
117 friend class TOIProcessor;
118
119 string name;
120
121 virtual long getMinSn();
122 virtual long getMaxSn();
123 void TOIInit();
124
125 // Il faut faire attention avec mutex et condv, si TOI cree sur le stack !
126 // Il faut donc faire new TOI - Reza 11/3/2001
127 void lock() {pthread_mutex_lock(&mutex);}
128 void unlock() {pthread_mutex_unlock(&mutex);}
129
130 // ----- Rajouts Reza 12/3/2001
131 inline void wait() {pthread_cond_wait(&condv, &mutex);}
132 inline void signal() {pthread_cond_signal(&condv);}
133 inline void broadcast() {pthread_cond_broadcast(&condv);}
134 inline void waitPut()
135 {fgwaitput=true; countwaitput++; pthread_cond_wait(&condv, &mutex);}
136 inline void waitGet()
137 {fgwaitget=true; countwaitget++; pthread_cond_wait(&condv, &mutex);}
138 inline bool isPutWaiting() const { return fgwaitput; }
139 inline bool isGetWaiting() const { return fgwaitget; }
140 inline void signalPut() {fgsigput=true; }
141 inline void signalGet() {fgsigget=true; }
142 inline void cleanWaitPut() { fgsigput = fgwaitput = false; }
143 inline void cleanWaitGet() { fgsigget = fgwaitget = false; }
144
145
146 // ajout vf 31/07/2002
147 bool checkSampleLimits(long &Min, long &Max, int pass);
148
149
150
151
152
153public:
154 inline int getCountWaitPut() const { return countwaitput; }
155 inline int getCountWaitGet() const { return countwaitget; }
156 // Fin rajouts Reza 12/3/2001 ------
157
158};
159
160inline ::ostream & operator << (::ostream & os, TOI const & toi)
161{ toi.PrintStatus(os); return os; }
162
163class TOIRegular : public TOI {
164};
165
166
167#endif
168
169
170
171
172
173
Note: See TracBrowser for help on using the repository browser.