2015-06-01 7 views
8

Ich habe eine Transaktion auf unbestimmte Zeit aus irgendeinem Grund fehlschlagen, und ich würde gerne Trace-Anweisungen im Inneren verwenden. Zum Beispiel, um den Zustand des MVar des zu drucken, bevor die Transaktion in diesem Fragmente Ausführung:Ist es sicher, Trace in einer STM-Transaktion zu verwenden?

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 

Würde, die das Programm segfault oder miss-Verhalten machen?

Antwort

9

Solange Sie trace nur für Debug-Zwecke verwenden, sollten Sie in Ordnung sein. Nehmen Sie in der Regel an, dass in der finalen produktionsfertigen Version Ihres Programms kein trace s vorhanden ist.

Sie werden nie segfaults von trace beobachten. Ihre "Unsicherheit" resultiert daraus, dass sie in reinem Code beobachtbare Effekte injiziert. Wenn zum Beispiel in einer STM eine Transaktion wiederholt wird, wird angenommen, dass ihre Auswirkungen rückgängig gemacht werden. Wenn trace verwendet wurde, um eine Nachricht an den Benutzer zu senden, können Sie das nicht zurückrollen. Wenn die Ausgabe von trace einen Raketenstart auslöst, müssen Sie mit internationalen Nebenwirkungen umgehen. Wenn trace stattdessen nur den Entwickler mit "FYI, der Code tut X" signalisiert, ist dies nicht Teil der Kernlogik des Programms, und ist völlig in Ordnung.

+0

Der Raketenstartcode wird dann in der IO-Monade beibehalten. Vielen Dank! – dsign

+4

Ich finde es wert, darauf hinzuweisen, dass es kein einziger Raketenstart ist, der in diesem Fall ernsthafte internationale Nebenwirkungen verursacht - es sind die 735 nuklearen Salven, als die Transaktion einige Male wiederholt wurde, auf die man achten muss. ;) – kqr