2015-06-01 11 views
8

Ho una transazione che non funziona a tempo indeterminato per qualche motivo, e mi piacerebbe utilizzare le istruzioni di tracciamento all'interno. Ad esempio, per stampare lo stato della MVAR della prima di eseguire l'operazione in questo frammento:È sicuro utilizzare la traccia all'interno di una stransazione STM?

data_out <- atomically $ do 
     rtg_state <- takeTMVar ready_to_go 
     JobDescr hashid url <- T.readTBChan next_job_descr 
     case rtg_state of 
      Ready_RTG n -> do 
       putTMVar ready_to_go $ Processing_RTG n 
       putTMVar start_harvester_browser hashid 
       putTMVar next_test_url_to_check_chan hashid 
       putTMVar next_harvest_url hashid 
       return (n,hashid,url) 
      _ -> retry 

Would che rendono il segfault programma o miss-si comportano?

risposta

9

Finché si utilizza trace solo a scopo di debug, si dovrebbe essere OK. Come regola generale, basti pensare che nella versione finale del tuo programma non ci saranno trace s in giro.

Non si osserveranno mai i segfaults da trace. La sua "non sicurezza" deriva dall'iniezione di effetti osservabili nel codice puro. Ad esempio, in STM, quando una transazione viene ripetuta, si presume che i suoi effetti vengano annullati. Se è stato utilizzato trace per inviare un messaggio all'utente, non è possibile ripristinarlo. Se l'uscita di trace innesca il lancio di un missile, dovrai affrontare gli effetti collaterali internazionali. Se invece lo trace segnala allo sviluppatore "FYI, il codice sta eseguendo X", questo non fa parte della logica di base del programma, ed è perfettamente a posto.

+0

Il codice di lancio del missile sarà quindi conservato nella monade IO. Grazie! – dsign

+4

Trovo opportuno sottolineare che non si tratta di un lancio di un singolo missile che dà seri effetti collaterali internazionali in questo caso: sono le 735 raffiche nucleari quando la transazione è stata ripetuta un paio di volte a cui bisogna stare attenti. ;) – kqr