System Call Thread
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.
   [LancOS Home] [AMPEOS 
    Index] [Indice codice] [Fasi 
    1 & 2] [Fase 3]