001    //package edu.unima.ky.parallel;
002    
003    import java.io.*;
004    
005    /**
006     * Semaphore.
007     * This class is safe against Thread InterruptedException.
008     * @author Akitoshi Yoshida
009     * @author Heinz Kredel.
010     */
011    
012    public class Semaphore implements Serializable {
013      private int init;
014      private int s;
015      private int del;
016    
017      /**
018       * Constructs a default semaphore.
019       */
020      public Semaphore() {
021        this(0);
022      }
023    
024      /**
025       * Constructs a semaphore with the given upper limit value.
026       */
027      public Semaphore(int i) {
028        if (i >=0) { init = i; } else { init = 0; }
029        s = init;
030        del = 0;
031      }
032    
033      /**
034       * Finalizes this object.
035       */
036      protected void finalize() throws Throwable {
037        if (init != s) { 
038            int x = s - init;
039            System.out.println("Semaphore: " + x + " pending operations."); 
040        }
041       super.finalize();
042      }
043    
044      /**
045       * Performs the P operation.
046       */
047      public synchronized void P() throws InterruptedException {
048        while (s <= 0) {
049          del++;
050          try { this.wait(); 
051          } finally { del--; }
052        }
053        s--;
054      }
055    
056      /**
057       * Performs the time limited P operation.
058       */
059      public synchronized boolean P(int m) throws InterruptedException {
060        if (s <= 0) {
061          del++;
062          try { this.wait(m); 
063          } finally { del--; }
064          if (s <= 0) return false;
065        }
066        s--;
067        return true;
068      }
069    
070      /**
071       * Performs the V operation.
072       */
073      public synchronized void V() {
074        s++;
075        if (del > 0) {
076          this.notify();
077        }
078      }
079    
080      /**
081       * checks if Semaphore is positive.
082       */
083      public boolean isPositive() {
084          return (s > 0);
085      }
086    
087    }