package org.jerlang.erts.erlang;
import static org.jerlang.type.Boolean.am_true;
import org.jerlang.Port;
import org.jerlang.ProcessRegistry;
import org.jerlang.ProcessState;
import org.jerlang.type.Atom;
import org.jerlang.type.List;
import org.jerlang.type.PortID;
import org.jerlang.type.Term;
public class ErlangPortClose {
private ErlangPortClose() {
}
public static Term dispatch(List params) {
switch (params.length()) {
case 1:
return port_close_1(params.head());
default:
throw Error.badarg;
}
}
/**
* Closes an open port.
* Roughly the same as Port ! {self(), close} except for the error
* behaviour (see below), being synchronous, and that the port does
* not reply with {Port, closed}.
*
* http://erlang.org/doc/man/erlang.html#port_close-1
*/
public static Atom port_close_1(Term port) {
if (port instanceof PortID) {
Port p = (Port) ProcessRegistry.resolve(port.toPortID());
p.setState(ProcessState.EXITING);
return am_true;
} else {
throw Error.badarg;
}
}
}