package org.erlide.jinterface.rpc; import org.erlide.common.util.ErlLogger; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangExit; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangPid; import com.ericsson.otp.erlang.OtpMbox; public final class RpcEventProcessor implements Runnable { private static final int TIMEOUT = 10000; private final IRpcEventHandler handler; private final OtpMbox mbox; private volatile boolean terminated = true; private OtpErlangPid starter; public RpcEventProcessor(final IRpcEventHandler h, final OtpMbox mbox) { handler = h; this.mbox = mbox; } @Override public void run() { terminated = false; mbox.send(starter, new OtpErlangAtom("start")); while (!terminated) { OtpErlangObject msg; try { msg = mbox.receive(TIMEOUT); if (msg != null) { terminated = handler.handleEvent(msg); } } catch (final OtpErlangExit e) { terminated = true; } catch (final Exception e) { ErlLogger.getInstance().warn( "RpcEventProcessor %s got exception:", mbox.self()); ErlLogger.getInstance().warn(e); } } } public void start() { if (!terminated) { return; } final Thread t = new Thread(this); t.setPriority(3); // low t.setDaemon(true); t.start(); } public void stop() { terminated = true; } public OtpErlangPid getPid() { return mbox.self(); } public void setStarter(final OtpErlangPid starter) { this.starter = starter; } }