1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)typeui=Design.main_window_extension_pointsletthread_hook=ref[]letregister_thread_hookhook=thread_hook:=hook::!thread_hook(* Restore the value analysis results for the thread [th]. *)letselect_thread(ui:ui)(th:Mt_thread.thread_state)=ui#protect~cancelable:false(fun()->matchth.th_projectswith|[]->()|p::_->Project.set_currentp);(* Reset in particular the list of called functions *)ui#reset()(* Gtk menu-item which displays a thread *)letmake_thread_menu_entry(ui:ui)(menu:GMenu.menu)(th:Mt_thread.thread_state)=letth_item=GMenu.menu_item~packing:menu#append()inletcallback()=select_threaduith;List.iter(funhook->hookuith)!thread_hook;inignore(th_item#connect#activate~callback);letbox=GPack.hbox~packing:th_item#add()inlettext=Thread.labelth.th_eva_threadinignore(GMisc.label~text~packing:box#pack());th_item(* Create the menu entries for Mthread. *)letpopulate_menu=letmenu_items=ref[]infun(ui:ui)(menu:GMenu.menu)analysis->letthreads=Mt_thread.threadsanalysisinletthreads=List.filterMt_thread.should_compute_threadthreadsinList.iter(funr->menu#remove(r:>GMenu.menu_item))!menu_items;menu_items:=List.map(make_thread_menu_entryuimenu)threads(** Register this dialog in main window menu bar *)let()=Design.register_extension(funui->letmenu_manager=ui#menu_manager()inletitem,menu=menu_manager#add_menu"M_thread"initem#misc#hide();lethookanalysis=item#misc#show();populate_menuuimenuanalysisinMt_main.register_analysis_hookhook;Mt_main.apply_analysis_hooks())