docs: protected void removeMessage(LMEMessage message)
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(tc, "removeMessage", new Object[] {new Integer(hashCode()), message, this });
  
      // If this was the message we entered the callback with we need
      // to move the start point back a bit
      if(message == callbackEntryMsg)
        callbackEntryMsg = message.previous;
  
      // If this is our current message we need to move the cursor
      // back a bit
      if(message == currentMsg)
        currentMsg = message.previous;
  
      // If this message was the next to expire we move the expiry cursor on to
      // the next eligible message. We leave any alarm registered so that it pops,
      // when this happens it realises the alarm is not valid for the next expiring
      // message and re-registers itself for the correct time. This gives us the
      // best performance when no locks are expiring as we're not continually
      // registering and de-registering alarms for every message
      if(message == nextMsgToExpire)
      {
        do
        {
          nextMsgToExpire = nextMsgToExpire.next;
        }
        while((nextMsgToExpire != null) && (nextMsgToExpire.expiryTime == 0));
      }
  
      if(message == nextMsgReferenceToExpire)
      {
        do
        {
          nextMsgReferenceToExpire = nextMsgReferenceToExpire.next;
        }
        while((nextMsgReferenceToExpire != null) && (nextMsgReferenceToExpire.expiryTime == 0));
      }
  
      // Unlink this message from the list
      if(message.previous != null)
        message.previous.next = message.next;
      else
        firstMsg = message.next;
  
      if(message.next != null)
        message.next.previous = message.previous;
      else
        lastMsg = message.previous;
  
      // Pool the element if there's space
      if(pooledCount < poolSize)
      {
        message.message = null;
        message.next = pooledMsg;
        message.previous = null;
        message.owner = null;
        message.jsMessage = null;
        message.expiryTime = 0;
        message.expiryMsgReferenceTime = 0;
        pooledMsg = message;
        pooledCount++;
      }
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "removeMessage", this);
    }