]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Coding seems to be done for 0817. Check driver:344 I am not sure about lock.
authorkan <kan@opencascade.com>
Fri, 16 Dec 2011 17:49:55 +0000 (17:49 +0000)
committerkan <kan@opencascade.com>
Fri, 16 Dec 2011 17:49:55 +0000 (17:49 +0000)
src/LightApp/LightApp_Driver.cxx
src/LightApp/LightApp_Driver.h
src/SUIT/SUIT_Session.cxx
src/SUIT/SUIT_Session.h

index 32eaade9b4bd93c986623e3e872861bfbdf11cc3..82f6f501cc87bf3266113979a9563a1891408c9a 100644 (file)
 
 #ifdef WIN32
 #include <time.h>
+#else
+#include <cstdio>
+#include <unistd.h>
+#include <fcntl.h>
+#include <cerrno>
 #endif
 
 #include <TCollection_AsciiString.hxx> 
@@ -47,7 +52,8 @@ LightApp_Driver::LightApp_Driver()
   myFileNameSizes( 0 ),
   myCurrOFile( 0 ),
   myNbFilles( 0 ),
-  myBloc( 0 )
+  myBloc( 0 ),
+  myBlocFcntl( 0 )
 {
 }
  
@@ -241,8 +247,44 @@ void LightApp_Driver::SetListOfFiles( const char* theModuleName, const ListOfFil
 
   QString fName = Qtx::addSlash( theListOfFiles.front().c_str() ) + "used_by_salome";
   myBloc = fopen( fName.toLatin1().constData(), "w" );
+
+#ifndef WIN32
+  fName += ".fcntl";
+  myBlocFcntl = fopen( fName.toLatin1().constData(), "w" );
+#endif
+  lockFcntl( QString() );
+
 }
 
+/*
+ * Lock theLF or myBlockFcntl if empty
+ * returns 0 on success
+ */
+int LightApp_Driver::lockFcntl( QString theLF )
+{
+#ifdef WIN32
+  return 0;
+#else
+  if ( theLF.isEmpty() && !myBlocFcntl )
+    return -2;
+
+  FILE* aFD;
+  if ( theLF.isEmpty() )
+    aFD = myBlocFcntl;
+  else
+    aFD = fopen( theLF.toLatin1().constData(), "w" );
+  
+  struct flock fLock;
+  fLock.l_type = F_WRLCK;
+  fLock.l_whence = SEEK_SET;
+  fLock.l_len = 0;
+  fLock.l_start = 0;
+  return fcntl( fileno( aFD ), F_SETLK, &fLock );
+#endif
+
+}
+
+
 /*!
   Remove files. First item in <theFiles> is a directory with slash at the end.
   Other items are names of files. If <IsDirDeleted> is true,
@@ -387,6 +429,16 @@ std::string LightApp_Driver::GetTmpDir()
   QString blocName = Qtx::addSlash(tmpDir) + "used_by_salome";
   myBloc = fopen( blocName.toLatin1().constData(), "w" );
   
+#ifndef WIN32
+  blocName += ".fcntl";
+  if ( myBlocFcntl )
+    fclose( myBlocFcntl );
+  myBlocFcntl = fopen( blocName.toLatin1().constData(), "w" );
+#endif
+  lockFcntl( QString() );
+
+
+  
   return aTmpDir.ToCString();
 }
 
index 58499f022bf538dc222a87baa598b8c2c0742540..1928bf9508a86501121adf5f8e5347f53aa63214 100644 (file)
@@ -31,6 +31,8 @@
 #pragma warning( disable:4251 )
 #endif
 
+class QString;
+
 /*!Description : Driver can save to file and read from file list of files for light modules*/
 
 class LIGHTAPP_EXPORT LightApp_Driver
@@ -81,12 +83,17 @@ protected:
 
   void                SetIsTemporary( bool theFlag ) { myIsTemp = theFlag; }
   bool                IsTemporary() const { return myIsTemp; }
+  
+  int                 lockFcntl( QString theLF );
 
 protected:
   typedef std::map<std::string, ListOfFiles> MapOfListOfFiles;
   MapOfListOfFiles                           myMap;
   std::string                                myTmpDir;
   FILE*                                      myBloc;
+#ifndef WIN32
+  FILE*                                      myBlocFcntl;
+#endif
 
 private:
   bool                                       myIsTemp;
