2015-06-01 17 views
8

Mam transakcji niepowodzeniem na czas nieokreślony z jakiegoś powodu, a ja chciałbym użyć instrukcji śledzenia wewnątrz. Na przykład, aby wydrukować stan MVar użytkownika przed wykonaniem transakcji w tym fragmencie:Czy bezpiecznie jest używać śledzenia wewnątrz transakcji 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 

Czy to sprawi, że segfault program lub miss-zachowywać?

Odpowiedz

9

Dopóki używasz trace do celów debugowania, powinieneś być w porządku. Zasadą jest, po prostu, założyć, że w ostatecznej wersji gotowego programu nie będzie już żadnych.

Nigdy nie będziesz obserwować segmentów od trace. Jego "brak bezpieczeństwa" wynika z tego, że wstrzykuje widoczne efekty w czystym kodzie. Np. W STM, gdy ponowna próba transakcji, jej skutki są wycofywane. Jeśli użyto trace do wysłania wiadomości do użytkownika, nie można go wycofać. Jeśli wyjście trace uruchamia wystrzelenie pocisku, będziesz musiał radzić sobie z międzynarodowymi efektami ubocznymi. Jeśli trace zamiast tego po prostu sygnalizuje programistom "FYI, kod robi X", to nie jest częścią głównej logiki programu i jest idealnie w porządku.

+0

Kod antyrakietowy będzie przechowywany w monadzie IO. Dzięki! – dsign

+4

Uważam, że warto podkreślić, że nie jest to jednorazowy wystrzał rakiet, który daje poważne międzynarodowe skutki uboczne w tym przypadku - to 735 salw jądrowych, gdy transakcja została ponowiona kilka razy trzeba uważać. ;) – kqr