Index: modules/aggregator/aggregator.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v
retrieving revision 1.405
diff -u -p -r1.405 aggregator.module
--- modules/aggregator/aggregator.module	1 Mar 2009 07:21:02 -0000	1.405
+++ modules/aggregator/aggregator.module	18 Mar 2009 14:36:27 -0000
@@ -287,10 +287,21 @@ function aggregator_perm() {
  * Checks news feeds for updates once their refresh interval has elapsed.
  */
 function aggregator_cron() {
-  $result = db_query('SELECT * FROM {aggregator_feed} WHERE checked + refresh < :time', array(':time' => REQUEST_TIME));
-  foreach ($result as $feed) {
-    aggregator_refresh($feed);
-  }
+  // There is no UI for this variable. It's for advanced use-cases.
+  $cron_percentage = variable_get('aggregator_cron_percentage', 50);
+  $cron_time_limit = ($cron_percentage / 100) * ini_get('max_execution_time');
+  timer_start('aggregator_cron');
+  do {
+    $processed_feeds = FALSE;
+    $result = db_query_range('SELECT * FROM {aggregator_feed} WHERE checked + refresh < :time', array(':time' => REQUEST_TIME), 0, 100);
+    foreach ($result as $feed) {
+      if ((timer_read('aggregator_cron') / 1000) > $cron_time_limit) {
+        break;
+      }
+      $processed_feeds = TRUE;
+      aggregator_refresh($feed);
+    }
+  } while ($processed_feeds === TRUE);
 }
 
 /**
