blob: 85634fc829144c48b42138c83e372dfe0112e665 [file] [log] [blame]
// Copyright 2014 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.events;
import java.util.Set;
/**
* A "latch" that just detects whether or not a particular type of event has happened, based on its
* kind.
*
* <p>Be careful when using this class to track errors reported during some operation. Namely, this
* pattern is not thread-safe:
*
* <pre><code>
* EventSensor sensor = new EventSensor(EventKind.ERRORS);
* reporter.addHandler(sensor);
* someActionThatMightCreateErrors(reporter)
* reporter.removeHandler(sensor);
* boolean containsErrors = sensor.wasTriggered();
* </code></pre>
*
* <p>If other threads generate errors on the reporter, then containsErrors may be true even if
* someActionThatMightCreateErrors() did not cause any errors.
*
* <p>As a workaround, run someActionThatMightCreateErrors() with a local reporter, merging its
* events with those of the shared reporter.
*/
public class EventSensor extends AbstractEventHandler {
private int triggerCount;
/**
* Constructs a sensor that will register all events matching the mask.
*/
public EventSensor(Set<EventKind> mask) {
super(mask);
}
/**
* Implements {@link EventHandler#handle(Event)}.
*/
@Override
public void handle(Event event) {
if (getEventMask().contains(event.getKind())) {
triggerCount++;
}
}
/**
* Returns true iff a qualifying event was handled.
*/
public boolean wasTriggered() {
return triggerCount > 0;
}
/**
* Returns the number of times the qualifying event was handled.
*/
public int getTriggerCount() {
return triggerCount;
}
}