PaCO++  0.05
ParisBasicExample.cc
Go to the documentation of this file.
00001 #include "ParisBasicExample.h"
00002 #include <string.h>
00003 #include <stdlib.h>
00004 #include <iostream>
00005 
00006 ParisBasicExample::ParisBasicExample() : _data_size(0), _data_elt_nb(0),
00007                 _my_rank(-1), _server_nb_nodes(-1)
00008 {
00009   _user_data  = 0;
00010   temp_buffer = 0;
00011   _length  = 0;
00012 }
00013 
00014 ParisBasicExample::~ParisBasicExample()
00015 {
00016   delete position;
00017   delete _data_rst;
00018 }
00019 
00020 void
00021 ParisBasicExample::setEltSize(long size) 
00022 {
00023   _data_size = size;
00024   if (_data_elt_nb && _server_nb_nodes)
00025     {
00026       for (int i = 0; i < _server_nb_nodes; i++)
00027    {
00028      _data_rst[i] = _data_size * _data_elt_nb;
00029    }
00030     }
00031 }
00032 
00033 void
00034 ParisBasicExample::setNbElt(long elt_nb) 
00035 {
00036   _data_elt_nb = elt_nb;
00037   if (_data_size && _server_nb_nodes)
00038     {
00039       for (int i = 0; i < _server_nb_nodes; i++)
00040    {
00041      _data_rst[i] = _data_size * _data_elt_nb;
00042    }
00043     }
00044 }
00045 
00046 void 
00047 ParisBasicExample::setSourceTopology(PaCO::PacoTopology_t topo)
00048 {
00049   _srcTopo = topo;
00050 }
00051 
00052 PaCO::PacoTopology_t 
00053 ParisBasicExample::getSourceTopology()
00054 {
00055   return _srcTopo;
00056 }
00057 
00058 void 
00059 ParisBasicExample::setDestTopology(PaCO::PacoTopology_t topo)
00060 {
00061   _destTopo = topo;
00062   _server_nb_nodes = _destTopo.total;
00063   position  = new long[_server_nb_nodes];
00064   _data_rst = new long[_server_nb_nodes];
00065   for (int i = 0; i < _server_nb_nodes; i++)
00066     {
00067       position[i]  = 0;
00068       _data_rst[i] = 0;
00069     }
00070   if (_data_size && _data_elt_nb)
00071     {
00072       for (int i = 0; i < _server_nb_nodes; i++)
00073    {
00074      _data_rst[i] = _data_size * _data_elt_nb;
00075    }
00076     }
00077 }
00078 
00079 PaCO::PacoTopology_t 
00080 ParisBasicExample::getDestTopology()
00081 {
00082   return _destTopo;
00083 }
00084 
00085 void
00086 ParisBasicExample::setNodeRank(long Rank)
00087 {
00088   _my_rank = Rank;
00089 }
00090 
00091 long 
00092 ParisBasicExample::getNodeRank()
00093 {
00094   return _my_rank;
00095 }
00096 
00097 PieceToSend *
00098 ParisBasicExample::computePiecesToSend()
00099 {
00100   // Compute total data length
00101   long total_length = _data_size * _data_elt_nb;
00102   // We send at each server node the 
00103   // same data
00104   PieceToSend * comm_vector = new PieceToSend[_server_nb_nodes];
00105   for (int i = 0; i < _server_nb_nodes; i++)
00106     {
00107       comm_vector[i].sourceNode = _my_rank;
00108       comm_vector[i].destNode = i;
00109       if (i == _my_rank)
00110    {
00111      comm_vector[i].size = total_length;
00112    }
00113       else
00114    {
00115      comm_vector[i].size = 0;
00116    }
00117     }
00118   return comm_vector;
00119 }
00120 
00121 void
00122 ParisBasicExample::setDataPtr(void* dataPtr)
00123 {
00124   _user_data = (char*) dataPtr;
00125   cerr << "_data_size " <<_data_size << endl;
00126   cerr << "_data_elt_nb " <<_data_elt_nb << endl;
00127   cerr << "_my_rank " <<_my_rank << endl;
00128   cerr << "_server_nb_nodes " <<_server_nb_nodes << endl;
00129   cerr << "_data_rst " <<_data_rst << endl;
00130   cerr << " position" <<  position << endl;
00131 }
00132 
00133 void *
00134 ParisBasicExample::getClientData(int server_node, long & size, long & length, bool & end)
00135 {
00136   if (size > 0)
00137     {
00138       if (temp_buffer) clientFree(server_node);
00139       // First get position
00140       long actual_pos = position[server_node];
00141       // Test if size > _data_rst
00142       long real_size = 0;
00143       if (size > _data_rst[server_node])
00144    {
00145      real_size = _data_rst[server_node];
00146      size = size - _data_rst[server_node];
00147      _data_rst[server_node] = 0;
00148    }
00149       else
00150    {
00151      real_size = size;
00152      _data_rst[server_node] = _data_rst[server_node] - size;
00153      size = 0;
00154    }
00155       length = real_size / _data_size;
00156       _length  = length;
00157       end = true;
00158       position[server_node] = actual_pos + real_size;
00159       if (_data_rst[server_node] == 0) 
00160    {
00161      _data_rst[server_node] = _data_size * _data_elt_nb;
00162      position[server_node] = 0;
00163    }
00164       return &_user_data[actual_pos];
00165     }
00166   else
00167     {
00168       length = 0;
00169       _length  = length;
00170       end = true;
00171       return NULL;
00172     }
00173   return NULL;
00174 }
00175 
00176 void
00177 ParisBasicExample::clientFree()
00178 {
00179   free(temp_buffer);
00180 }
00181 
00182 void
00183 ParisBasicExample::clientFree(int server_node)
00184 {
00185   free(temp_buffer);
00186 }
00187 
00188 bool 
00189 ParisBasicExample::insertData(void* rcptBuf)
00190 {
00191   _user_data = (char *) rcptBuf;
00192   return true;
00193 }
00194 
00195 void *
00196 ParisBasicExample::getServerData(long & length)
00197 {
00198   length = _length;
00199   return _user_data;
00200 }
00201 
00202 void 
00203 ParisBasicExample::setDescr(void * descr)
00204 {
00205   _length = *((CORBA::Short*) descr);
00206   cerr << " Set Descr  : "<< _length << endl;
00207 }
00208 
00209 void *
00210 ParisBasicExample::getDescr()
00211 {
00212   return &_length;
00213 }