This project has retired. For details please refer to its Attic page.
AdjustableSemaphore xref
View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.apache.giraph.utils;
20  
21  import java.util.concurrent.Semaphore;
22  
23  import static com.google.common.base.Preconditions.checkState;
24  
25  /**
26   * Implementation of a semaphore where number of available permits can change
27   */
28  public final class AdjustableSemaphore extends Semaphore {
29    /** Maximum number of available permits */
30    private int maxPermits;
31  
32    /**
33     * Constructor
34     * @param permits initial number of available permits
35     */
36    public AdjustableSemaphore(int permits) {
37      super(permits);
38      maxPermits = permits;
39    }
40  
41    @edu.umd.cs.findbugs.annotations.SuppressWarnings(
42        "UG_SYNC_SET_UNSYNC_GET")
43    public int getMaxPermits() {
44      return maxPermits;
45    }
46  
47    /**
48     * Adjusts the maximum number of available permits.
49     *
50     * @param newMax max number of permits
51     */
52    public synchronized void setMaxPermits(int newMax) {
53      checkState(newMax >= 0, "setMaxPermits: number of permits cannot be " +
54          "less than 0");
55      int delta = newMax - this.maxPermits;
56      if (delta > 0) {
57        // Releasing semaphore to make room for 'delta' more permits
58        release(delta);
59      } else if (delta < 0) {
60        // Reducing number of permits in the semaphore
61        reducePermits(-delta);
62      }
63      this.maxPermits = newMax;
64    }
65  }