00001 #ifndef CONVCOMLIBMANAGER
00002 #define CONVCOMLIBMANAGER
00003
00004
00026 #include <convcomlibstrategy.h>
00027 #include "ComlibStrategy.h"
00028
00029
00030 #define MAX_NUM_STRATS 32
00031
00032
00033 #define STARTUP_ITERATION -10000
00034
00035
00039 class ConvComlibManager {
00040
00042 StrategyTable strategyTable;
00044 CmiBool init_flag;
00046 int nstrats;
00047
00048 friend class Strategy;
00049 int insertStrategy(Strategy *s);
00050 public:
00051
00053 int acksReceived;
00055 CmiBool doneCreatingScheduled;
00057 CmiBool busy;
00058
00059 ConvComlibManager();
00060
00061 void setInitialized() {init_flag = CmiTrue;}
00062 CmiBool getInitialized() {return init_flag;}
00063
00064
00065
00066
00067
00069 void doneCreating();
00072 void tableReady();
00073 void enableStrategy(int loc);
00074
00075
00076 inline void setStrategy(int loc, Strategy *s) {
00077 #ifndef CMK_OPTIMIZE
00078 if (loc == 0) CmiAbort("Trying to set strategy zero, not valid!\n");
00079 #endif
00080 strategyTable[loc].strategy = s;
00081 }
00082 friend void *comlibReceiveTableHandler(void *msg);
00083 public:
00084 inline int getNumStrats() {return nstrats;}
00085 inline void incrementNumStrats() {nstrats++;}
00086 inline void decrementNumStrats() {nstrats--;}
00087 inline Strategy *getStrategy(int loc) {return strategyTable[loc].strategy;}
00088 inline int isReady(int loc) {return strategyTable[loc].isReady;}
00089 inline int isNew(int loc) {return strategyTable[loc].isNew;}
00090 inline int isInSync(int loc) {return strategyTable[loc].isInSync;}
00091 inline void inSync(int loc) {
00092 strategyTable[loc].isNew = 0;
00093 strategyTable[loc].isInSync = 1;
00094 }
00095
00096 inline CkQ<MessageHolder*> *getTmpList(int loc) {return &strategyTable[loc].tmplist;}
00097
00098
00099
00100 void insertMessage(MessageHolder* msg, int instid);
00101
00102 inline void doneInserting(int loc) {
00103 if (isReady(loc))
00104 strategyTable[loc].strategy->doneInserting();
00105 else
00106 strategyTable[loc].call_doneInserting ++;
00107 }
00108
00109 StrategyTableEntry *getStrategyTable(int loc) {return &strategyTable[loc];}
00110
00111
00112 void printDiagnostics();
00113
00114 };
00115
00117 CkpvExtern(ConvComlibManager, conv_com_object);
00118
00119
00120 void initConvComlibManager();
00121
00122
00123
00124
00125
00126
00127
00128
00129 Strategy *ConvComlibGetStrategy(int loc);
00130
00131
00135 inline void ComlibDoneCreating() {
00136 if (CmiMyPe() != 0) return;
00137 CkpvAccess(conv_com_object).doneCreating();
00138 }
00139
00140 void ConvComlibScheduleDoneInserting(int loc);
00141
00144 inline void ComlibSyncSendAndFree(unsigned int pe, unsigned int size, char *msg, ComlibInstanceHandle cinst) {
00145 CkpvAccess(conv_com_object).insertMessage(new MessageHolder(msg, size, pe), cinst);
00146 }
00147
00148 inline void ComlibSyncBroadcastAllAndFree(unsigned int size, char *msg, ComlibInstanceHandle cinst) {
00149 CkpvAccess(conv_com_object).insertMessage(new MessageHolder(msg, size), cinst);
00150 }
00151
00153 inline void ComlibSyncListSendAndFree(int npes, int *pes, unsigned int size, char *msg, ComlibInstanceHandle cinst) {
00154 CkpvAccess(conv_com_object).insertMessage(new MessageHolder(msg, size, npes, pes), cinst);
00155 }
00156
00157 inline void ComlibBegin(ComlibInstanceHandle cinst, int iteration) {
00158
00159 }
00160
00161 inline void ComlibEnd(ComlibInstanceHandle cinst, int iteration) {
00162
00163 CkpvAccess(conv_com_object).doneInserting(cinst);
00164 }
00165
00166 CkpvExtern(int, comlib_handler);
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00180 #endif