From 943f499ef2fd8402f972f8e8203d47f00b27b8f1 Mon Sep 17 00:00:00 2001
From: Giovanni Bussi <giovanni.bussi@gmail.com>
Date: Tue, 18 Sep 2012 18:00:21 +0200
Subject: [PATCH] Fixed flushing

PlumedFile's were not flushed correctly
---
 src/GenericFlush.cpp |  1 +
 src/PlumedFile.cpp   |  1 +
 src/PlumedMain.cpp   | 16 ++++++++++++++++
 src/PlumedMain.h     | 12 ++++++++++++
 4 files changed, 30 insertions(+)

diff --git a/src/GenericFlush.cpp b/src/GenericFlush.cpp
index eb2244e8a..e6477d129 100644
--- a/src/GenericFlush.cpp
+++ b/src/GenericFlush.cpp
@@ -55,6 +55,7 @@ public:
   static void registerKeywords( Keywords& keys );
   void calculate(){};
   void apply(){
+    plumed.fflush();
     log.flush();
     const ActionSet & actionSet(plumed.getActionSet());
     for(ActionSet::const_iterator p=actionSet.begin();p!=actionSet.end();++p)
diff --git a/src/PlumedFile.cpp b/src/PlumedFile.cpp
index 9ed59ef4d..ed12e3552 100644
--- a/src/PlumedFile.cpp
+++ b/src/PlumedFile.cpp
@@ -116,6 +116,7 @@ PlumedFileBase& PlumedFileBase::open(const std::string& path,const std::string&
     const std::string pathsuf=path+plumed->getSuffix();
     fp=std::fopen(const_cast<char*>(pathsuf.c_str()),const_cast<char*>(mode.c_str()));
   }
+  if(plumed) plumed->insertFile(*this);
   if(!fp) fp=std::fopen(const_cast<char*>(path.c_str()),const_cast<char*>(mode.c_str()));
   plumed_massert(fp,"file " + path + "cannot be found");
   return *this;
diff --git a/src/PlumedMain.cpp b/src/PlumedMain.cpp
index 2619090b8..eec2949cd 100644
--- a/src/PlumedMain.cpp
+++ b/src/PlumedMain.cpp
@@ -595,6 +595,22 @@ std::string PlumedMain::cite(const std::string&item){
   return citations.cite(item);
 }
 
+void PlumedMain::fflush(){
+  for(files_iterator p=files.begin();p!=files.end();++p){
+    (*p)->flush();
+  }
+}
+
+void PlumedMain::insertFile(PlumedFileBase&f){
+  files.insert(&f);
+}
+
+void PlumedMain::eraseFile(PlumedFileBase&f){
+  files.erase(&f);
+}
+
+
+
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/PlumedMain.h b/src/PlumedMain.h
index e26b26ce8..a795b85e3 100644
--- a/src/PlumedMain.h
+++ b/src/PlumedMain.h
@@ -27,6 +27,7 @@
 #include <cstdio>
 #include <string>
 #include <vector>
+#include <set>
 
 
 // !!!!!!!!!!!!!!!!!!!!!!    DANGER   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
@@ -59,6 +60,7 @@ class PlumedCommunicator;
 class Stopwatch;
 class Citations;
 class ExchangePatterns;
+class PlumedFileBase;
 
 /**
 Main plumed object.
@@ -119,6 +121,10 @@ private:
 
 /// Class of possible exchange patterns, used for BIASEXCHANGE but also for future parallel tempering
   ExchangePatterns exchangepatterns;
+
+  std::set<PlumedFileBase*> files;
+  typedef std::set<PlumedFileBase*>::iterator files_iterator;
+
 public:
 /// Flag to switch off virial calculation (for debug)
   bool novirial;
@@ -219,6 +225,12 @@ public:
   FILE* fopen(const char *path, const char *mode);
 /// Closes a file opened with PlumedMain::fopen()
   int fclose(FILE*fp);
+/// Insert a file
+  void insertFile(PlumedFileBase&);
+/// Erase a file
+  void eraseFile(PlumedFileBase&);
+/// Flush all files
+  void fflush();
 };
 
 /////
-- 
GitLab