Index: includes/batch.queue.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/batch.queue.inc,v
retrieving revision 1.1
diff -u -r1.1 batch.queue.inc
--- includes/batch.queue.inc	8 Jan 2010 06:36:34 -0000	1.1
+++ includes/batch.queue.inc	4 Sep 2010 19:34:33 -0000
@@ -51,8 +51,8 @@
 
   public function claimItem($lease_time = 0) {
     if (!empty($this->queue)) {
-      reset($this->queue);
-      return current($this->queue);
+      $this->queue->rewind();
+      return $this->queue->current();
     }
     return FALSE;
   }
@@ -63,10 +63,6 @@
    * This is specific to Batch API and is not part of the DrupalQueueInterface,
    */
   public function getAllItems() {
-    $result = array();
-    foreach ($this->queue as $item) {
-      $result[] = $item->data;
-    }
-    return $result;
+    return $this->queue;
   }
 }
Index: modules/system/system.queue.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.queue.inc,v
retrieving revision 1.13
diff -u -r1.13 system.queue.inc
--- modules/system/system.queue.inc	14 Jun 2010 13:10:31 -0000	1.13
+++ modules/system/system.queue.inc	4 Sep 2010 19:34:33 -0000
@@ -307,61 +307,63 @@
    */
   protected $queue;
 
-  /**
-   * Counter for item ids.
-   *
-   * @var int
-   */
-  protected $id_sequence;
-
   public function __construct($name) {
-    $this->queue = array();
-    $this->id_sequence = 0;
+    $this->queue = new SplQueue();
   }
 
   public function createItem($data) {
     $item = new stdClass();
-    $item->item_id = $this->id_sequence++;
     $item->data = $data;
     $item->created = time();
     $item->expire = 0;
-    $this->queue[$item->item_id] = $item;
+    $this->queue[] = $item;
   }
 
   public function numberOfItems() {
-    return count($this->queue);
+    return $this->queue->count();
   }
 
   public function claimItem($lease_time = 30) {
-    foreach ($this->queue as $key => $item) {
-      if ($item->expire == 0) {
-        $item->expire = time() + $lease_time;
-        $this->queue[$key] = $item;
-        return $item;
+    // Expiry check of the current item.
+    while ($this->queue->current()->expire !== 0) {
+      if ($this->queue->valid()) {
+        // Iterate.
+        $this->queue->next();
+      }
+      else {
+        // Reached the end of the list, no item available.
+        return FALSE;
       }
     }
-    return FALSE;
+    
+    $item = new stdClass();
+    $item = $this->queue->current();
+    $item->key = $this->queue->key();
+    
+    // Mark the busy items.
+    $this->queue->current()->expire = time() + $lease_time;
+    
+    return $this->item;
   }
-
-  public function deleteItem($item) {
-    unset($this->queue[$item->item_id]);
+  
+  public function releaseItem($item) {
+    $this->queue[$item->key]->expire = 0;
   }
 
-  public function releaseItem($item) {
-    if (isset($this->queue[$item->item_id]) && $this->queue[$item->item_id]->expire != 0) {
-      $this->queue[$item->item_id]->expire = 0;
-      return TRUE;
-    }
-    return FALSE;
+  public function deleteItem($item) {
+    unset($this->queue[$item->key]);
   }
 
   public function createQueue() {
-    // Nothing needed here.
+    //Nothing needed here.
   }
-
+  
+  public function resetQueue() {
+    return $this->queue->rewind();
+  }
+  
   public function deleteQueue() {
-    $this->queue = array();
-    $this->id_sequence = 0;
+    $this->queue = new SplQueue();
   }
 }
 
