Index: includes/module.inc
===================================================================
--- includes/module.inc	(revision 3644)
+++ includes/module.inc	(working copy)
@@ -119,21 +119,25 @@
       unset($files[$filename]);
       continue;
     }
-    // Merge in defaults and save.
-    $files[$filename]->info = $file->info + $defaults;
 
     // Invoke hook_system_info_alter() to give installed modules a chance to
     // modify the data in the .info files if necessary.
     drupal_alter('system_info', $files[$filename]->info, $files[$filename]);
+    // Merge in defaults and save.
+    $files[$filename]->info = $file->info + $defaults;
+  }
 
-    // Log the critical hooks implemented by this module.
-    $bootstrap = 0;
-    foreach (bootstrap_hooks() as $hook) {
-      if (module_hook($file->name, $hook)) {
-        $bootstrap = 1;
-        break;
+  // If lock not acquired, return $files data without writing to database.
+  if (lock_acquire('module_rebuild_cache')) {
+    foreach ($files as $filename => $file) {
+      // Log the critical hooks implemented by this module.
+      $bootstrap = 0;
+      foreach (bootstrap_hooks() as $hook) {
+        if (module_hook($file->name, $hook)) {
+          $bootstrap = 1;
+          break;
+        }
       }
-    }
 
     // Update the contents of the system table:
     if (isset($file->status) || (isset($file->old_filename) && $file->old_filename != $file->filename)) {
@@ -144,7 +148,9 @@
       $files[$filename]->status = 0;
       $files[$filename]->throttle = 0;
       db_query("INSERT INTO {system} (name, info, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $file->name, serialize($files[$filename]->info), 'module', $file->filename, 0, 0, $bootstrap);
+      }
     }
+    lock_release('module_rebuild_cache');
   }
   $files = _module_build_dependencies($files);
   return $files;
Index: modules/system/system.module
===================================================================
--- modules/system/system.module	(revision 3644)
+++ modules/system/system.module	(working copy)
@@ -807,18 +807,24 @@
 function system_theme_data() {
   // Scan the installation theme .info files and their engines.
   $themes = _system_theme_data();
+  foreach ($themes as $key => $theme) {
+    if (!isset($theme->owner)) {
+      $themes[$key]->owner = '';
+    }
+  }
 
   // Extract current files from database.
   system_get_files_database($themes, 'theme');
 
-  db_query("DELETE FROM {system} WHERE type = 'theme'");
+  // If lock not acquired, return $themes data without writing to database.
+  if (lock_acquire('system_theme_data')) {
+    db_query("DELETE FROM {system} WHERE type = 'theme'");
 
-  foreach ($themes as $theme) {
-    if (!isset($theme->owner)) {
-      $theme->owner = '';
+    foreach ($themes as $theme) {
+      db_query("INSERT INTO {system} (name, owner, info, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d)", $theme->name, $theme->owner, serialize($theme->info), 'theme', $theme->filename, isset($theme->status) ? $theme->status : 0, 0, 0);
     }
 
-    db_query("INSERT INTO {system} (name, owner, info, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d)", $theme->name, $theme->owner, serialize($theme->info), 'theme', $theme->filename, isset($theme->status) ? $theme->status : 0, 0, 0);
+    lock_release('system_theme_data');
   }
 
   return $themes;
