From 3b1c19a090c9ce442fc62b0efc5048d11f41964e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Tue, 11 Feb 2020 17:34:55 +0100
Subject: [PATCH] [Ivette/server] use per-process socket io

---
 Ivette/src/dome/src/misc/system.js |  7 +++++++
 Ivette/src/frama-c/server.js       | 31 +++++++++++++++++++-----------
 2 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/Ivette/src/dome/src/misc/system.js b/Ivette/src/dome/src/misc/system.js
index 51ffe3de75b..0e609adc0f9 100644
--- a/Ivette/src/dome/src/misc/system.js
+++ b/Ivette/src/dome/src/misc/system.js
@@ -143,6 +143,12 @@ export function getDownloads() { return appProxy.getPath('downloads'); }
 */
 export function getWorkingDir() { return command_wdir; }
 
+/**
+   @summary Returns the current process ID.
+   @return {number} `process.pid`
+ */
+export function getPID() { return process.pid; }
+
 /**
    @summary Command-line arguments (Application Window).
    @return {Array.<string>} command-line arguments
@@ -639,6 +645,7 @@ export default {
   getWorkingDir,
   getArguments,
   getStatic,
+  getPID,
   join, resolve, dirname, basename, extname,
   fileStat,
   isFile, readFile, writeFile, copyFile,
diff --git a/Ivette/src/frama-c/server.js b/Ivette/src/frama-c/server.js
index 14a4bd11816..37cd6bf32d8 100644
--- a/Ivette/src/frama-c/server.js
+++ b/Ivette/src/frama-c/server.js
@@ -279,7 +279,7 @@ export function clear() {
    @param {string} [config.cwd] - Working directory (default: current)
    @param {string} [config.command] - Server command (default: `frama-c`)
    @param {Array.<string>} [config.params] - Additional server arguments (default: empty)
-   @param {string} [config.sockaddr] - Server socket (default: `ipc:///.frama-c.socket.io`)
+   @param {string} [config.sockaddr] - Server socket (default: `ipc:///.frama-c.<pid>.io`)
    @param {number} [config.timeout] - Shutdown timeout before server is hard killed, in milliseconds (default: 300ms)
    @param {number} [config.polling] - Server polling period, in milliseconds (default: 50ms)
    @param {string} [config.logout] - Process stdout log file (default: `undefined`)
@@ -298,8 +298,26 @@ async function _launch() {
   _reset();
   if (!config) throw('Frama-C Server not configured');
   let { env, cwd, command='frama-c', params=[], sockaddr, logout, logerr } = config;
+
+  buffer.clear();
+  buffer.append('$',command);
+  params.forEach((argv) => {
+    if (argv.startsWith('-') || argv.endsWith('.c') || argv.endsWith('.i') || argv.endsWith('.h'))
+      buffer.append('\n    ');
+    buffer.append(' ');
+    buffer.append(argv);
+  });
+  buffer.append('\n');
+
   if (!cwd) cwd = System.getWorkingDir();
-  if (!sockaddr) sockaddr = 'ipc://' + System.join( cwd , '.frama-c.socket.io' );
+  if (!sockaddr) {
+    let socketfile = System.join(cwd,'.frama-c.' + System.getPID() + '.io');
+    System.atExit(() => {
+      System.remove(socketfile);
+      console.log('REMOVE',socketfile);
+    });
+    sockaddr = 'ipc://' + socketfile ;
+  }
   logout = logout && System.join( cwd, logout );
   logerr = logerr && System.join( cwd, logerr );
   params = params.concat('-then','-server-zmq',sockaddr );
@@ -312,15 +330,6 @@ async function _launch() {
   // Launch Process
   const process = await System.spawn( command, params, options );
   const kill = () => process.kill() ;
-  buffer.clear();
-  buffer.append('$',command);
-  params.forEach((argv) => {
-    if (argv.startsWith('-') || argv.endsWith('.c') || argv.endsWith('.i') || argv.endsWith('.h'))
-      buffer.append('\n    ');
-    buffer.append(' ');
-    buffer.append(argv);
-  });
-  buffer.append('\n');
   const logger = (text) => {
     buffer.append(text);
     if (0 <= text.indexOf('\n'))
-- 
GitLab