diff -r ef76fc2ac88c -r e4420d2515f1 org.chromium.debug.core/src/org/chromium/debug/core/model/DestructingGuard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/DestructingGuard.java Wed Dec 23 17:13:18 2009 -0800 @@ -0,0 +1,46 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.debug.core.model; + +import java.util.ArrayList; +import java.util.List; + +/** + * Helper class that destructs unfinished objects. It is needed when Java GC is not enough. + * It requires to be explicitly discharged if all went OK and destruction should be cancelled. + * Using this class may be more convenient that try/finally in Java. + */ +public class DestructingGuard { + /** + * Confirms that constructing has finished OKAY and no destruction is needed from now. + */ + public void discharge() { + discharged = true; + } + + /** + * This method is supposed to be called from finally clause. It performs destructing + * unless {@link #discharge()} has been called. + */ + public void doFinally() { + if (discharged) { + return; + } + for (int i = destructables.size() - 1; i >= 0; i--) { + destructables.get(i).destruct(); + } + discharged = true; + } + + /** + * Adds another value that should be destructed. Added values are destructed in reversed order. + */ + public void addValue(Destructable destructable) { + this.destructables.add(destructable); + } + + private List destructables = new ArrayList(1); + private boolean discharged = false; +}