Index: includes/module.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/module.inc,v retrieving revision 1.115.2.3 diff -u -p -r1.115.2.3 module.inc --- includes/module.inc 16 Nov 2009 17:17:35 -0000 1.115.2.3 +++ includes/module.inc 15 Jun 2010 17:38:27 -0000 @@ -94,6 +94,14 @@ function module_list($refresh = FALSE, $ * The array of filesystem objects used to rebuild the cache. */ function module_rebuild_cache() { + $write_database = TRUE; + // If lock not acquired, return $files data without writing to database. + if (!lock_acquire('module_rebuild_cache')) { + $write_database = FALSE; + // Wait for the parallel thread to be done so we are more likely + // to get updated and consistent data. + lock_wait('module_rebuild_cache'); + } // Get current list of modules $files = drupal_system_listing('\.module$', 'modules', 'name', 0); @@ -120,32 +128,39 @@ function module_rebuild_cache() { 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]); - // Log the critical hooks implemented by this module. - $bootstrap = 0; - foreach (bootstrap_hooks() as $hook) { - if (module_hook($file->name, $hook)) { - $bootstrap = 1; - break; + // Merge in defaults and save. + $files[$filename]->info = $file->info + $defaults; + } + + // If lock not acquired, return $files data without writing to database. + if ($write_database) { + 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)) { - db_query("UPDATE {system} SET info = '%s', name = '%s', filename = '%s', bootstrap = %d WHERE filename = '%s'", serialize($files[$filename]->info), $file->name, $file->filename, $bootstrap, $file->old_filename); - } - else { - // This is a new module. - $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); + // Update the contents of the system table: + if (isset($file->status)) { + db_query("UPDATE {system} SET info = '%s', name = '%s', filename = '%s', bootstrap = %d WHERE filename = '%s'", serialize($files[$filename]->info), $file->name, $file->filename, $bootstrap, $file->old_filename); + } + else { + // This is a new module. + $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 =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.585.2.49 diff -u -p -r1.585.2.49 system.module --- modules/system/system.module 4 Mar 2010 00:15:28 -0000 1.585.2.49 +++ modules/system/system.module 15 Jun 2010 17:38:27 -0000 @@ -806,22 +806,47 @@ function system_theme_default() { * Array of all available themes and their data. */ function system_theme_data() { + $write_database = TRUE; + // If lock not acquired, return $files data without writing to database. + if (!lock_acquire('system_theme_data')) { + $write_database = FALSE; + // Wait for the parallel thread to be done so we are more likely + // to get updated and consistent data. + lock_wait('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'"); - - foreach ($themes as $theme) { - if (!isset($theme->owner)) { - $theme->owner = ''; + // If lock not acquired, return $themes data without writing to database. + if ($write_database) { + $names = array(); + + foreach ($themes as $theme) { + // Record the name of each theme found in the file system. + $names[] = $theme->name; + // Update the contents of the system table. + if (isset($theme->status)) { + db_query("UPDATE {system} SET owner = '%s', info = '%s', filename = '%s' WHERE name = '%s' AND type = '%s'", $theme->owner, serialize($theme->info), $theme->filename, $theme->name, 'theme'); + } + else { + // This is a new 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, 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); + // Delete from the system table any themes missing from the file system. + if ($names) { + db_query("DELETE FROM {system} WHERE type = 'theme' AND name NOT IN (". db_placeholders($names, 'varchar') .")", $names); + } + lock_release('system_theme_data'); } - return $themes; }