myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [SCM] GNU MyServer branch, master, updated. v0.9.2-283


From: Giuseppe Scrivano
Subject: [myserver-commit] [SCM] GNU MyServer branch, master, updated. v0.9.2-283-gc5e0254
Date: Sat, 07 Aug 2010 01:11:19 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU MyServer".

The branch, master has been updated
       via  c5e025441689007017bb5f6e0f330d4873c76284 (commit)
      from  4d0ba86918a76435b88e904ca41e1ef4e1ad7d1e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------


commit c5e025441689007017bb5f6e0f330d4873c76284
Author: Giuseppe Scrivano <address@hidden>
Date:   Sat Aug 7 03:10:59 2010 +0200

    CachedFileFactory: Use a different lock for any record.

diff --git a/myserver/include/base/files_cache/cached_file_buffer.h 
b/myserver/include/base/files_cache/cached_file_buffer.h
index 602b8d7..42ac0fb 100644
--- a/myserver/include/base/files_cache/cached_file_buffer.h
+++ b/myserver/include/base/files_cache/cached_file_buffer.h
@@ -58,8 +58,8 @@ public:
 
   void refreshExpireTime (u_long now) {expireTime = now + MYSERVER_SEC (5);}
   u_long getExpireTime () {return expireTime;}
-protected:
 
+protected:
   /*! Last mtime for this file.  */
   time_t mtime;
 
diff --git a/myserver/include/base/files_cache/cached_file_factory.h 
b/myserver/include/base/files_cache/cached_file_factory.h
index 449e333..9a814aa 100644
--- a/myserver/include/base/files_cache/cached_file_factory.h
+++ b/myserver/include/base/files_cache/cached_file_factory.h
@@ -76,6 +76,8 @@ protected:
 
   struct CachedFileFactoryRecord
   {
+    Mutex mutex;
+
     /*! Number of times the cache record was used.  */
     u_long used;
 
@@ -85,7 +87,7 @@ protected:
     /*! This entry is not valid and will be removed when refCount = 0.  */
     bool invalidCache;
 
-    CachedFileBuffer* buffer;
+    CachedFileBuffer *buffer;
   };
 
   list<CachedFileFactoryRecord *> buffersToRemove;
diff --git a/myserver/src/base/files_cache/cached_file_factory.cpp 
b/myserver/src/base/files_cache/cached_file_factory.cpp
index 2d90150..62bc658 100644
--- a/myserver/src/base/files_cache/cached_file_factory.cpp
+++ b/myserver/src/base/files_cache/cached_file_factory.cpp
@@ -136,19 +136,35 @@ void CachedFileFactory::initialize (u_long size)
 */
 File* CachedFileFactory::open (const char* filename, int flags)
 {
-  CachedFileFactoryRecord *record;
+  CachedFileFactoryRecord *record = NULL;
   CachedFileBuffer *buffer;
   CachedFile* cachedFile;
   u_long ticks = getTicks ();
-
   mutex.lock ();
   try
     {
+      purgeRecords ();
+
       record = buffers.get (filename);
-      buffer = record ? record->buffer : NULL;
+      if (record)
+        record->mutex.lock ();
+
+      mutex.unlock ();
+    }
+  catch (...)
+    {
+      mutex.unlock ();
+      throw;
+    }
 
+  try
+    {
+      buffer = NULL;
+
+      /* Check the record is valid.  */
       if (record)
         {
+          buffer = record->buffer;
           if (buffer->getExpireTime () <= ticks)
             {
               buffer->refreshExpireTime (ticks);
@@ -160,7 +176,7 @@ File* CachedFileFactory::open (const char* filename, int 
flags)
 
           if (record->invalidCache || noSymlink)
             {
-              mutex.unlock ();
+              record->mutex.unlock ();
 
               File *file = new File ();
               flags = flags & File::NO_FOLLOW_SYMLINK;
@@ -182,27 +198,22 @@ File* CachedFileFactory::open (const char* filename, int 
flags)
           if (file->openFile (filename, File::OPEN_IF_EXISTS | flags
                               | File::READ))
             {
-              mutex.unlock ();
               delete file;
               return NULL;
             }
 
           fileSize = file->getFileSize ();
-          purgeRecords ();
           if (minSize && fileSize < minSize
-              || maxSize && fileSize > maxSize
+               || maxSize && fileSize > maxSize
               || fileSize > size - usedSize)
-            {
-              mutex.unlock ();
-              return file;
-            }
+            return file;
           else
             {
               record = new CachedFileFactoryRecord ();
+              record->mutex.lock ();
               buffer = new CachedFileBuffer (file);
               file->close  ();
               delete file;
-
               buffer->setFactoryToNotify (this);
               record->created = ticks;
               record->buffer = buffer;
@@ -212,17 +223,17 @@ File* CachedFileFactory::open (const char* filename, int 
flags)
             }
         }
       record->used++;
-
       cachedFile = new CachedFile (buffer);
-
-      mutex.unlock ();
     }
   catch (...)
     {
-      mutex.unlock ();
+      if (record)
+        record->mutex.unlock ();
       throw;
     }
 
+  record->mutex.unlock ();
+
   return cachedFile;
 }
 
@@ -230,9 +241,9 @@ File* CachedFileFactory::open (const char* filename, int 
flags)
   Called by CachedFileBuffer when its counter reaches zero references.
   \param cfb A pointer to the source CachedFileBuffer object.
  */
-void CachedFileFactory::nullReferences (CachedFileBuffer* cfb)
+void CachedFileFactory::nullReferences (CachedFileBuffer *cfb)
 {
-  CachedFileFactoryRecord* record;
+  CachedFileFactoryRecord *record;
   float bufferAverageUsage;
   float spaceUsage;
   u_long ticks = getTicks ();
@@ -241,16 +252,13 @@ void CachedFileFactory::nullReferences (CachedFileBuffer* 
cfb)
   if (spaceUsage < 0.65f)
     return;
 
-  mutex.lock ();
+  record = buffers.get (cfb->getFilename ());
+  if (! record)
+    return;
+
+  record->mutex.lock ();
   try
     {
-      record = buffers.get (cfb->getFilename ());
-      if (! record)
-        {
-          mutex.unlock ();
-          return;
-        }
-
       bufferAverageUsage = (float)record->used * 1000.0f /
         (ticks - record->created);
 
@@ -262,11 +270,11 @@ void CachedFileFactory::nullReferences (CachedFileBuffer* 
cfb)
           if (record)
             buffersToRemove.push_back (record);
         }
-      mutex.unlock ();
+      record->mutex.unlock ();
     }
   catch (...)
     {
-      mutex.unlock ();
+      record->mutex.unlock ();
       throw;
     }
 }
@@ -292,6 +300,8 @@ u_long CachedFileFactory::purgeRecords ()
           delete rec;
         }
     }
+
   usedSize -= ret;
+
   return ret;
 }

-----------------------------------------------------------------------

Summary of changes:
 .../include/base/files_cache/cached_file_buffer.h  |    2 +-
 .../include/base/files_cache/cached_file_factory.h |    4 +-
 .../src/base/files_cache/cached_file_factory.cpp   |   66 +++++++++++--------
 3 files changed, 42 insertions(+), 30 deletions(-)


hooks/post-receive
-- 
GNU MyServer



reply via email to

[Prev in Thread] Current Thread [Next in Thread]