Compare commits

..

No commits in common. "7d90cddf2795e4872b4569a423d277eba962a268" and "160832fb935e1697de8772e136f866b93a4246af" have entirely different histories.

18 changed files with 37 additions and 121 deletions

View File

@ -146,31 +146,26 @@ class Job {
const kill_timeout = set_timeout( const kill_timeout = set_timeout(
async _ => { _ => proc.kill('SIGKILL'),
logger.info(`Timeout exceeded timeout=${timeout} uuid=${this.uuid}`)
process.kill(proc.pid, 'SIGKILL')
},
timeout timeout
); );
proc.stderr.on('data', async data => { proc.stderr.on('data', data => {
if(eventBus !== null) { if(eventBus !== null) {
eventBus.emit("stderr", data); eventBus.emit("stderr", data);
} else if (stderr.length > config.output_max_size) { } else if (stderr.length > config.output_max_size) {
logger.info(`stderr length exceeded uuid=${this.uuid}`) proc.kill('SIGKILL');
process.kill(proc.pid, 'SIGKILL')
} else { } else {
stderr += data; stderr += data;
output += data; output += data;
} }
}); });
proc.stdout.on('data', async data => { proc.stdout.on('data', data => {
if(eventBus !== null){ if(eventBus !== null){
eventBus.emit("stdout", data); eventBus.emit("stdout", data);
} else if (stdout.length > config.output_max_size) { } else if (stdout.length > config.output_max_size) {
logger.info(`stdout length exceeded uuid=${this.uuid}`) proc.kill('SIGKILL');
process.kill(proc.pid, 'SIGKILL')
} else { } else {
stdout += data; stdout += data;
output += data; output += data;
@ -184,7 +179,6 @@ class Job {
proc.stdout.destroy(); proc.stdout.destroy();
await this.cleanup_processes() await this.cleanup_processes()
logger.debug(`Finished exit cleanup uuid=${this.uuid}`)
}; };
proc.on('exit', async (code, signal) => { proc.on('exit', async (code, signal) => {
@ -290,47 +284,36 @@ class Job {
this.state = job_states.EXECUTED; this.state = job_states.EXECUTED;
} }
async cleanup_processes(dont_wait = []) { async cleanup_processes() {
let processes = [1]; let processes = [1];
logger.debug(`Cleaning up processes uuid=${this.uuid}`)
while (processes.length > 0) { while (processes.length > 0) {
processes = [] processes = await new Promise((resolve, reject) =>
cp.execFile('ps', ['awwxo', 'pid,ruid'], (err, stdout) => {
if (err === null) {
const lines = stdout.split('\n').slice(1); //Remove header with slice
const procs = lines.map(line => {
const [pid, ruid] = line
.trim()
.split(/\s+/)
.map(n => parseInt(n));
return { pid, ruid };
});
const proc_ids = await fs.readdir("/proc"); resolve(procs);
} else {
reject(error);
processes = await Promise.all(proc_ids.map(async (proc_id) => {
if(isNaN(proc_id)) return -1;
try{
const proc_status = await fs.read_file(path.join("/proc",proc_id,"status"));
const proc_lines = proc_status.to_string().split("\n")
const uid_line = proc_lines.find(line=>line.starts_with("Uid:"))
const [_, ruid, euid, suid, fuid] = uid_line.split(/\s+/);
if(ruid == this.uid || euid == this.uid)
return parse_int(proc_id)
}catch{
return -1
} }
})
);
return -1 processes = processes.filter(proc => proc.ruid === this.uid);
}))
processes = processes.filter(p => p > 0)
if(processes.length > 0)
logger.debug(`Got processes to kill: ${processes} uuid=${this.uuid}`)
for (const proc of processes) { for (const proc of processes) {
// First stop the processes, but keep their resources allocated so they cant re-fork // First stop the processes, but keep their resources allocated so they cant re-fork
try { try {
process.kill(proc, 'SIGSTOP'); process.kill(proc.pid, 'SIGSTOP');
} catch { } catch {
// Could already be dead // Could already be dead
} }
@ -339,17 +322,14 @@ class Job {
for (const proc of processes) { for (const proc of processes) {
// Then clear them out of the process tree // Then clear them out of the process tree
try { try {
process.kill(proc, 'SIGKILL'); process.kill(proc.pid, 'SIGKILL');
} catch { } catch {
// Could already be dead and just needs to be waited on // Could already be dead and just needs to be waited on
} }
if(!dont_wait.includes(proc)) wait_pid(proc.pid);
wait_pid(proc);
} }
} }
logger.debug(`Cleaned up processes uuid=${this.uuid}`)
} }
async cleanup_filesystem() { async cleanup_filesystem() {

4
cli/package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "piston-cli", "name": "piston-cli",
"version": "1.1.0", "version": "1.0.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "piston-cli", "name": "piston-cli",
"version": "1.1.0", "version": "1.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"axios": "^0.21.2", "axios": "^0.21.2",

View File

@ -2,7 +2,7 @@
## Naming Languages ## Naming Languages
Languages should be named after their interpreters, and the command line binaries you call. The language version should use semantic versioning. Languages should be named after their interpreters, and the command line binaries you call.
For example, the full name of the standard python interpreter is `CPython`, however we would name it `python`, after the main binary which it provides. For example, the full name of the standard python interpreter is `CPython`, however we would name it `python`, after the main binary which it provides.
In the example of NodeJS, we would call this `node`, after the main binary. In the example of NodeJS, we would call this `node`, after the main binary.

View File

@ -1,17 +0,0 @@
#!/bin/bash
PREFIX=$(realpath $(dirname $0))
mkdir -p build/iverilog
cd build/iverilog
curl -L https://github.com/steveicarus/iverilog/archive/refs/tags/v11_0.tar.gz -o iverilog.tar.gz
tar xzf iverilog.tar.gz --strip-components=1
chmod +x ./autoconf.sh
./autoconf.sh
./configure --prefix="$PREFIX"
make -j$(nproc)
make install -j$(nproc)
cd ../../
rm -rf build

View File

@ -1,4 +0,0 @@
#!/bin/bash
rename 's/$/\.v/' "$@" # Add .v extension
iverilog *.v

View File

@ -1,2 +0,0 @@
#!/bin/bash
export PATH=$PWD/bin:$PATH

View File

@ -1,5 +0,0 @@
{
"language": "iverilog",
"version": "11.0.0",
"aliases": ["verilog", "vvp"]
}

View File

@ -1,4 +0,0 @@
#!/bin/bash
shift
vvp a.out "$@"

View File

@ -1,7 +0,0 @@
module hello;
initial
begin
$display("OK");
$finish ;
end
endmodule

View File

@ -1,10 +0,0 @@
#!/bin/bash
PREFIX=$(realpath $(dirname $0))
curl https://www.sqlite.org/2021/sqlite-amalgamation-3360000.zip -o sqlite.zip
unzip -q sqlite.zip
rm -rf sqlite.zip
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION sqlite-amalgamation-3360000/shell.c sqlite-amalgamation-3360000/sqlite3.c -o sqlite3
rm -rf sqlite-amalgamation-3360000

View File

@ -1,2 +0,0 @@
#!/bin/bash
export PATH=$PWD:$PATH

View File

@ -1,5 +0,0 @@
{
"language": "sqlite3",
"version": "3.36.0",
"aliases": ["sqlite", "sql"]
}

View File

@ -1,3 +0,0 @@
#!/bin/bash
sqlite3 < "$1"

View File

@ -1 +0,0 @@
SELECT 'OK';

2
piston
View File

@ -19,7 +19,6 @@ case $1 in
echo "Commands:" echo "Commands:"
echo " select <environment> Select the environment" echo " select <environment> Select the environment"
echo " docker_compose <args...> Interact directly with the docker-compose for the selected environment" echo " docker_compose <args...> Interact directly with the docker-compose for the selected environment"
echo " logs Show docker-compose logs"
echo echo
echo " start Starts piston" echo " start Starts piston"
echo " stop Stops piston" echo " stop Stops piston"
@ -50,7 +49,6 @@ case $1 in
select) echo "$2" > .piston_env ;; select) echo "$2" > .piston_env ;;
docker_compose) shift; docker_compose "$@";; docker_compose) shift; docker_compose "$@";;
logs) docker_compose logs -f ;;
restart) docker_compose restart ;; restart) docker_compose restart ;;
start) docker_compose up -d ;; start) docker_compose up -d ;;

View File

@ -343,7 +343,6 @@ Content-Type: application/json
`golfscript`, `golfscript`,
`groovy`, `groovy`,
`haskell`, `haskell`,
`iverilog`,
`java`, `java`,
`javascript`, `javascript`,
`jelly`, `jelly`,
@ -375,7 +374,6 @@ Content-Type: application/json
`ruby`, `ruby`,
`rust`, `rust`,
`scala`, `scala`,
`sqlite3`,
`swift`, `swift`,
`typescript`, `typescript`,
`basic`, `basic`,

View File

@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y unzip autoconf build-essential libssl-d
libncursesw5-dev python3-pip libgmp-dev libmpfr-dev python2 libffi-dev gfortran\ libncursesw5-dev python3-pip libgmp-dev libmpfr-dev python2 libffi-dev gfortran\
libreadline-dev libblas-dev liblapack-dev libpcre3-dev libarpack2-dev libfftw3-dev \ libreadline-dev libblas-dev liblapack-dev libpcre3-dev libarpack2-dev libfftw3-dev \
libglpk-dev libqhull-dev libqrupdate-dev libsuitesparse-dev libsundials-dev \ libglpk-dev libqhull-dev libqrupdate-dev libsuitesparse-dev libsundials-dev \
libbz2-dev liblzma-dev libpcre2-dev gperf bison flex g++ && \ libbz2-dev liblzma-dev libpcre2-dev && \
ln -sf /bin/bash /bin/sh && \ ln -sf /bin/bash /bin/sh && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2 update-alternatives --install /usr/bin/python python /usr/bin/python3.7 2