docs: public void remove(Token token,
                         boolean requiresCurrentCheckpoint)
                      throws ObjectManagerException
      {
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.entry(this,
                          cclass,
                          "remove",
                          new Object[] { token, new Boolean(requiresCurrentCheckpoint) });
  
          super.remove(token, requiresCurrentCheckpoint);
  
          // Cancel any writing.
          managedObjectsToWrite.remove(new Long(token.storedObjectIdentifier));
  
          // Now Schedule the deletion of the disk copy.
  
          // TODO see TODO for tokens toWrite in add() above.
          if (storeStrategy == STRATEGY_SAVE_ONLY_ON_SHUTDOWN) {
              // We dont need to add Objects that are not in the directory as they wont need to be 
              // deleted. This is important for Stores only written at shutdown as they may 
              // accumulate a lot of delete operations.
              if (managedObjectsOnDisk.contains(new Long(token.storedObjectIdentifier)))
                  tokensToDelete.put(new Long(token.storedObjectIdentifier),
                                     token);
  
          } else if (requiresCurrentCheckpoint) {
              // The checkpoint logic in ObjectManagerState never calls flush until all of the
              // requiresCurrentCheckpoint transactions have been checkpointed. So no need to synchronize 
              // on checkpointManagedObjectsToWrite.
              if (checkpointTokensToDelete == null)
                  captureCheckpointManagedObjects();
              checkpointTokensToDelete.put(new Long(token.storedObjectIdentifier),
                                           token);
  
          } else {
              // If flush() gets ahead of our addition to this table it will be deleted
              // next time.
              // Repeat attempts to insert the token into the tokensToDelete util we find one that 
              // we can be sure was included in a flush().
              for (;;) {
                  java.util.Map myTokensToDelete = tokensToDelete;
                  myTokensToDelete.put(new Long(token.storedObjectIdentifier),
                                       token);
                  // Make sure the flush() did not steal tokensToDelete while we were adding to it.
                  if (myTokensToDelete == tokensToDelete)
                      break;
              } // for (;;).
          }
  
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.exit(this,
                         cclass,
                         "remove");
      }