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  25 Jun 2010 10:14:45 -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;
   }
@@ -64,6 +64,7 @@
    */
   public function getAllItems() {
     $result = array();
+    $this->queue->rewind();
     foreach ($this->queue as $item) {
       $result[] = $item->data;
     }
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  25 Jun 2010 10:14:45 -0000
@@ -307,61 +307,69 @@
    */
   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;
+      }
+    }
+    // Mark the busy items.
+    $this->queue->current()->expire = time() + $lease_time;
+    return $this->queue->current();
+  }
+  
+  public function releaseItem($item) {
+    // Find & release
+    for ($this->queue->rewind(); $this->queue->valid(); $this->queue->next()) {
+      if ($this->queue->current() === $item) {
+        $this->queue->current()->expire = 0;
+        break;
       }
     }
-    return FALSE;
   }
 
   public function deleteItem($item) {
-    unset($this->queue[$item->item_id]);
-  }
-
-  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;
+    // Find & delete
+    for ($this->queue->rewind(); $this->queue->valid(); $this->queue->next()) {
+      if ($this->queue->current() === $item) {
+        $this->queue->offsetUnset($this->queue->key());
+        break;
+      }
     }
-    return FALSE;
   }
 
   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();
   }
 }
