• Non ci sono risultati.

A.2 Il Server di SIRENE

A.2.5 Sviluppo di J-Manager

J-Manager usa tre attributi per la classe “TForm”2 che implementa la fine-

stra di visualizzazione dell’applicazione ed una variabile globale per la gestione di alcuni dati. I primi due attributi della classe TForm sono istanze del client del server (il primo di tipo TidTCPClient e nominato “tcp”, e il secondo di ti- po TidTCPServer e chiamato “serv ” di J-Manager e permettono la comunica- zione con J-Communicator. Il terzo attributo `e un’istanza del processo, di ti- po “TProcessUTF8 ” e chiamato “processo”, che permette di eseguire e gestire

i processi. La variabile globale `e un’istanza di “TCriticalSection”, una classe che implementa le sezioni critiche per evitare problemi di Deadlock e di sincro- nizzazione di eventi quando si usano risorse, gestite all’interno di questa sezione critica, da parte di Thread concorrenti. Vi sono sei funzioni globali dichiarate ed implementate Ricevi Output, Richiedi Input, Gestisci Fine Processo, Crea Gestore Output, Crea Gestore Input,

Crea Gestore Terminazione.

La funzione Ricevi Output `e una funzione che gestisce il segnale di tipo SigU- ser1, equivalente al valore numerico 10, e gestisce la ricezione di questo segnale da parte del processo figlio (il programma che J-Manager esegue). Questa funzione viene attivata quando il processo figlio ha scritto nella pipe dello standard output alcuni dati. In questa funzione, inizialmente, si controlla che il processo figlio sia in pausa, se non lo `e si aspetta che esso entri in stato di pausa, quindi preleva il flusso dei dati dallo standard output del programma in esecuzione e lo invia, attraverso il tcp, al server di comunicazione di J-Communicator. Fatto questo, la funzione risveglia il processo figlio per permettergli di continuare la sua esecuzione.

La funzione Richiedi Input `e una funzione che gestisce il segnale di tipo SigU- ser2, equivalente al valore numerico 12, e gestisce la ricezione di questo segnale da parte del processo figlio. Questa funzione viene attivata quando il processo figlio chiede di ricevere un input da parte dei Client Device, in questo caso J-Manager, controlla sempre se il processo figlio `e in pausa, altrimenti attende che esso sia in pausa e, quindi, invia un messaggio a J-Communicator, tramite il suo oggetto tcp, per indicargli di avvertire i Client Device che il programma `e in attesa di input. La funzione Gestisci Fine Processo `e una funzione che gestisce il segnale di terminazione del programma, in questo caso, la terminzione del processo figlio. Questa funzione avviene quando il programma termina. Generalmente, il pro- gramma viene terminato direttamente da J-Manager, in quanto, attraverso l’uso dell’oggetto processo, il processo viene gestito interamente durante il suo ciclo di vita. Tuttavia, pu`o capitare che per qualche motivo, il sistema operativo decide di terminare il programma, in questo caso, quest’ultimo invia un segnale a J-Manager che lo intercetta ed invia un messaggio a J-Communicator per avvertire i Client Device che il programma `e stato terminato.

La funzione Crea Gestore Output `e una funzione che imposta la funzione Ri- cevi Output come unico gestore del segnale SigUser1, ovvero ogni segnale con valore numerico 10 viene intercettato da J-Manager e gestito da questa funzione. La funzione Crea Gestore Input `e una funzione che imposta la funzione Ri- chiedi Input come unico gestore del segnale SigUser2, ovvero ogni segnale con valore numerico 12 viene intercettato da J-Manager e gestito da questa funzione. La funzione Crea Gestore Terminazione `e una funzione che imposta la funzio- ne Richiedi Input come unico gestore del segnale di terminazione, ovvero ogni

segnale di terminazione viene intercettato da J-Manager e gestito da questa fun- zione.

La finestra dell’applicazione di J-Manager implementa un insieme di procedure e funzioni per la gestione del Server di J-Manager e la corretta gestione dei messaggi inviati a questo server. Le procedure sono: ServerExecute, preleva, Form Create. Mentre le funzioni sono: Avvia Programma e Invia Input.

La procedura ServerExecute viene eseguita quando il Server di J-Manager ri- ceve un flusso di dati dal client di comunicazione di J-Communicator. In questa funzione, inizialmente si entra all’interno della sezione critica, affinch´e non sia pos- sibile per ulteriori thread in esecuzione accedere alla porzione di codice ed alle sue risorse contemporaneamente, e quindi si invoca la funzione preleva’. Alla fine si esce dalla sezione critica per permettere ad un eventuale altro thread di poter continuare la sua esecuzione.

La procedura preleva viene eseguita quando il server di J-Manager deve leggere i dati che il client di comunicazione di J-Communicator ha inviato. Questi dati sono stringhe in formato JSON. Questo messaggio ha il seguente formato

{

Comando: valore, Parametro: valore };

Il parametro Comando pu`o assumere quattro valori: “avvia”, “Inviato Input ”, “continua”, “Termina Programma”.

Se il comando `e avvia allora il campo Parametro `e chiamato “nome program- ma completo” ed il suo valore sar`a il nome del file compilato da J-Communicator. Quindi, J-Manager chiama la funzione Avvia Programma passandogli come pa- rametro il valore di nome programma completo ed avvia il processo (messo in stato di pausa immediatamente dalla funzione Avvia Programma.

Se il comando `e Inviato Input, allora il campo Parametro `e chiamato “input ” ed il suo valore sar`a il testo che i Client Device inviano a J-Communicator quando un programma chiede di ricevere un input. In questo caso, viene eseguita la funzione Invia Input passandogli come parametro il valore di input ed infine J-Manager risveglia il processo che, in attesa di input, si era messo in stato di sonno.

Se il comando `e continua allora significa che J-Communicator ha eseguito un invio dell’output di un programma e quindi, dopo aver inviato a tutti i Client Device il testo dell’output del programma, comunica a J-Manager di risvegliare il processo dormiente. In questo caso il messaggio non contiene il campo Parametro.

Se il comando `e Termina Programma allora significa che J-Communicator ha rice- vuto l’ordine, da un Client Device, di terminare il processo. Questo pu`o avvenire

quando un Client Device vuole interrompere l’esecuzione del programma per qua- lunque motivazione oppure perch´e il programma `e terminato ma `e posto in uno stato definito “zombie”, ovvero il processo ha completato interamente la sua esecu- zione e si pone in stato di attesa prima di essere concluso definitivamente. Quindi, J-Manager termina il processo. Anche in questo caso il messaggio non contiene il campo Parametro.

Infine, la procedura FormCreate viene chiamata quando J-Manager viene ese- guito per la prima volta, quindi, J-Manager crea la sezione critica e la rende utilizzabile e setta i gestori dei segnali per gestire correttamente i segnali inviati dai processi figli.