docs: public void cancel()
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(this, tc, "cancel");
      
      ArrayList<BatchedTimeoutEntry> localActiveList = null; 
  
      btmLockManager.lock();
      try
      {
        if (activeEntries != null)
        {
          // Take a local copy so we don't need to hold the lock when
          // we drive the processTimedoutEntries method
          LinkedListEntry entry = (LinkedListEntry) activeEntries.getFirst();
          while(entry != null)
          {
            if(entry.bte != null)
            {
              if(localActiveList == null)
                localActiveList = new ArrayList<BatchedTimeoutEntry>();
              
              localActiveList.add(entry.bte);
            }
            
            entry = (LinkedListEntry) entry.getNext();
          }
        }
      }
      finally
      {
        btmLockManager.unlock();
      }
      
      // Now call cancel on all entries
      if(localActiveList != null)
      {
        for (int i = 0; i < localActiveList.size(); i++)
          localActiveList.get(i).cancel();
      }
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "cancel");
    }
    
    /*
     * Go through the entries, telling them of the cancellation (if they're interested)
     */
    public void driveAllActiveEntries()
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(this, tc, "driveAllActiveEntries");
      
      ArrayList<BatchedTimeoutEntry> localActiveList = null; 
  
      btmLockManager.lock();
      try
      {
        // Take a local copy so we don't need to hold the lock when
        // we drive the processTimedoutEntries method
        LinkedListEntry entry = (LinkedListEntry) activeEntries.getFirst();
        while(entry != null)
        {
          if(entry.bte != null)
          {
            if(localActiveList == null)
              localActiveList = new ArrayList<BatchedTimeoutEntry>();
            
            localActiveList.add(entry.bte);
          }
          
          entry = (LinkedListEntry) entry.getNext();
        }
      }
      finally
      {
        btmLockManager.unlock();
      }
      
      // Now call the 'alarm' method
      if(localActiveList != null)
        handler.processTimedoutEntries(localActiveList);
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "driveAllActiveEntries");
    }
    
    /**
     * Add a timeout entry
     * @param value The BTE to start an alarm for
     */
    public void addTimeoutEntry(BatchedTimeoutEntry bte)
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
      	SibTr.entry(tc, "addTimeoutEntry", bte);
      
      //get a new entry for the active list
      btmLockManager.lockExclusive();
      try
      {
        LinkedListEntry entry = (LinkedListEntry) linkedListEntryPool.remove();
        if(entry == null)
        {
          entry = new LinkedListEntry();
        }
        entry.bte = bte;    
        bte.setEntry(entry);
        
        //put the new entry in the active list
        activeEntries.put(entry);
        
        //if we're not stopped
        if(!isStopped)
        {
          //start a new alarm
          startNewAlarm(entry);
        }
      }
      finally
      {
        btmLockManager.unlockExclusive();
      }
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
      	SibTr.exit(tc, "addTimeoutEntry");
    }
  
    /**
     * Remove a timeout entry.
     * @param value The BTE to be removed from the active list
     */
    public void removeTimeoutEntry(BatchedTimeoutEntry bte)
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
      	SibTr.entry(tc, "removeTimeoutEntry", bte);
      
      btmLockManager.lockExclusive();
      try
      {
        //get the BTE's entry in the active list
        LinkedListEntry entry = bte.getEntry();
        //if it's not active, it won't have an entry    
        if(activeEntries.contains(entry))
        {      
          //remove it from the active list
          activeEntries.remove(entry);
          //clean up
          bte.setEntry(null);
          
          if(entry.alarm != null)
          {
            // Cancel the alarm (but not the whole group). This allows us to reuse the
            // entry (put it back in the pool) now that the alarm manager will not invoke
            // the alarms registered entry (i.e. this pooled object)
            ((MPAlarmImpl)entry.alarm).cancelSingleEntry();
            entry.alarm = null;
          }
          
          entry.bte = null;
          linkedListEntryPool.add(entry);                  
        }
      }
      finally
      {
        btmLockManager.unlockExclusive();
      }
          
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
      	SibTr.exit(tc, "removeTimeoutEntry");
    }
  
    /* (non-Javadoc)
     * @see com.ibm.ws.sib.processor.utils.am.GroupAlarmListener#beginGroupAlarm(java.lang.Object)
     */
    public void beginGroupAlarm(Object firstContext)
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(tc, "beginGroupAlarm", new Object[] { firstContext });
  
      LinkedListEntry entry = (LinkedListEntry)firstContext;
  
      btmLockManager.lock();
      timeoutLockManager.lockExclusive();
      try
      {
        if(!isStopped && activeEntries.contains(entry))
        {
          //start a new batch, clear the timedout list
          timedout.clear();
                
          //the alarm reference for this entry is not longer valid
          entry.alarm = null;
          //add the first BTE
          timedout.add(entry.bte);
        }
      }
      finally
      {
        timeoutLockManager.unlockExclusive();
        btmLockManager.unlock();  
      }
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "beginGroupAlarm");
    }
  
    /* (non-Javadoc)
     * @see com.ibm.ws.sib.processor.utils.am.GroupAlarmListener#addContext(java.lang.Object)
     */
    public void addContext(Object nextContext)
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(tc, "addContext", new Object[] { nextContext });
  
      LinkedListEntry entry = (LinkedListEntry)nextContext;
      
      btmLockManager.lock();
      if(!isStopped && activeEntries.contains(entry))
      {
        //the alarm reference for this entry is not longer valid
        entry.alarm = null;
        timeoutLockManager.lockExclusive();
        //add each BTE to the timedout list
        timedout.add(entry.bte);
        timeoutLockManager.unlockExclusive();
      }
      btmLockManager.unlock();
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "addContext");
    }
  
    /* (non-Javadoc)
     * @see com.ibm.ws.sib.processor.utils.am.GroupAlarmListener#getGroupUuid()
     */
    public SIBUuid12 getGroupUuid()
    {
      return uuid;
    }
  }