From 84adefa331c4159d432d22840663c38f155cd4c1 Mon Sep 17 00:00:00 2001 From: Erlang/OTP Date: Fri, 20 Nov 2009 14:54:40 +0000 Subject: The R13B03 release. --- .../com/ericsson/otp/erlang/OtpLocalNode.java | 161 +++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java (limited to 'lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java') diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java new file mode 100644 index 0000000000..fbd0eb4073 --- /dev/null +++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java @@ -0,0 +1,161 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 2000-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ +package com.ericsson.otp.erlang; + +/** + * This class represents local node types. It is used to group the node types + * {@link OtpNode OtpNode} and {@link OtpSelf OtpSelf}. + */ +public class OtpLocalNode extends AbstractNode { + private int serial = 0; + private int pidCount = 1; + private int portCount = 1; + private int refId[]; + + protected int port; + protected java.net.Socket epmd; + + protected OtpLocalNode() { + super(); + init(); + } + + /** + * Create a node with the given name and the default cookie. + */ + protected OtpLocalNode(final String node) { + super(node); + init(); + } + + /** + * Create a node with the given name and cookie. + */ + protected OtpLocalNode(final String node, final String cookie) { + super(node, cookie); + init(); + } + + private void init() { + serial = 0; + pidCount = 1; + portCount = 1; + refId = new int[3]; + refId[0] = 1; + refId[1] = 0; + refId[2] = 0; + } + + /** + * Get the port number used by this node. + * + * @return the port number this server node is accepting connections on. + */ + public int port() { + return port; + } + + /** + * Set the Epmd socket after publishing this nodes listen port to Epmd. + * + * @param s + * The socket connecting this node to Epmd. + */ + protected void setEpmd(final java.net.Socket s) { + epmd = s; + } + + /** + * Get the Epmd socket. + * + * @return The socket connecting this node to Epmd. + */ + protected java.net.Socket getEpmd() { + return epmd; + } + + /** + * Create an Erlang {@link OtpErlangPid pid}. Erlang pids are based upon + * some node specific information; this method creates a pid using the + * information in this node. Each call to this method produces a unique pid. + * + * @return an Erlang pid. + */ + public synchronized OtpErlangPid createPid() { + final OtpErlangPid p = new OtpErlangPid(node, pidCount, serial, + creation); + + pidCount++; + if (pidCount > 0x7fff) { + pidCount = 0; + + serial++; + if (serial > 0x1fff) { /* 13 bits */ + serial = 0; + } + } + + return p; + } + + /** + * Create an Erlang {@link OtpErlangPort port}. Erlang ports are based upon + * some node specific information; this method creates a port using the + * information in this node. Each call to this method produces a unique + * port. It may not be meaningful to create a port in a non-Erlang + * environment, but this method is provided for completeness. + * + * @return an Erlang port. + */ + public synchronized OtpErlangPort createPort() { + final OtpErlangPort p = new OtpErlangPort(node, portCount, creation); + + portCount++; + if (portCount > 0xfffffff) { /* 28 bits */ + portCount = 0; + } + + return p; + } + + /** + * Create an Erlang {@link OtpErlangRef reference}. Erlang references are + * based upon some node specific information; this method creates a + * reference using the information in this node. Each call to this method + * produces a unique reference. + * + * @return an Erlang reference. + */ + public synchronized OtpErlangRef createRef() { + final OtpErlangRef r = new OtpErlangRef(node, refId, creation); + + // increment ref ids (3 ints: 18 + 32 + 32 bits) + refId[0]++; + if (refId[0] > 0x3ffff) { + refId[0] = 0; + + refId[1]++; + if (refId[1] == 0) { + refId[2]++; + } + } + + return r; + } +} -- cgit v1.2.3