source: XMLIO_V2/dev/dev_rv/src/xmlio/buffer_pair.hpp @ 198

Last change on this file since 198 was 198, checked in by hozdoba, 13 years ago
File size: 4.9 KB
Line 
1#ifndef __XMLIO_CBufferPair__
2#define __XMLIO_CBufferPair__
3
4/// xmlioserver headers ///
5#include "xmlioserver_spl.hpp"
6#include "buffer.hpp"
7#include "circular_buffer.hpp"
8#include "linear_buffer.hpp"
9#include "mpi_manager.hpp"
10
11namespace xmlioserver
12{
13   namespace comm
14   {
15      /// ////////////////////// Déclarations ////////////////////// ///
16      class CBufferPair
17      {
18
19            /// Définition de type ///
20            typedef CLinearBuffer BufferType;
21
22         public :
23
24            /// Construteurs ///
25            CBufferPair(MPIComm com_client_server = CMPIManager::GetCommWorld());
26            CBufferPair(const CBufferPair & buffer_pair);       // Not implemented yet.
27            CBufferPair(const CBufferPair * const buffer_pair); // Not implemented yet.
28
29            template <typename A1, typename A2, typename A3, typename A4>
30               void prepareRequest(const long int & managerId,
31                                   const long int & methodId,
32                                   A1 * arg1 = CLinearBuffer::NULL_ARG,
33                                   A2 * arg2 = CLinearBuffer::NULL_ARG,
34                                   A3 * arg3 = CLinearBuffer::NULL_ARG,
35                                   A4 * arg4 = CLinearBuffer::NULL_ARG);
36            /// Accesseur ///   
37            CLinearBuffer & getCurrentBuffer(void);
38           
39            /// Traitements divers ///
40            int wait(void);
41            void sendCurrentBuffer(void); 
42                       
43            /// Destructeur ///
44            virtual ~CBufferPair(void);
45           
46         protected :
47           
48            /// Test ///
49            bool mustBeSent(void);           
50
51         private :
52
53            /// Propriétés privées ///
54            MPIComm com_client_server;
55            CLinearBuffer first, second;
56            MPIRequest first_request, second_request;
57            int currentBuffer;
58
59      }; // class CBufferPair
60     
61      ///--------------------------------------------------------------
62     
63      template <typename A1, typename A2, typename A3, typename A4>
64         void CBufferPair::prepareRequest(const long int & managerId,
65                                          const long int & methodId,
66                                          A1 * arg1, A2 * arg2, A3 * arg3, A4 * arg4)
67      {
68         static int recurse = 0;
69         if (recurse > 1)
70         {
71            std::cout << "putain :" <<  recurse << "," << this->mustBeSent() 
72                      << "," << currentBuffer << "," << first.getUsedSize() << "," << second.getUsedSize();
73            if ((currentBuffer  ==  0) && (first.getUsedSize()  != 0) && (second_request != -1))
74               std::cout << "," << CMPIManager::Test (second_request);
75            if ((currentBuffer  ==  1) && (second.getUsedSize()  != 0) && (first_request != -1))
76               std::cout << "," << CMPIManager::Test (first_request);
77            std::cout << "," << second_request << "," << first_request << std::endl;
78         }
79         
80         if (recurse == 10) exit (-1);
81         
82         if (this->mustBeSent()) 
83            this->sendCurrentBuffer();
84
85           
86         CLinearBuffer & cbuffer = this->getCurrentBuffer();
87         StdSize usize = cbuffer.getUnusedSize();         
88         StdSize rsize = cbuffer.getRequestedSize(arg1, arg2, arg3, arg4) ;
89         StdSize msize = cbuffer.getSize();
90         
91         long int nbargs = 0;
92         
93         if (arg1 != NULL) nbargs++;
94         if (arg2 != NULL) nbargs++;
95         if (arg3 != NULL) nbargs++;
96         if (arg4 != NULL) nbargs++;
97         
98         if (rsize > msize)
99            ERROR("CBufferPair::sendRequest(...)", << "Le tampon client est trop petit !");
100                 
101         if (rsize <= usize)
102         {
103            cbuffer.appendRequestInfos(managerId, methodId, nbargs);
104            recurse = 0;       
105         }
106         else
107         {
108            int o = this->wait();
109            recurse ++;
110            if (recurse > 1)
111            {
112               
113               std::cout << "putain bis:" <<  recurse << "," << this->mustBeSent()  << "," << CMPIManager::Test (o)
114                         << "," << currentBuffer << "," << first.getUsedSize() << "," << second.getUsedSize();
115               if ((currentBuffer  ==  0) && (first.getUsedSize()  != 0) && (second_request != -1))
116                  std::cout << "," << CMPIManager::Test (second_request);
117               if ((currentBuffer  ==  1) && (second.getUsedSize()  != 0) && (first_request != -1))
118                  std::cout << "," << CMPIManager::Test (first_request);
119               std::cout << "," << second_request << "," << first_request << "," << o << std::endl;
120            }
121            this->prepareRequest(managerId, methodId, arg1, arg2, arg3, arg4);
122         }
123      }
124     
125      ///--------------------------------------------------------------
126     
127     
128   } // namespace comm
129} // namespace xmlioserver
130
131#endif // __XMLIO_CBufferPair__
Note: See TracBrowser for help on using the repository browser.