Version: 9.16.0
Copy2UserSpace.hxx
Go to the documentation of this file.
1// Copyright (C) 2007-2026 CEA, EDF, OPEN CASCADE
2//
3// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5//
6// This library is free software; you can redistribute it and/or
7// modify it under the terms of the GNU Lesser General Public
8// License as published by the Free Software Foundation; either
9// version 2.1 of the License, or (at your option) any later version.
10//
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14// Lesser General Public License for more details.
15//
16// You should have received a copy of the GNU Lesser General Public
17// License along with this library; if not, write to the Free Software
18// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19//
20// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21//
22
23// File : Copy2UserSpace.hxx
24// Author : Eric Fayolle (EDF)
25// Module : KERNEL
26// Modified by : $LastChangedBy$
27// Date : $LastChangedDate: 2007-02-13 11:09:09 +0100 (mar, 13 fév 2007) $
28// Id : $Id$
29//
30#ifndef _COPY_TO_USER_SPACE_HXX_
31#define _COPY_TO_USER_SPACE_HXX_
32
33#include <string>
34#include <iostream>
35#include "CalciumPortTraits.hxx"
36
37#include <cstdio>
38
39//Les demandes de copies vers l'espace utilisateur
40//proviennent d'une procédure de lecture
41
42
43//Cas du zero copie
44template <bool zerocopy, typename DataManipulator >
46
47 template <class T1, class T2>
48 static void apply( T1 * & data, T2 & corbaData, size_t /*nRead*/ ){
49
50 typedef typename DataManipulator::InnerType InnerType;
51
52 // OLD:Devient propriétaire des données contenues dans la structure CORBA
53 // OLD:(allouées par allocbuff() pour une séquence)
54 // OLD:Le client est propriétaire des données.
55 // OLD:Il doit cependant être attentif au fait que s'il les modifie,
56 // OLD:une nouvelle demande de lecture lui fournira les données modifiées.
57 // OLD:TODO : Si plusieurs lecteurs demandent la même donnée,
58 // OLD: ? qui devient le propriétaire? --> Forcément le premier car
59 // OLD: ensuite la séquence n'est plus propriétaire et rendra un pointeur NULL.
60 // OLD: NO: Le port devrait resté propriétaire du contenu de la séquence
61 // OLD: NO: L'utilisateur doit de toute les façons utiliser les données reçues en
62 // OLD: NO: lecture seulement car si une nouvelle demande de lecture est formulée
63 // OLD: NO: pour ces données, les eventuelles modifications seraient visibles !
64 // OLD:YES : La solution de donner la propriété à l'utilisateur est convenable car si
65 // OLD:le port déréférence ces données (garbage collecteur, niveau) le buffer
66 // OLD:reste disponible à l'ulisateur en lecture et écriture
67 // OLD:Le problème est que la donnée CORBA stockée par le port est maintenant vide (cf CORBA BOOK)
68 // OLD:du coup quid d'une nouvelle demande de lecture : A TESTER
69
70 // Le PORT doit être capable de répondre aux demandes de lecture
71 // multiples d'une donnée pour une même estampille et doit donc garder un pointeur valide
72 // sur le buffer. Il se pose cependant un problème s'il décide
73 // de supprimer la donnée alors que des client utilise le buffer (historique calcium) !
74 // La seule façon de gérer proprement cette situation est d'utiliser un shared_pointer (TODO).
75 // Pour l'instant l'utilisateur du mode zero copie doit s'assurer que le niveau d'historique
76 // utilisé par le port est compatible avec son utilisation des buffers. Il doit
77 // être également conscient que s'il modifie le buffer, il est modifié pour tous les
78 // utilisateurs actuels et futurs.
79
80 //REF: InnerType * dataPtr = DataManipulator::getPointer(corbaData,true);
81 // Laisse la propriété des données à la structure CORBA
82 // (buffer allouée par allocbuff() pour une séquence)
83 InnerType * dataPtr = DataManipulator::getPointer(corbaData,false);
84
85 // Cette ligne poserait uun problème dans la méthode appelante, si elle
86 // ne testait pas que les types utilisateurs et CORBA sont identiques :
87 // ex : InnerType == Corba::Long et d'un T == int
88 // C'est l'objet de la spécialisation ci-dessous.
89 data = dataPtr;
90
91 // En zero copie l'utilisateur doit appeler ecp_free ( cas ou un buffer intermédiaire
92 // a été alloué pour cause de typage différent xor necessité de désalouer le buffer alloué par CORBA)
93 // L'utilisateur doit cependant être attentif au fait qu'après désallocation, si la donnée
94 // est toujours estampillée dans le port une nouvelle lecture pour cette estampille
95 // rendrait un buffer vide.
96 }
97};
98
99// Cas où il faut effectuer une recopie
100template <typename DataManipulator>
101struct Copy2UserSpace<false, DataManipulator> {
102
103 //Recopie le contenu de la donnée CORBA dans le buffer utilisateur de longueur nRead
104 template <class T1, class T2>
105 static void apply( T1 * &data, T2 & corbaData, size_t nRead){
106 typedef typename DataManipulator::InnerType InnerType;
107
108 if (SALOME::VerbosityActivated())
109 {
110 InnerType * dataPtr = NULL;
111 // Affiche la valeur du pointeur de la structure corba
112 // et les pointeurs contenus le cas échéant
113 dataPtr = DataManipulator::getPointer(corbaData,false);
114 std::cerr << "-------- Copy2UserSpace<false> MARK 1a --dataPtr("<<dataPtr<<")[0.."<<
115 DataManipulator::size(corbaData) <<"] : ----------------" << std::endl;
116 std::copy(dataPtr,dataPtr+DataManipulator::size(corbaData),std::ostream_iterator<T1>(std::cerr," "));
117 for (int i=0; i< DataManipulator::size(corbaData); ++i)
118 fprintf(stderr,"pointer[%d]=%p ",i, dataPtr[i]);
119 std::cerr << std::endl;
120
121 T1 * tmpData = data;
122 //Cette affichage peut provoquer la détection d'écriture d'un espace non initailisé.
123 std::cerr << "-------- Copy2UserSpace<false> MARK 1b --data("<<tmpData<<")[0.."<<
124 DataManipulator::size(corbaData) <<"] : ----------------" << std::endl;
125 std::copy(tmpData,tmpData+DataManipulator::size(corbaData),std::ostream_iterator<T1>(std::cerr," "));
126 for (int i=0; i< DataManipulator::size(corbaData); ++i)
127 fprintf(stderr,"pointer[%d]=%p ",i, tmpData[i]);
128 std::cerr << std::endl;
129 }
130
131 // Pour les types pointeurs et ref il faut effectuer une recopie profonde.
132 // On la délègue au manipulateur de données.
133
134 // Recopie des données dans le buffer allouée par l'utilisateur
135 // OU
136 // Recopie des données dans le buffer allouée par la méthode appelante (ex: lecture)
137 // dans le cas d'une demande utilisateur 0 copie mais que types utilisateurs et CORBA incompatibles.
138
139 //std::copy(dataPtr,dataPtr+nRead,data);
140 DataManipulator::copy(corbaData,data,nRead);
141
142 if (SALOME::VerbosityActivated())
143 {
144 T1 * tmpData = data;
145 std::cerr << "-------- Copy2UserSpace<false> MARK 1c --data("<<tmpData<<")[0.."<<
146 DataManipulator::size(corbaData) <<"] : ----------------" << std::endl;
147 std::copy(tmpData,tmpData+DataManipulator::size(corbaData),std::ostream_iterator<T1>(std::cerr," "));
148 for (int i=0; i< DataManipulator::size(corbaData); ++i)
149 fprintf(stderr,"pointer[%d]=%p ",i, tmpData[i]);
150 std::cerr << std::endl;
151 }
152 }
153};
154
155
156// Désallocation des buffers si necessaire
157template <bool rel, typename DataManipulator >
159 template <typename T>
160 static void apply(T * /*dataPtr*/) {
161
162 typedef typename DataManipulator::Type DataType; // Attention != T
163
164 // Attention : Seul CalciumCouplingPolicy via eraseDataId doit décider de supprimer ou non
165 // la donnée corba associée à un DataId !
166 // Ne pas effectuer la desallocation suivante :
167 // DataManipulator::relPointer(dataPtr);
168 }
169};
170
171// Désalocation du buffer intermédiaire
172// dans le cas d'un type Utilisateur différent du type CORBA
173template <typename DataManipulator>
174struct DeleteTraits< false, DataManipulator > {
175
176 template <typename T>
177 static void apply(T * dataPtr) { delete[] dataPtr; }
178
179};
180
181#endif
def copy(src, dst)
Definition: pythonpath_reduction.py:35
static void apply(T1 *&data, T2 &corbaData, size_t nRead)
Definition: Copy2UserSpace.hxx:105
Definition: Copy2UserSpace.hxx:45
static void apply(T1 *&data, T2 &corbaData, size_t)
Definition: Copy2UserSpace.hxx:48
static void apply(T *dataPtr)
Definition: Copy2UserSpace.hxx:177
Definition: Copy2UserSpace.hxx:158
static void apply(T *)
Definition: Copy2UserSpace.hxx:160