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]