16#include <EcrFicPartage.h>
18#include <Comm_Group.h>
19#include <communications.h>
20#include <Perf_counters.h>
39 obuffer_ptr_->set_64b(this->
is_64b());
44inline OBuffer& EcrFicPartage::get_obuffer()
61#ifdef FILESYSTEM_NON_GLOBAL
75 get_obuffer().new_buffer();
94 const int buflen = get_obuffer().len();
97 Cerr <<
"***** WARNING : EcrFicPartage::close() ******* "<<
nom_fic_
98 <<
"\non PE " <<
me() <<
" the buffer is not empty\n"
99 <<
" (Missing syncfile) : one makes a last syncfile" << finl;
100 Cerr<<get_obuffer().str()<<finl;
104 const trustIdType maxbuflen =
mp_sum(buflen);
113 Cerr<<
"It missed a syncfile somewhere"<<finl;
114 Cerr<<
"Indeed, maxbuflen =" << maxbuflen << finl;
115 Cerr<<
"GF prefers to stop the calculation to correct "<<finl;
188 get_obuffer().put_null_char();
195 const int nb_proc =
nproc();
196 for(p=0; p<nb_proc; p++)
198 const char * buffer_data = 0;
199 char * allocated_buffer = 0;
208 buffer_data = get_obuffer().str();
209 buf_size = get_obuffer().len();
215 envoyer(dummy, p, 100);
216 recevoir(buf_size, p, 100);
219 buffer_data = allocated_buffer =
new char[buf_size];
220 group.
recv(p, allocated_buffer, buf_size, 100);
231 statistics().begin_count(STD_COUNTERS::IO_EcrireFicPartageBin,statistics().get_last_opened_counter_level()+1);
232 os.write(buffer_data, buf_size);
233 statistics().end_count(STD_COUNTERS::IO_EcrireFicPartageBin,1,buf_size);
238 assert(buffer_data[buf_size-1] == 0);
244 if (allocated_buffer)
245 delete[] allocated_buffer;
257 recevoir(dummy, 0, 100);
258 int buf_size = get_obuffer().len();
259 envoyer(buf_size, 0, 100);
263 const char * buffer_data = get_obuffer().str();
264 group.
send(0, buffer_data, buf_size, 100);
269 get_obuffer().new_buffer();
295int EcrFicPartage::put(
const unsigned* ob, std::streamsize n, std::streamsize pas) {
return put_template<unsigned>(ob,n,pas); }
296int EcrFicPartage::put(
const int* ob, std::streamsize n, std::streamsize pas) {
return put_template<int>(ob,n,pas); }
297int EcrFicPartage::put(
const long* ob, std::streamsize n, std::streamsize pas) {
return put_template<long>(ob,n,pas); }
298int EcrFicPartage::put(
const long long* ob, std::streamsize n, std::streamsize pas) {
return put_template<long long>(ob,n,pas); }
299int EcrFicPartage::put(
const float* ob, std::streamsize n, std::streamsize pas) {
return put_template<float>(ob,n,pas); }
300int EcrFicPartage::put(
const double* ob, std::streamsize n, std::streamsize pas) {
return put_template<double>(ob,n,pas); }
306 get_obuffer().set_bin(
bin_);
312 get_obuffer().set_64b(is64);
virtual void set_bin(bool bin)
bool bin_
Is this a binary flux?
virtual void set_64b(bool is_64b)
: Cette classe decrit un groupe de processeurs sur lesquels
virtual void send(int pe, const void *buffer, int size, int tag) const =0
virtual void recv(int pe, void *buffer, int size, int tag) const =0
int put(const unsigned *ob, std::streamsize n, std::streamsize pas) override
int get_precision() override
~EcrFicPartage() override
ferme le fichier
Sortie & unlockfile() override
Permet de debloquer la ressource critique pour leprocessus suivant.
Sortie & lockfile() override
Permet au processus appelant de bloquer en attente de la ressource commune a tous les processus qui e...
Sortie & flush() override
void set_bin(bool bin) override
Sortie & operator<<(const char *ob) override
Ecriture d'une chaine de caracteres.
int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out) override
Ouvre le fichier avec les parametres mode et prot donnes Ces parametres sont les parametres de la met...
Sortie & syncfile() override
Provoque l'ecriture sur disque des donnees accumulees sur les differents processeurs depuis le dernie...
void precision(int) override
void set_64b(bool is64) override
Class defining operators and methods for all reading operation in an input flow (file,...
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static const Comm_Group & current_group()
renvoie une reference au groupe de processeurs actif courant
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
SFichier(const char *name, IOS_OPEN_MODE mode=ios::out)
Separateur pour les fichiers.
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out)
Classe de base des flux de sortie.