PaCO++
0.05
|
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