? admin_menu_lock_acquire_menu_rebuild.patch
Index: admin_menu.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/admin_menu/admin_menu.inc,v
retrieving revision 1.11.2.26
diff -u -p -r1.11.2.26 admin_menu.inc
--- admin_menu.inc	24 Dec 2009 15:45:50 -0000	1.11.2.26
+++ admin_menu.inc	12 Aug 2010 20:44:13 -0000
@@ -5,6 +5,13 @@
  * The key function that builds the menu links whenever there is a menu rebuild.
  */
 function _admin_menu_rebuild_links() {
+  if (lock_acquire('menu_rebuild')) {
+    // Wait for another request that is already doing this work.
+    // We choose to block here since otherwise the router item may not
+    // be avaiable in menu_execute_active_handler() resulting in a 404.
+    lock_wait('menu_rebuild');
+    return FALSE;
+  }
   // Get the newly rebuilt menu.
   $menu = menu_router_build();
   // Add normal and suggested items as links.
@@ -40,6 +47,8 @@ function _admin_menu_rebuild_links() {
   foreach ($links as $item) {
     admin_menu_link_save($item);
   }
+
+  return TRUE;
 }
 
 /**
Index: admin_menu.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/admin_menu/admin_menu.module,v
retrieving revision 1.43.2.18
diff -u -p -r1.43.2.18 admin_menu.module
--- admin_menu.module	21 Jun 2009 18:58:04 -0000	1.43.2.18
+++ admin_menu.module	12 Aug 2010 20:44:13 -0000
@@ -139,8 +139,9 @@ function admin_menu_footer($main = 0) {
   // Check for the flag indicating that we need to rebuild.
   if (variable_get('admin_menu_rebuild_links', FALSE)) {
     module_load_include('inc', 'admin_menu');
-    _admin_menu_rebuild_links();
-    variable_del('admin_menu_rebuild_links');
+    if (_admin_menu_rebuild_links()) {
+      variable_del('admin_menu_rebuild_links');
+    }
   }
 
   $content  = '<div id="admin-menu">';
