diff --git a/src/main/java/linda/server/LindaClient.java b/src/main/java/linda/server/LindaClient.java index f5031ed..38e70c8 100644 --- a/src/main/java/linda/server/LindaClient.java +++ b/src/main/java/linda/server/LindaClient.java @@ -95,11 +95,15 @@ public class LindaClient implements Linda { } public void eventRegister(eventMode mode, eventTiming timing, Tuple template, Callback callback) { - try { - lindaServer.eventRegister(mode, timing, template, callback); - } catch (RemoteException e) { - e.printStackTrace(); - } + new Thread() { + public void run() { + try { + callback.call(lindaServer.waitForTuple(mode, timing, template)); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + }.start(); } public void debug(String prefix) { diff --git a/src/main/java/linda/server/LindaRemote.java b/src/main/java/linda/server/LindaRemote.java index 790c7bc..4b83e47 100644 --- a/src/main/java/linda/server/LindaRemote.java +++ b/src/main/java/linda/server/LindaRemote.java @@ -1,6 +1,5 @@ package linda.server; -import linda.Callback; import linda.Linda; import linda.Tuple; @@ -24,8 +23,7 @@ public interface LindaRemote extends Remote { public Collection readAll(Tuple template) throws RemoteException; - public void eventRegister(Linda.eventMode mode, Linda.eventTiming timing, Tuple template, Callback callback) - throws RemoteException; + public Tuple waitForTuple(Linda.eventMode mode, Linda.eventTiming timing, Tuple template) throws RemoteException; public void debug(String prefix) throws RemoteException; } diff --git a/src/main/java/linda/server/LindaServer.java b/src/main/java/linda/server/LindaServer.java index 0a9dfb8..e05356b 100644 --- a/src/main/java/linda/server/LindaServer.java +++ b/src/main/java/linda/server/LindaServer.java @@ -3,14 +3,13 @@ package linda.server; import java.util.Collection; import java.rmi.server.UnicastRemoteObject; -import java.net.MalformedURLException; import java.rmi.*; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; -import linda.Callback; -import linda.Linda; import linda.Tuple; +import linda.Linda.eventMode; +import linda.Linda.eventTiming; import linda.shm.CentralizedLinda; /** @@ -18,7 +17,7 @@ import linda.shm.CentralizedLinda; */ public class LindaServer extends UnicastRemoteObject implements LindaRemote { - Linda lindaInstance; + CentralizedLinda lindaInstance; Registry registry; LindaServer ls; @@ -86,9 +85,8 @@ public class LindaServer extends UnicastRemoteObject implements LindaRemote { return lindaInstance.readAll(template); } - public void eventRegister(Linda.eventMode mode, Linda.eventTiming timing, Tuple template, Callback callback) - throws RemoteException { - lindaInstance.eventRegister(mode, timing, template, callback); + public Tuple waitForTuple(eventMode mode, eventTiming timing, Tuple template) throws RemoteException { + return lindaInstance.waitForTuple(mode, timing, template); } public void debug(String prefix) throws RemoteException { diff --git a/src/main/java/linda/shm/CentralizedLinda.java b/src/main/java/linda/shm/CentralizedLinda.java index bdb8b91..7a0f0f6 100644 --- a/src/main/java/linda/shm/CentralizedLinda.java +++ b/src/main/java/linda/shm/CentralizedLinda.java @@ -233,23 +233,27 @@ public class CentralizedLinda implements Linda { return results; } + public Tuple waitForTuple(eventMode mode, eventTiming timing, Tuple template) { + switch (timing) { + case IMMEDIATE: + return mode == eventMode.READ ? read(template) : take(template); + case FUTURE: + Collection knownTuples = new ArrayList(); + synchronized (tuples) { + for (Tuple t : tuples) { + knownTuples.add((Tuple) t.clone()); + } + } + return future_search(template, knownTuples, mode); + default: + return null; // n'arrive jamais + } + } + public void eventRegister(eventMode mode, eventTiming timing, Tuple template, Callback callback) { new Thread() { public void run() { - switch (timing) { - case IMMEDIATE: - callback.call(mode == eventMode.READ ? read(template) : take(template)); - return; - case FUTURE: - Collection knownTuples = new ArrayList(); - synchronized (tuples) { - for (Tuple t : tuples) { - knownTuples.add((Tuple) t.clone()); - } - } - callback.call(future_search(template, knownTuples, mode)); - return; - } + callback.call(waitForTuple(mode, timing, template)); } }.start(); } diff --git a/src/test/java/linda/test/BasicTestCB.java b/src/test/java/linda/test/BasicTestCB.java index 8bea87e..c126c96 100644 --- a/src/test/java/linda/test/BasicTestCB.java +++ b/src/test/java/linda/test/BasicTestCB.java @@ -1,16 +1,18 @@ package linda.test; +import java.io.Serializable; + import linda.*; import linda.Linda.eventMode; import linda.Linda.eventTiming; -public class BasicTestCB { +public class BasicTestCB implements Serializable { private static Linda linda; private static Tuple cbmotif; - private static class MyCallback implements Callback { + private static class MyCallback implements Callback, Serializable { public void call(Tuple t) { System.out.println("CB got " + t); linda.eventRegister(eventMode.TAKE, eventTiming.IMMEDIATE, cbmotif, this); diff --git a/src/test/java/linda/test/ClientServerTests.java b/src/test/java/linda/test/ClientServerTests.java index 78f698e..0a433dc 100644 --- a/src/test/java/linda/test/ClientServerTests.java +++ b/src/test/java/linda/test/ClientServerTests.java @@ -3,7 +3,6 @@ package linda.test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -import java.net.MalformedURLException; import java.rmi.AccessException; import java.rmi.NotBoundException; import java.rmi.RemoteException; diff --git a/src/test/java/linda/test/REPL.java b/src/test/java/linda/test/REPL.java index 5adb943..2abd2e8 100644 --- a/src/test/java/linda/test/REPL.java +++ b/src/test/java/linda/test/REPL.java @@ -13,6 +13,12 @@ import linda.Tuple; public class REPL implements Callback, Serializable { + public class MyCallback implements Callback { + public void call(Tuple t) { + System.out.println("Tuple de l'event register : " + t); + } + } + public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); @@ -36,6 +42,10 @@ public class REPL implements Callback, Serializable { System.out.println("tt : tryTake tuple"); System.out.println("ra : readAll tuple"); System.out.println("ta : takeAll tuple"); + System.out.println("evRI : eventRegister Read Immediate"); + System.out.println("evRF : eventRegister Read Future"); + System.out.println("evTI : eventRegister Take Immediate"); + System.out.println("evTF : eventRegister Take Future"); System.out.println("\nPour les templates :"); System.out.println("I : int"); System.out.println("S : string"); @@ -100,6 +110,8 @@ public class REPL implements Callback, Serializable { System.out.print(ti + " "); } System.out.println(" pris."); + } else if (args[0].equals("evRI")) { + lc.even } else { System.out.println("Il faut indiquer la commande et un tuple ! Ex : > r 1 S\n"); }