/**
* This file is part of Erjang - A JVM-based Erlang VM
*
* Copyright (c) 2009 by Trifork
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
package erjang;
import erjang.m.erlang.DistEntry;
import kilim.Pausable;
/**
* This is a PID on this node
*/
public class EInternalPID extends EPID implements ELocalHandle {
private EProc task;
private int id;
private DistEntry distEntry;
// used by JNIF to hold a unique GlobalRef to this object
// TODO: figure out a way to garbage collect such global refs.
private long gref;
public EInternalPID testInternalPID() {
return this;
}
@Override
protected int id() {
return id & 0x7fff;
}
@Override
protected int serial() {
return id >>> 15;
}
@Override
public EAtom node() {
return ERT.getLocalNode().node;
}
@Override
protected int creation() {
return ERT.getLocalNode().creation;
}
public EInternalPID(EProc self) {
super(ERT.getLocalNode());
this.task = self;
this.id = task.id;
}
/* (non-Javadoc)
* @see erjang.EPID#is_alive()
*/
@Override
public boolean is_alive_dirtyread() {
EProc task = this.task; // Take local copy
return task != null && task.is_alive_dirtyread();
}
public ELocalHandle testLocalHandle() {
return this;
}
/* (non-Javadoc)
* @see erjang.EHandle#self()
*/
@Override
public
EProc task() {
return task;
}
/* (non-Javadoc)
* @see erjang.EHandle#link_oneway(erjang.EHandle)
*/
@Override
public boolean link_oneway(EHandle other) throws Pausable {
EProc task = this.task;
if (task != null)
return task.link_oneway(other);
return false;
}
@Override
public void unlink_oneway(EHandle other) throws Pausable {
EProc task = this.task;
if (task != null)
task.unlink_oneway(other);
}
public synchronized boolean add_monitor(EHandle observer, ERef ref) throws Pausable {
EProc task = this.task;
if (task != null)
return task.add_monitor(observer, ref);
else
return false;
}
@Override
public void send_monitor_exit(EHandle from, ERef ref, EObject reason) throws Pausable {
EProc task = this.task;
if (task != null) {
task.send_monitor_exit(from, ref, reason);
}
}
@Override
public void remove_monitor(EHandle sender, ERef r, boolean flush) throws Pausable {
EProc task = this.task;
if (task != null)
task.remove_monitor(r, flush);
}
/* (non-Javadoc)
* @see erjang.EPID#set_group_leader(erjang.EPID)
*/
@Override
public void set_group_leader(EPID group_leader) {
EProc task = this.task;
if (task != null)
task.set_group_leader(group_leader);
}
/**
* @return
*/
public int internal_pid_number() {
return id;
}
/*
@Override
public String toString() {
return "<" + (name==null?"":name) + ":" + id + ">";
}
*/
@Override
public EObject process_info() {
EProc task = this.task;
if (task == null) return ERT.am_undefined;
return task.process_info();
}
@Override
public EObject process_info(EObject spec) {
EProc task = this.task;
if (task == null) return ERT.am_undefined;
return task.process_info(spec);
}
@Override
public boolean equalsExactly(EObject rhs) {
return rhs==this;
}
@Override
public int hashCode() {
return System.identityHashCode(this);
}
/**
* @param eTimerTask
*/
public boolean add_exit_hook(ExitHook hook) {
EProc task = this.task;
return (task != null) && task.add_exit_hook(hook);
}
/**
* @param eTimerTask
*/
public boolean remove_exit_hook(ExitHook hook) {
EProc task = this.task;
return (task != null) && task.remove_exit_hook(hook);
}
/**
*
*/
public void done() {
this.task = null;
}
public void set_dist_entry(DistEntry distEntry) {
this.distEntry = distEntry;
}
}