locking fixes
authorSteve McIntyre <steve@einval.com>
Wed, 19 Jan 2011 01:51:38 +0000 (01:51 +0000)
committerSteve McIntyre <steve@einval.com>
Wed, 19 Jan 2011 01:51:38 +0000 (01:51 +0000)
C/fmcache.c

index 5271749..78f1827 100644 (file)
@@ -174,7 +174,6 @@ int cache_entry_encode_complete(const char *cache_file_name, unsigned long long
     db_cache_entry_t in, out;
 
     pthread_mutex_lock(&cache_db_mutex);
-
     strncpy(in.cache_path, cache_file_name, sizeof(in.cache_path));
 
     /* Find the previous record for this cache file */
@@ -183,13 +182,10 @@ int cache_entry_encode_complete(const char *cache_file_name, unsigned long long
     {
         fprintf(stderr, "%s: failed to find previous entry to match cache file %s\n",
                 __func__, cache_file_name);
+        pthread_mutex_unlock(&cache_db_mutex);
         return error;
     }
 
-    /* Update the space used in cache now we have an accurate size;
-     * remove the old big estimate, reduce to the right size */
-    cache_add_space_used(size_used - out.size);
-
     /* Now update and write the db record back */
     out.state = FMDB_CACHE_FREE; /* We're done with it now... */
     out.size = size_used;
@@ -198,9 +194,14 @@ int cache_entry_encode_complete(const char *cache_file_name, unsigned long long
     {
         fprintf(stderr, "%s: failed to store replacement entry for cache file %s\n",
                 __func__, cache_file_name);
+        pthread_mutex_unlock(&cache_db_mutex);
         return error;
     }
     pthread_mutex_unlock(&cache_db_mutex);
+
+    /* Update the space used in cache now we have an accurate size;
+     * remove the old big estimate, reduce to the right size */
+    cache_add_space_used(size_used - out.size);
     return 0;
 }
 
@@ -220,6 +221,7 @@ int cache_entry_failed(const char *cache_file_name)
     {
         fprintf(stderr, "%s: failed to find previous entry to match cache file %s\n",
                 __func__, cache_file_name);
+        pthread_mutex_unlock(&cache_db_mutex);
         return error;
     }
 
@@ -232,6 +234,7 @@ int cache_entry_failed(const char *cache_file_name)
     {
         fprintf(stderr, "%s: failed to remove entry for cache file %s\n",
                 __func__, cache_file_name);
+        pthread_mutex_unlock(&cache_db_mutex);
         return error;
     }
     pthread_mutex_unlock(&cache_db_mutex);
@@ -254,16 +257,17 @@ char *cache_lookup_for_read(const char *basedir, const char *flac_path)
     int error = 0;
     db_cache_entry_t in, out;
 
-    pthread_mutex_lock(&cache_db_mutex);
-
     strncpy(in.flac_path, strip_leading_path(flac_path, basedir), sizeof(in.flac_path));
 
+    pthread_mutex_lock(&cache_db_mutex);
+
     /* Look for any existing cache records for this flac file */
     error = db_lookup_cache_entry_by_flac_path(dbp, &in, &out);
     if (error)
     {
         fprintf(stderr, "%s: failed to find previous entry to match flac_path %s\n",
                 __func__, in.flac_path);
+        pthread_mutex_unlock(&cache_db_mutex);
         return NULL;
     }
 
@@ -285,16 +289,17 @@ int cache_read_finished(const char *basedir, const char *flac_path)
     int error = 0;
     db_cache_entry_t in, out;
 
-    pthread_mutex_lock(&cache_db_mutex);
-
     strncpy(in.flac_path, strip_leading_path(flac_path, basedir), sizeof(in.flac_path));
 
+    pthread_mutex_lock(&cache_db_mutex);
+
     /* Look for any existing cache records for this flac file */
     error = db_lookup_cache_entry_by_flac_path(dbp, &in, &out);
     if (error)
     {
         fprintf(stderr, "%s: failed to find previous entry to match flac_path %s\n",
                 __func__, in.flac_path);
+        pthread_mutex_unlock(&cache_db_mutex);
         return ENOENT;
     }