00001
00002
00003
00004
00005 #include <string.h>
00006 #include "ampiimpl.h"
00007
00008 KeyvalPair::KeyvalPair(char* k, char* v){
00009 key = strdup(k);
00010 val = strdup(v);
00011 klen = strlen(k);
00012 vlen = strlen(v);
00013 }
00014 KeyvalPair::~KeyvalPair(void){
00015 free(key);
00016 free(val);
00017 }
00018
00019 void InfoStruct::pup(PUP::er& p){
00020 p|nodes;
00021 p|valid;
00022 }
00023
00024 void InfoStruct::set(char* k, char* v){
00025 int sz=nodes.size();
00026 int found=0;
00027 for(int i=0;i<sz;i++){
00028 if(!strcmp(nodes[i]->key, k)){
00029 free(nodes[i]->val);
00030 nodes[i]->val = strdup(v);
00031 found=1;
00032 break;
00033 }
00034 }
00035 if(!found){
00036 KeyvalPair* newkvp = new KeyvalPair(k,v);
00037 nodes.push_back(newkvp);
00038 }
00039 }
00040
00041 void InfoStruct::dup(InfoStruct& src){
00042 int sz=src.nodes.size();
00043 for(int i=0;i<sz;i++){
00044 KeyvalPair* newkvp = new KeyvalPair(src.nodes[i]->key,src.nodes[i]->val);
00045 nodes.push_back(newkvp);
00046 }
00047 }
00048
00049 int InfoStruct::deletek(char* k){
00050 int sz=nodes.size();
00051 int found=0;
00052 for(int i=0;i<sz;i++){
00053 if(!strcmp(nodes[i]->key, k)){
00054 delete nodes[i];
00055 nodes.remove(i);
00056 found=1;
00057 break;
00058 }
00059 }
00060 return found;
00061 }
00062
00063 int InfoStruct::get(char* k, int vl, char*& v){
00064 int sz=nodes.size();
00065 int found=0;
00066 for(int i=0;i<sz;i++){
00067 if(!strcmp(nodes[i]->key, k)){
00068 strncpy(v, nodes[i]->val, vl);
00069 if(vl<strlen(nodes[i]->val)) v[vl]='\0';
00070 found=1;
00071 break;
00072 }
00073 }
00074 return found;
00075 }
00076
00077 int InfoStruct::get_valuelen(char* k, int* vl){
00078 int sz=nodes.size();
00079 int found=0;
00080 for(int i=0;i<sz;i++){
00081 if(!strcmp(nodes[i]->key, k)){
00082 *vl=strlen(nodes[i]->val);
00083 found=1;
00084 break;
00085 }
00086 }
00087 return found;
00088 }
00089
00090 int InfoStruct::get_nthkey(int n,char* k){
00091 if(n<0 || n>=nodes.size())
00092 return 0;
00093 strcpy(k,nodes[n]->key);
00094 return 1;
00095 }
00096
00097 void InfoStruct::myfree(void){
00098 int sz=nodes.size();
00099 for(int i=0;i<sz;i++){
00100 delete nodes[i];
00101 }
00102 nodes.resize(0);
00103 valid=false;
00104 }
00105
00106 MPI_Info ampiParent::createInfo(void){
00107 InfoStruct* newinfo = new InfoStruct;
00108 infos.push_back(newinfo);
00109 return (MPI_Info)(infos.size()-1);
00110 }
00111
00112 MPI_Info ampiParent::dupInfo(MPI_Info info){
00113 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00114 CkAbort("AMPI_Info_dup: invalid info\n");
00115 InfoStruct* newinfo = new InfoStruct;
00116 newinfo->dup(*infos[info]);
00117 infos.push_back(newinfo);
00118 return (MPI_Info)(infos.size()-1);
00119 }
00120
00121 void ampiParent::setInfo(MPI_Info info, char *key, char *value){
00122 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00123 CkAbort("AMPI_Info_set: invalid info\n");
00124 infos[info]->set(key,value);
00125 }
00126
00127 int ampiParent::deleteInfo(MPI_Info info, char *key){
00128 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00129 CkAbort("AMPI_Info_delete: invalid info\n");
00130 return infos[info]->deletek(key);
00131 }
00132
00133 int ampiParent::getInfo(MPI_Info info, char *key, int valuelen, char *value){
00134 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00135 CkAbort("AMPI_Info_get: invalid info\n");
00136 return infos[info]->get(key,valuelen,value);
00137 }
00138
00139 int ampiParent::getInfoValuelen(MPI_Info info, char *key, int *valuelen){
00140 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00141 CkAbort("AMPI_Info_get_valuelen: invalid info\n");
00142 return infos[info]->get_valuelen(key,valuelen);
00143 }
00144
00145 int ampiParent::getInfoNkeys(MPI_Info info){
00146 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00147 CkAbort("AMPI_Info_get_nkeys: invalid info\n");
00148 return infos[info]->get_nkeys();
00149 }
00150
00151 int ampiParent::getInfoNthkey(MPI_Info info, int n, char *key){
00152 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00153 CkAbort("AMPI_Info_get_nthkey: invalid info\n");
00154 return infos[info]->get_nthkey(n,key);
00155 }
00156
00157 void ampiParent::freeInfo(MPI_Info info){
00158 if(info<0 || info>=infos.size() || !infos[info]->getvalid())
00159 CkAbort("AMPI_Info_free: invalid info\n");
00160 infos[info]->myfree();
00161 }
00162
00163
00164 CDECL
00165 int AMPI_Info_create(MPI_Info *info){
00166 AMPIAPI("AMPI_Info_create");
00167 if(info<=(int *)0)
00168 CkAbort("AMPI_Info_create: invalid info\n");
00169 ampiParent *ptr = getAmpiParent();
00170 *info = ptr->createInfo();
00171 return MPI_SUCCESS;
00172 }
00173
00174 CDECL
00175 int AMPI_Info_set(MPI_Info info, char *key, char *value){
00176 AMPIAPI("AMPI_Info_set");
00177 if(key<=(char *)0 || strlen(key)>MPI_MAX_INFO_KEY || strlen(key)==0)
00178 CkAbort("AMPI_Info_set: invalid key\n");
00179 if(value<=(char *)0 || strlen(value)>MPI_MAX_INFO_VAL || strlen(value)==0)
00180 CkAbort("AMPI_Info_set: invalid value\n");
00181 ampiParent *ptr = getAmpiParent();
00182 ptr->setInfo(info, key, value);
00183 return MPI_SUCCESS;
00184 }
00185
00186 CDECL
00187 int AMPI_Info_delete(MPI_Info info, char *key){
00188 AMPIAPI("AMPI_Info_delete");
00189 ampiParent *ptr = getAmpiParent();
00190 if(key<=(char *)0 || strlen(key)>MPI_MAX_INFO_KEY || strlen(key)==0)
00191 CkAbort("AMPI_Info_delete: invalid key\n");
00192 if(0==ptr->deleteInfo(info, key))
00193 CkAbort("AMPI_Info_delete: key not defined in info\n");
00194 return MPI_SUCCESS;
00195 }
00196
00197 CDECL
00198 int AMPI_Info_get(MPI_Info info, char *key, int valuelen, char *value, int *flag){
00199 AMPIAPI("AMPI_Info_get");
00200 if(key<=(char *)0 || strlen(key)>MPI_MAX_INFO_KEY || strlen(key)==0)
00201 CkAbort("AMPI_Info_get: invalid key\n");
00202 if(value<=(char *)0)
00203 CkAbort("AMPI_Info_get: invalid value\n");
00204 if(valuelen<=0)
00205 CkAbort("AMPI_Info_get: invalid valuelen\n");
00206 ampiParent *ptr = getAmpiParent();
00207 *flag = ptr->getInfo(info, key, valuelen, value);
00208 return MPI_SUCCESS;
00209 }
00210
00211 CDECL
00212 int AMPI_Info_get_valuelen(MPI_Info info, char *key, int *valuelen, int *flag){
00213 AMPIAPI("AMPI_Info_get_valuelen");
00214 if(key<=(char *)0 || strlen(key)>MPI_MAX_INFO_KEY || strlen(key)==0)
00215 CkAbort("AMPI_Info_get_valuelen: invalid key\n");
00216 ampiParent *ptr = getAmpiParent();
00217 *flag = ptr->getInfoValuelen(info, key, valuelen);
00218 return MPI_SUCCESS;
00219 }
00220
00221 CDECL
00222 int AMPI_Info_get_nkeys(MPI_Info info, int *nkeys){
00223 AMPIAPI("AMPI_Info_get_nkeys");
00224 if(nkeys<=(int *)0)
00225 CkAbort("AMPI_Info_get_nkeys: invalid nkeys\n");
00226 ampiParent *ptr = getAmpiParent();
00227 *nkeys = ptr->getInfoNkeys(info);
00228 return MPI_SUCCESS;
00229 }
00230
00231 CDECL
00232 int AMPI_Info_get_nthkey(MPI_Info info, int n, char *key){
00233 AMPIAPI("AMPI_Info_get_nthkey");
00234 if(key<=(char *)0)
00235 CkAbort("AMPI_Info_get_nthkey: invalid key\n");
00236 ampiParent *ptr = getAmpiParent();
00237 if(0==ptr->getInfoNthkey(info,n,key))
00238 CkAbort("AMPI_Info_get_nthkey: invalid n\n");
00239 return MPI_SUCCESS;
00240 }
00241
00242 CDECL
00243 int AMPI_Info_dup(MPI_Info info, MPI_Info *newinfo){
00244 AMPIAPI("AMPI_Info_dup");
00245 if(newinfo<=(int *)0)
00246 CkAbort("AMPI_Info_dup: invalid newinfo\n");
00247 ampiParent *ptr = getAmpiParent();
00248 *newinfo = ptr->dupInfo(info);
00249 return MPI_SUCCESS;
00250 }
00251
00252 CDECL
00253 int AMPI_Info_free(MPI_Info *info){
00254 AMPIAPI("AMPI_Info_free");
00255 if(info<=(int *)0)
00256 CkAbort("AMPI_Info_free: invalid info\n");
00257 ampiParent *ptr = getAmpiParent();
00258 ptr->freeInfo(*info);
00259 *info = MPI_INFO_NULL;
00260 return MPI_SUCCESS;
00261 }
00262
00263 #ifdef AMPIMSGLOG
00264 #if CMK_PROJECTIONS_USE_ZLIB
00265
00266 void PUP::tozDisk::bytes(void *p,int n,size_t itemSize,dataType )
00267 { gzwrite(F,p,itemSize*n);}
00268 void PUP::fromzDisk::bytes(void *p,int n,size_t itemSize,dataType )
00269 { gzread(F,p,itemSize*n);}
00270
00271
00272 void PUP::zdisk::impl_startSeek(seekBlock &s)
00273 {s.data.loff=gztell(F);}
00274 int PUP::zdisk::impl_tell(seekBlock &s)
00275 {return (int)(gztell(F)-s.data.loff);}
00276 void PUP::zdisk::impl_seek(seekBlock &s,int off)
00277 {gzseek(F,s.data.loff+off,0);}
00278 #endif
00279 #endif
00280
00281 void beginTraceBigSim(char* msg){}
00282 void endTraceBigSim(char* msg, char* param){}
00283
00284