? views-1003716.patch
Index: includes/cache.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/includes/cache.inc,v
retrieving revision 1.25.2.4
diff -u -p -r1.25.2.4 cache.inc
--- includes/cache.inc	12 Mar 2010 01:51:47 -0000	1.25.2.4
+++ includes/cache.inc	24 Dec 2010 05:22:23 -0000
@@ -100,20 +100,31 @@ function _views_discover_default_views()
   static $cache = NULL;
 
   if (!isset($cache)) {
+    // Wait for the cache to be rebuilt.
+    if (!lock_may_be_available('views_default_cache')) {
+      lock_wait('views_default_cache');
+    }
+
     $index = views_cache_get('views_default_views_index', TRUE);
 
+    $views_cache_bad = TRUE;
     // Retrieve each cached default view
     if (isset($index->data) && is_array($index->data)) {
       $cache = array();
+      $views_cache_bad = FALSE;
       foreach ($index->data as $view_name) {
         $data = views_cache_get('views_default:' . $view_name, TRUE);
         if (isset($data->data) && is_object($data->data)) {
           $cache[$view_name] = $data->data;
         }
+        else {
+          $views_cache_bad = TRUE;
+          break;
+        }
       }
     }
     // If missing index, rebuild the cache
-    else {
+    if ($views_cache_bad) {
       views_include_default_views();
       $cache = array();
 
@@ -139,13 +150,16 @@ function _views_discover_default_views()
       // Allow modules to modify default views before they are cached.
       drupal_alter('views_default_views', $cache);
 
-      // Cache the index
-      $index = array_keys($cache);
-      views_cache_set('views_default_views_index', $index, TRUE);
-
-      // Cache each view
-      foreach ($cache as $name => $view) {
-        views_cache_set('views_default:' . $name, $view, TRUE);
+      // Accquire a lock for writing to the view cache.
+      if (lock_acquire('views_default_cache')) {
+        // Cache the index
+        $index = array_keys($cache);
+        views_cache_set('views_default_views_index', $index, TRUE);
+
+        // Cache each view
+        foreach ($cache as $name => $view) {
+          views_cache_set('views_default:' . $name, $view, TRUE);
+        }
       }
     }
   }
