PaCO++  0.05
DistributionLibrairie.h
Go to the documentation of this file.
00001 #ifndef DISTRIBUTION_LIBRARY_IS_DEFINED
00002 #define DISTRIBUTION_LIBRARY_IS_DEFINED
00003 
00004 #include "FabriqueManagerTpl.h"
00005 #include <PaCO++.h>
00006 #include <string>
00007 #include <map>
00008 #include <vector>
00009 
00010 using namespace std;
00011 
00012 // To delete ?
00013 struct PieceToSend
00014 {
00015   unsigned sourceNode; // Quel noeud envoi
00016   unsigned destNode; // Quel est le noeud destinataire
00017   unsigned size; // nb octet ! la taille que l'on envoi
00018   void* id; // Cette identifiant est ensuite redonnée a la bibliothèque lorsque l'on demande 
00019             // réellement les données
00020 };
00021 
00022 typedef vector<PieceToSend> vPieceToSend_t;
00023 
00024 class DistributionLibrary {
00025 
00026 public:
00027 
00028   DistributionLibrary() {}
00029   virtual ~DistributionLibrary() {}
00030 
00031   // Topology
00032   virtual void setSourceTopology(PaCO::PacoTopology_t topo) = 0; // paco_operation
00033   virtual PaCO::PacoTopology_t getSourceTopology() = 0;          // ??
00034   virtual void setDestTopology(PaCO::PacoTopology_t topo) = 0;   // paco_operation
00035   virtual PaCO::PacoTopology_t getDestTopology() = 0;            // ??
00036   virtual void setNodeRank(long Rank) = 0;                       // paco_operation
00037   virtual long getNodeRank() = 0;                                // by user ?
00038 
00039   // Com Id management
00040   virtual bool setComId(long id) { return false;}
00041   virtual bool freeComId(long id) { return false;}
00042 
00043   // If the library is parallel
00044   virtual void  setCommunicator(void * group) = 0;
00045   //  virtual void* getCommunicator() = 0; PROPOSED EXTENSION
00046 
00047   // Client Side
00048   // Computes communications vector (or eventually matrix)
00049   // Cette méthode est appellée par PaCO++ pour demander la matrice de communication
00050   virtual PieceToSend* computePiecesToSend(unsigned& size) = 0;
00051   // virtual PieceToSend* computePiecesToSend2(unsigned& size) = 0; SHOULD COMPUTE DIRECTLY THE FULL MATRIX
00052   // Sets client-side data 
00053   // Pointeur vers les données client
00054   virtual void setDataPtr(void* dataPtr) = 0;
00055 
00056   // Get data
00057   // PaCO++ demande une quantité size pour le server_node
00058   // length est la taille réelle que l'on lui donne
00059   // end permet de fragmenter le message en plusieurs buffer : si on veut envoyer 
00060   // qu'un seul buffer on repond true sinon on repond false
00061   // pid est l'id contenu dans PieceToSend
00062   // size est la taille que PaCO++ veut et on soustrait ce qu'on donne réellement
00063   virtual void* getClientData(void *pid, int server_node, long & size, long & length, bool & end) = 0;
00064   // PaCO++ demande le descripteur qui sera attaché à l'envoi des données.
00065   // PaCO++ caste le void * dans le type décrit dans le fichier de configuration de la lib 
00066   // situé dans le répertoires Types.
00067   virtual void* getDescr() = 0;
00068 
00069   // Free
00070   virtual void clientFree() = 0;
00071 
00072   // Server Side
00073   // Sets server-side data return true if data complete
00074   // element_nb : nombre d'etls de la sequence != 1 si
00075   // si le message est fragmenté
00076   virtual bool insertData(void* rcptBuf, unsigned long element_nb) = 0; 
00077   virtual void setDescr(void * descr) = 0;
00078 
00079   // getData for the servant
00080   virtual void* getServerData(long & length) = 0;
00081 
00082   // Free
00083   virtual void serverFree() = 0;
00084 };
00085 
00086 // Abstract class to be implemeted by each fabrique
00087 class paco_fabrique_distribution {
00088 public:
00089   virtual ~paco_fabrique_distribution() {}
00090   virtual DistributionLibrary* create()=0;
00091 };
00092 
00093 // The distribution fabrique
00094 typedef paco_fabrique_manager_tpl<paco_fabrique_distribution> paco_fabrique_manager_distribution;
00095 
00096 #endif