]> git.treefish.org Git - phys/latlib.git/blobdiff - writeout.cpp
more conservative output-dir creation
[phys/latlib.git] / writeout.cpp
index 9a5409de4e16e0fdda1e654f2179f6364ef8034d..67e90d3b3b9f54fb826d3aa8a554010cd7e3e492 100644 (file)
@@ -24,21 +24,36 @@ string writeout::tstamp(const long& timestamp)
 writeout::writeout(const string& wdir, const string& signature, 
                   const int& rank, const int& procs, const long& timestamp)
 {
 writeout::writeout(const string& wdir, const string& signature, 
                   const int& rank, const int& procs, const long& timestamp)
 {
+  struct stat sb;
+
   if(wdir != ""){
     numprocs = procs;
     sprintf(cRank, "%d", rank);
     fulldir = wdir + "/" + tstamp(timestamp) + "_" + signature + ".tmp";
   if(wdir != ""){
     numprocs = procs;
     sprintf(cRank, "%d", rank);
     fulldir = wdir + "/" + tstamp(timestamp) + "_" + signature + ".tmp";
-    mkdir( fulldir.c_str(),  0775);
+
+    if ( rank == 0 )
+      for (int itry=0; itry < 10 && mkdir( fulldir.c_str(), 0775) != 0; itry++)
+       sleep(1);
+    else
+      while ( ! (stat(fulldir.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)) )
+       sleep(1);
 
     if(rank>0) of.open( (fulldir + "/rank" + cRank + ".tmp").c_str() );
     else of.open( (fulldir + "/" + signature + ".dat").c_str() );
 
     logf.open( (fulldir + "/rank" + cRank + ".log").c_str() );
 
 
     if(rank>0) of.open( (fulldir + "/rank" + cRank + ".tmp").c_str() );
     else of.open( (fulldir + "/" + signature + ".dat").c_str() );
 
     logf.open( (fulldir + "/rank" + cRank + ".log").c_str() );
 
+    if ( (!of.is_open()) || (!logf.is_open()) ) {
+      cerr << "WRITEOUT: Could not open output- and/or log-file!" << endl << flush;
+      exit(1);
+    }
+
     logf << "[ " << timestring() << " ] Log starts here." << endl;
     
     buf = of.rdbuf();
     logbuf = logf.rdbuf();
     logf << "[ " << timestring() << " ] Log starts here." << endl;
     
     buf = of.rdbuf();
     logbuf = logf.rdbuf();
+
+    cout << buf << endl;
   }
   else{
     buf = cout.rdbuf();
   }
   else{
     buf = cout.rdbuf();