// this function used internally when "process" dies // since Erlang discerns between exit and exit/2. private void exit(int arity, Erlang.Pid to, System.String reason) { try { System.String node = to.node(); if (node.Equals(home.node())) { home.deliver(new OtpMsg(OtpMsg.exitTag, _self, to, reason)); } else { OtpCookedConnection conn = home.getConnection(node); if (conn == null) return ; switch (arity) { case 1: conn.exit(_self, to, reason); break; case 2: conn.exit2(_self, to, reason); break; } } } catch (System.Exception) { } }
/* * Send a message to a remote {@link Pid pid}, representing * either another {@link OtpMbox mailbox} or an Erlang process. * * @param to the {@link Pid pid} identifying the intended * recipient of the message. * * @param msg the body of the message to send. * **/ public virtual void send(Erlang.Pid to, Erlang.Object msg) { try { System.String node = to.node(); if (node.Equals(home.node())) { home.deliver(new OtpMsg(to, (Erlang.Object) (msg.clone()))); } else { OtpCookedConnection conn = home.getConnection(node); if (conn == null) return ; conn.send(_self, to, msg); } } catch (System.Exception) { } }
/* * <p> Remove a link to a remote mailbox or Erlang process. This * method removes a link created with {@link #link link()}. * Links are idempotent; calling this method once will remove all * links between this mailbox and the remote {@link Pid * pid}. </p> * * @param to the {@link Pid pid} representing the object to * unlink from. * **/ public virtual void unlink(Erlang.Pid to) { links.removeLink(_self, to); try { System.String node = to.node(); if (node.Equals(home.node())) { home.deliver(new OtpMsg(OtpMsg.unlinkTag, _self, to)); } else { OtpCookedConnection conn = home.getConnection(node); if (conn != null) conn.unlink(_self, to); } } catch (System.Exception) { } }
/* * <p> Link to a remote mailbox or Erlang process. Links are * idempotent, calling this method multiple times will not result in * more than one link being created. </p> * * <p> If the remote process subsequently exits or the mailbox is * closed, a subsequent attempt to retrieve a message through this * mailbox will cause an {@link Exit Exit} * exception to be raised. Similarly, if the sending mailbox is * closed, the linked mailbox or process will receive an exit * signal. </p> * * <p> If the remote process cannot be reached in order to set the * link, the exception is raised immediately. </p> * * @param to the {@link Pid pid} representing the object to * link to. * * @exception Exit if the {@link Pid pid} referred * to does not exist or could not be reached. * **/ public virtual void link(Erlang.Pid to) { try { System.String node = to.node(); if (node.Equals(home.node())) { if (!home.deliver(new OtpMsg(OtpMsg.linkTag, _self, to))) { throw new Erlang.Exit("noproc", to); } } else { OtpCookedConnection conn = home.getConnection(node); if (conn != null) conn.link(_self, to); else throw new Erlang.Exit("noproc", to); } } catch (Erlang.Exit e) { throw e; } catch (System.Exception) { } links.addLink(_self, to); }