Back to index

salome-kernel  6.5.0
Static Public Member Functions
Copy2UserSpace< zerocopy, DataManipulator > Struct Template Reference

#include <Copy2UserSpace.hxx>

List of all members.

Static Public Member Functions

template<class T1 , class T2 >
static void apply (T1 *&data, T2 &corbaData, size_t nRead)

Detailed Description

template<bool zerocopy, typename DataManipulator>
struct Copy2UserSpace< zerocopy, DataManipulator >

Definition at line 47 of file Copy2UserSpace.hxx.


Member Function Documentation

template<bool zerocopy, typename DataManipulator>
template<class T1 , class T2 >
static void Copy2UserSpace< zerocopy, DataManipulator >::apply ( T1 *&  data,
T2 &  corbaData,
size_t  nRead 
) [inline, static]

Definition at line 50 of file Copy2UserSpace.hxx.

                                                                {

     typedef typename DataManipulator::InnerType       InnerType;

    // OLD:Devient propriétaire des données contenues dans la structure CORBA
    // OLD:(allouées par allocbuff() pour une séquence)
    // OLD:Le client est propriétaire des données.
    // OLD:Il doit cependant être attentif au fait que s'il les modifie,
    // OLD:une nouvelle demande de lecture lui fournira les données modifiées.
    // OLD:TODO : Si plusieurs lecteurs demandent la même donnée, 
    // OLD:       ? qui devient le propriétaire? --> Forcément le premier car
    // OLD:       ensuite la séquence n'est plus propriétaire et rendra un pointeur NULL.
    // OLD:     NO: Le port devrait resté propriétaire du contenu de la séquence
    // OLD:     NO: L'utilisateur doit de toute les façons utiliser les données reçues en
    // OLD:     NO: lecture seulement car si une nouvelle demande de lecture est formulée
    // OLD:     NO: pour ces données, les eventuelles modifications seraient visibles !
    // OLD:YES : La solution de donner la propriété à l'utilisateur est convenable car si
    // OLD:le port déréférence ces données (garbage collecteur, niveau) le buffer
    // OLD:reste disponible à l'ulisateur en lecture et écriture
    // OLD:Le problème est que la donnée CORBA stockée par le port est maintenant vide (cf CORBA BOOK)
    // OLD:du coup quid d'une nouvelle demande de lecture : A TESTER 

     // Le PORT doit être capable de répondre aux demandes de lecture
     // multiples d'une donnée pour une même estampille et doit donc garder un pointeur valide
     // sur le buffer. Il se pose cependant un problème s'il décide
     // de supprimer la donnée alors que des client utilise le buffer (historique calcium) !
     // La seule façon de gérer proprement cette situation est d'utiliser un shared_pointer (TODO).
     // Pour l'instant l'utilisateur du mode zero copie doit s'assurer que le niveau d'historique
     // utilisé par le port est compatible avec son utilisation des buffers. Il doit
     // être également conscient que s'il modifie le buffer, il est modifié pour tous les
     // utilisateurs actuels et futurs.
    
     //REF:    InnerType * dataPtr  = DataManipulator::getPointer(corbaData,true);
     // Laisse la propriété des données à la structure CORBA
     // (buffer allouée par allocbuff() pour une séquence)
     InnerType * dataPtr  = DataManipulator::getPointer(corbaData,false);

    // Cette ligne poserait uun problème dans la méthode appelante, si elle
    // ne testait pas que les types utilisateurs et CORBA sont identiques :
    // ex :  InnerType == Corba::Long et d'un T == int
    // C'est l'objet de la spécialisation ci-dessous.
    data = dataPtr; 

    // En zero copie l'utilisateur doit appeler ecp_free ( cas ou un buffer intermédiaire
    // a été alloué pour cause de typage différent xor necessité de désalouer le buffer alloué par CORBA)
    // L'utilisateur doit cependant être attentif au fait qu'après désallocation, si la donnée
    // est toujours estampillée dans le port une nouvelle lecture pour cette estampille
    // rendrait un buffer vide.
  }

The documentation for this struct was generated from the following file: