001 //package edu.unima.ky.parallel;
002
003 /**
004 * Semaphore.
005 * This class implements a semaphore.
006 * @author Akitoshi Yoshida
007 * @author Heinz Kredel.
008 */
009
010 public class Sema {
011 private int init;
012 private int s;
013 private int del;
014
015 /**
016 * Constructs a default semaphore.
017 */
018 public Sema() {
019 this(0);
020 }
021
022 /**
023 * Constructs a semaphore with the given upper limit value.
024 * @param i limit.
025 */
026 public Sema(int i) {
027 if (i >=0) { init = i; } else { init = 0; }
028 s = init;
029 del = 0;
030 }
031
032 /**
033 * Releases the ressources of the constructed semaphore.
034 */
035 protected void finalize() throws Throwable {
036 if (init != s) {
037 int x = s - init;
038 System.out.println("sema: " + x + " pending operations.");
039 }
040 super.finalize();
041 }
042
043 /**
044 * Performs the P operation, which causes the current thread
045 * to wait until the semaphore is positive.
046 */
047 public synchronized void P() {
048 while (s <= 0) {
049 del++;
050 try {
051 this.wait();
052 } catch (InterruptedException e) {}
053 del--;
054 }
055 s--;
056 }
057
058 /**
059 * The V operation increases the value of s.
060 */
061 public synchronized void V() {
062 s++;
063 if (del > 0) {
064 this.notify();
065 }
066 }
067
068 /**
069 * checks if Semaphore is positive.
070 */
071 public boolean isPositive() {
072 return (s > 0);
073 }
074
075 }