00001
00002
00003
00004
00005
00006
00007
00010 #if !defined(H_DC_INSTANCE)
00011 #define H_DC_INSTANCE
00012
00013 #include "lib/dc_standard.h"
00014 #include "lib/dc_argv.h"
00015 #include "lib/dc_configinfo.h"
00016 #include "lib/dc_socket.h"
00017 #include "lib/dc_memory.h"
00018 #include "lib/dc_map.h"
00019 #include "lib/dc_timer.h"
00020 #include "lib/dc_metric.h"
00021 #include "lib/dc_mutex.h"
00022 #include "lib/dc_cond.h"
00023 #include "lib/dc_regex.h"
00024
00025 #include "packet-tags.h"
00026 #include "dc_work.h"
00027 #include "dc_filterlayout.h"
00028 #include "dc_placement.h"
00029 #include "dc_policy.h"
00030
00031
00032 class DC_ConsoleStreamSpec {
00033
00034 public:
00035 char *sbName;
00036 Types::uint i;
00037 Types::uint iFilterSource, iFilterSink;
00038 DC_StreamWritePolicy_t eStreamWritePolicy;
00039 char *sbWritePolicyUD;
00040
00042 class WriteRules_t {
00043 public:
00044 DC_Regex reSource;
00045 DC_Regex reSink;
00046 bool fNone;
00047 DC_StreamWritePolicy_t eStreamWritePolicy;
00048 };
00049 DArrayPtr<WriteRules_t*> daWriteRules;
00050
00051 DC_ConsoleStreamSpec(const char *sbName_in)
00052 : sbName(StrDup(sbName_in)),
00053 i(Types::uintMax),
00054 iFilterSource(Types::uintMax), iFilterSink(Types::uintMax),
00055 eStreamWritePolicy(DC_StreamWritePolicy_RR),
00056 sbWritePolicyUD(NULL) {
00057 };
00058 ~DC_ConsoleStreamSpec(void) {
00059 TestDeleteNull(sbName);
00060 TestDeleteNull(sbWritePolicyUD);
00061 for (Types::uint j=0; j<daWriteRules.NumElem(); ++j)
00062 delete daWriteRules[j];
00063 };
00064 };
00065
00066
00067 class DC_ConsoleFilterSpec {
00068 friend ostream &operator<<(ostream &os, DC_ConsoleFilterSpec &spec);
00069 public:
00070
00071 char *sbName;
00072 class CopySet_t {
00073 public:
00074 Types::uint iPlacement;
00075 char *sbName;
00076 bool fAllowCopies;
00077 int nCopies;
00078 int nCopiesLow, nCopiesHigh;
00079 int rankTotalCopiesStart;
00080 };
00081 DArray<CopySet_t> daCopySet;
00082 int maxTotalCopies;
00083
00084 bool fConsole;
00085 int wSinkQueueSize, wWorkQueueSize;
00086
00087 DArray<DC_ConsoleStreamSpec*> daStreamSpecIn;
00088 DArray<DC_ConsoleStreamSpec*> daStreamSpecOut;
00089
00090 DC_ConsoleFilterSpec(const char *sbName_in)
00091 : sbName(StrDup(sbName_in)), maxTotalCopies(0) {
00092 fConsole = (strcmp(sbName_in, "<console>") == 0);
00093 };
00094 ~DC_ConsoleFilterSpec(void) {
00095 TestDeleteNull(sbName);
00096 for (Types::uint i=0; i<daCopySet.NumElem(); ++i)
00097 TestDeleteNull(daCopySet[i].sbName);
00098 };
00099
00100 CopySet_t *find_placement(Types::uint iPlacement, Types::uint *piFound=NULL);
00101 };
00102
00103
00112 class DC_FilterInstance_t {
00113 friend class DC_FilterService_t;
00114 friend class DC_ConsoleProcessState;
00115 protected:
00116 DC_FilterService_t *pDC;
00117 DC_ConsoleProcessState *pConsole;
00118 int wInstanceNum;
00119 char *sbLayoutName;
00120
00125 bool fDetached;
00126
00134 enum { INIT, WAIT, WORK, STOP, DONE } eState;
00135
00136 int wNextWorkNum;
00137
00138 int wRemoteInstances;
00139 int cRemoteInstanceExit;
00140
00141
00142 DArray<DC_ConsoleFilterSpec*> daFilterSpec;
00143 DArray<DC_ConsoleStreamSpec*> daStreamSpec;
00144
00145 DC_Mutex mutex;
00146
00147 public:
00149 DC_Filter_Base_t::arg_t arg;
00150
00151 protected:
00152 Types::uint find_filter(const char *sbName);
00153 DC_ConsoleStreamSpec *find_stream(const char *sbName, Types::uint &iStream);
00154
00155 bool _isDetached(void) { return fDetached; };
00156
00157 void _Delete(void);
00158 int _Reset(DC_FilterService_t *pDC_in, DC_ConsoleProcessState *pConsole_in);
00159 int _ProcessLayout(DC_FilterLayout_t &layout);
00160 int _ProcessPlacement(DC_Placement_t &placement);
00161 int _StartInstance(void);
00162 int _StopInstance(void);
00163 int _WaitUntilInstanceDone(void);
00164
00165 int _InstanceExit_Reader(void);
00166
00167 public:
00168 DC_FilterInstance_t(void);
00169 ~DC_FilterInstance_t(void);
00170
00172 DC_WorkHandle_t AppendWork(DC_Work_t &work, bool fWait=true);
00173 };
00174
00175
00176 #endif
00177