index 7ebb712f68fab8fc5ae09fd707de28cfd22290d9..e3bf5f50301355e17629d19eb4f61479c22104a8 100755 (executable)
 #include <windows.h>
 #else
 #include <dlfcn.h>
+
+#include <cstdio>
+#include <unistd.h>
+#include <fcntl.h>
+#include <cerrno>
 #endif
 
 #include "SUIT_Study.h"
@@ -48,7 +53,8 @@ SUIT_Session::SUIT_Session()
   myExitStatus( NORMAL ),
   myExitFlags ( 0 ),
   myBTimer( 0 ),
-  myBFile( 0 )
+  myBFile( 0 ),
+  myBFileFcntl( 0 )
 {
   SUIT_ASSERT( !mySession )
 
@@ -525,9 +531,43 @@ void SUIT_Session::createBackupTimer()
   {
     QString used = Qtx::addSlash( myBFolder ) + "used_by_salome";
     myBFile = fopen( used.toLatin1().constData(), "w" );
+
+#ifndef WIN32
+    used += ".fcntl";
+    myBFileFcntl = fopen( used.toLatin1().constData(), "w" );
+#endif
+    lockFcntl( QString() );
   }
 }
 
+/*
+ * Lock theLF or myBFileFcntl if empty
+ * returns 0 on success
+ */
+int SUIT_Session::lockFcntl( QString theLF )
+{
+#ifdef WIN32
+  return 0;
+#else
+  if ( theLF.isEmpty() && !myBFileFcntl )
+    return -2;
+
+  FILE* aFD;
+  if ( theLF.isEmpty() )
+    aFD = myBFileFcntl;
+  else
+    aFD = fopen( theLF.toLatin1().constData(), "w" );
+  
+  struct flock fLock;
+  fLock.l_type = F_WRLCK;
+  fLock.l_whence = SEEK_SET;
+  fLock.l_len = 0;
+  fLock.l_start = 0;
+  return fcntl( fileno( aFD ), F_SETLK, &fLock );
+#endif
+
+}
+
 /*!
   Slot, called when backup interval is out, iterates through all opened 
   applications, creates 'folderName' directories for them and calls app->backup( folderName );
@@ -596,9 +636,18 @@ void SUIT_Session::restoreBackup()
     // checks whether folder is not currently used
     QString testFile = Qtx::addSlash( stdRoot ) + "used_by_salome";
     QFileInfo fi( testFile );
-    if ( fi.exists() && !QFile( testFile ).remove() )
-      continue;
-
+    if ( fi.exists() )
+    {
+#ifdef WIN32
+      if ( !QFile( testFile ).remove() )
+        continue;
+#else
+      testFile += ".fcntl";
+      if ( lockFcntl( testFile ) )
+        continue;
+#endif
+    }
+    
     toRemove.append( stdRoot );
 
     QDir sessDir( stdRoot );
@@ -694,7 +743,17 @@ void SUIT_Session::removeTmpFiles()
     // iterate through tmp folders
     const QString& currF = Qtx::addSlash( QDir::tempPath() ) + *it;
     QString blocName = Qtx::addSlash( currF ) + "used_by_salome";
-    if ( QFileInfo( blocName ).exists() && QFile::remove( blocName )  )
+
+
+    bool locked;
+#ifdef WIN32
+    locked = !QFile( blocName ).remove();
+#else
+      QString testFile = blocName + ".fcntl";
+      locked = lockFcntl( testFile );
+#endif
+
+    if ( QFileInfo( blocName ).exists() && !locked  )
     {
       // unused non-removed folder
       Qtx::rmDir( currF );
index f062a6dba39e5002aaa16073fc32c8cab77bd101..c0df6792c4c7361bbae7c82409173b0226140a21 100755 (executable)
@@ -99,6 +99,7 @@ private:
   void                          createBackupTimer();
   void                          restoreBackup();
   void                          removeTmpFiles();
+  int                           lockFcntl( QString theLF );
 
 private:
   typedef QList<SUIT_Application*> AppList;
@@ -124,6 +125,9 @@ private:
   QString                      myBFolder;
   QTimer*                      myBTimer;
   FILE*                        myBFile;
+#ifndef WIN32
+  FILE*                        myBFileFcntl;
+#endif
 };
 
 #endif