Questo thread intercetta le trap di tipo "System Call" e fornisce i servizi
implementati a livello di supporto, cioe' le Send, Receive, Reply e Receive&Reply
virtuali.
I messaggi ricevuti dalla system trap handler possono essere assumere diversi
formati:
(A) Invocazione di servizio (msg inviato dalla passup):
m_sender: caller
m_message: state_t *
(B) VSend da un altro T-process:
m_sender: gestore del thread che fa la VSend
m_message: vmsg_t *
(C) VReply da un altro T-process:
m_sender: gestore del thread che fa la VReply
m_message: vmsg_t *
Il gestore mantiene tre code (di tipo vqueue_t):
wait_recv: coda dei thread che hanno fatto una VSend e sono in attesa di
una VRecv)
wait_reply: coda dei thread che hanno fatto una VSend e sono in attesa di
una VReply)
wait_send: coda dei thread che hanno fatto una VRecv e sono in attesa di
una VSend).
Ora analizziamo uno ad uno tutti i casi partendo dallo scambio di messaggi virtuali
all'interno dello stesso T-process.
Il gestore riceve un messaggio di tipo (A) che richiede una VSend.
Guarda nella coda wait_send se vi e` il thread destinatario della VSend; se e`
presente lo estrae dalla coda, copia il messaggio, e lo risveglia (facendo una
msgSend), infine mette il chiamante nella coda wait_reply; se invece non e`
presente mette il thread chiamante nella coda wait_recv.
Il gestore riceve un messaggio di tipo (A) che richiede una VRecv.
Guarda nella coda wait_recv se vi e` almeno un thread se e` stata richiesta una
VRecvALL, altrimenti se vi e` il thread indicato in R4. Nel caso vi fosse lo estrae
dalla coda, copia il messaggio, lo inserisce nella coda wait_reply e risveglia il
thread chiamante; in caso contrario mette il thread chiamante nella coda
wait_send.
Il gestore riceve un messaggio di tipo (A) che richiede una VReply.
Guarda nella coda wait_reply se vi e` il thread indicato in R4; se e` presente lo
estrae dalla coda e lo risveglia, inoltre risveglia anche il chiamante.
Il gestore riceve un messaggio di tipo (A) che richiede una VSend e si accorge che
il thread destinatario e` "esterno" (cioe' fa parte di un altro T-Process).
Invia un messaggio al gestore del thread destinatario con il seguente
formato:
v_msgtype: SENDTAG
v_msgfrom: thread chiamante
v_msgto: thread destinarario
v_msglength: lunghezza del Vmessaggio
v_msgbuffer: vi viene copiato il Vmessaggio da mandare
Il gestore riceve un messaggio di tipo (A) che richiede una VReply.
Guarda nella coda wait_reply se vi e` il thread indicato in R4; se e` presente ed
e` un thread "esterno" lo estrae dalla coda e spedisce al suo gestore un messaggio
dal seguente formato:
v_msgtype: REPLYTAG
v_msgfrom: thread chiamante
v_msgto: thread destinarario
v_msglength: non utilizzato
v_msgbuffer: non utilizzato
Infine risveglia il chiamante.
Il gestore riceve un messaggio di tipo (B) che richiede una VSend.
Guarda nella coda wait_send se vi e` il thread destinatario (indicato in
v_msgdsest) della VSend; se e` presente lo estrae dalla coda, copia il messaggio
(dal v_msgbuffer), e lo risveglia (facendo una msgSend), infine mette il mittente
nella coda wait_reply; se invece non e` presente mette il thread mittente nella
coda wait_recv.
Il gestore riceve un messaggio di tipo (C) che richiede una VReply.
Risveglia il thread destinatario della reply (indicato in v_msgto) facendogli una
msgSend.