123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openServerletpackage=Package.package~plugin:"eva"~name:"mthread"~title:"Eva Mthread Services"()moduleEnum(X:sigtypetend)=structmoduleEnum=Data.Enumletdictionary:X.tEnum.dictionary=Enum.dictionary()lettagnamedescr=Enum.tag~name~descr:(Markdown.plaindescr)dictionaryletpublishlookupnamedescr=Enum.set_lookupdictionarylookup;Request.dictionary~package~name~descr:(Markdown.plaindescr)dictionaryendmoduleJaccess_kind=structmoduleAccessKind=Mt_shared_vars_types.AccessKindincludeEnum(structtypet=AccessKind.tend)letaccess_read=tag"read""Read access"letaccess_write=tag"write""Write access"letlookup(access_kind:AccessKind.t)=matchaccess_kindwith|AccessRead->access_read|AccessWrite->access_writeinclude(valpublishlookup"accessKind""Kind of access")endmoduleJprotection=structtypeprotection=Mt_shared_vars_types.protectionincludeEnum(structtypet=protectionend)letunprotected=tag"unprotected""Unprotected access"letmaybe_protected=tag"maybe_protected""Maybe protected access"letprotected=tag"protected""Protected access"letlookup(protection:protection)=matchprotectionwith|Unprotected->unprotected|MaybeProtected_->maybe_protected|Protected_->protectedinclude(valpublishlookup"protectionKind""Kind of access protection")endmoduleJkeyed_value=Data.Jpair(Data.Jint)(Data.Jstring)moduleJlist_of_keyed_value=Data.Jlist(Jkeyed_value)letlockset_to_keyed_stringlistlockset=Mutex.Set.fold(funmutexacc->(Mutex.idmutex,Mutex.labelmutex)::acc)lockset[]letmqueueset_to_keyed_stringlistmqueueset=Mqueue.Set.fold(funmqueueacc->(Mqueue.idmqueue,Mqueue.labelmqueue)::acc)mqueueset[]letzoneset_to_stringlistzoneset=Memory_zone.Set.fold(funzoneacc->Format.asprintf"%a"Memory_zone.prettyzone::acc)zoneset[]let_thread_summary=letmodel=States.model()inStates.columnmodel~name:"thread"~descr:(Markdown.plain"Thread")~data:(moduleJkeyed_value)~get:(fun(th,_)->Thread.idth,Thread.labelth);States.columnmodel~name:"locksTaken"~descr:(Markdown.plain"Locks taken by thread")~data:(moduleJlist_of_keyed_value)~get:(fun(_,(th_summary:Mt_summary.thread_summary))->lockset_to_keyed_stringlistth_summary.locks.taken);States.columnmodel~name:"locksReleased"~descr:(Markdown.plain"Locks released by thread")~data:(moduleJlist_of_keyed_value)~get:(fun(_,(th_summary:Mt_summary.thread_summary))->lockset_to_keyed_stringlistth_summary.locks.released);States.columnmodel~name:"mqueuesCreated"~descr:(Markdown.plain"Message queues created by thread")~data:(moduleJlist_of_keyed_value)~get:(fun(_,(th_summary:Mt_summary.thread_summary))->mqueueset_to_keyed_stringlistth_summary.mqueues.created);States.columnmodel~name:"mqueuesSenders"~descr:(Markdown.plain"Message queues sending some messages by thread")~data:(moduleJlist_of_keyed_value)~get:(fun(_,(th_summary:Mt_summary.thread_summary))->mqueueset_to_keyed_stringlistth_summary.mqueues.senders);States.columnmodel~name:"mqueuesReceivers"~descr:(Markdown.plain"Message queues receiving some messages by thread")~data:(moduleJlist_of_keyed_value)~get:(fun(_,(th_summary:Mt_summary.thread_summary))->mqueueset_to_keyed_stringlistth_summary.mqueues.receivers);States.columnmodel~name:"sharedVarsRead"~descr:(Markdown.plain"Shared variables read by thread")~data:(moduleData.Jlist(Data.Jstring))~get:(fun(_,(th_summary:Mt_summary.thread_summary))->zoneset_to_stringlistth_summary.shared_vars.read);States.columnmodel~name:"sharedVarsWritten"~descr:(Markdown.plain"Shared variables written by thread")~data:(moduleData.Jlist(Data.Jstring))~get:(fun(_,(th_summary:Mt_summary.thread_summary))->zoneset_to_stringlistth_summary.shared_vars.written);States.register_framac_array~package~name:"mtThreadsSummary"~descr:(Markdown.plain"Data for Mthread summary")~key:(funth->Format.asprintf"%d"(Thread.idth))model(moduleMt_summary.ThreadTable)let_shared_var_summary=letopenMt_shared_vars_typesinletmodel=States.model()inStates.columnmodel~name:"bases"~descr:(Markdown.plain"Memory bases accessed")~data:(moduleData.Jstring)~get:(fun(access,_)->letzone=Mt_summary.access_zoneaccessinletbases=Memory_zone.get_baseszoneinmatchbaseswith|SetbaseswhenBase.Hptset.cardinalbases=1->letbase=Base.Hptset.choosebasesinFormat.asprintf"%a"Base.prettybase|Setbases->Self.fatal"By construction there should only be one base in %a"Base.Hptset.prettybases|Top->Format.asprintf"%t"Eval.Top.pretty_top);States.columnmodel~name:"zones"~descr:(Markdown.plain"Memory zone accessed")~data:(moduleData.Jstring)~get:(fun(access,_)->letzone=Mt_summary.access_zoneaccessinFormat.asprintf"%a"Memory_zone.prettyzone);States.columnmodel~name:"accessKind"~descr:(Markdown.plain"Is the access a read or a write?")~data:(moduleJaccess_kind)~get:(fun(access,_)->Mt_summary.access_kindaccess);States.columnmodel~name:"protectionKind"~descr:(Markdown.plain"Kind of access protection")~data:(moduleJprotection)~get:(fun(access,_)->Mt_summary.access_protectionaccess);States.columnmodel~name:"protectionMutexes"~descr:(Markdown.plain"Mutex protecting the access (if any)")~data:(moduleJlist_of_keyed_value)~get:(fun(access,_)->matchMt_summary.access_protectionaccesswith|Unprotected->[]|MaybeProtectedmutex|Protectedmutex->[Mutex.idmutex,Mutex.labelmutex]);States.columnmodel~name:"markers"~descr:(Markdown.plain"List of statements where the access happens")~data:(moduleData.Jlist(Kernel_ast.Marker))~get:(fun(_,stmts)->Cil_datatype.Stmt.Set.elementsstmts|>List.mapPrinter_tag.localizable_of_stmt);States.register_framac_array~package~name:"mtSharedVarsSummary"~descr:(Markdown.plain"Data for Mthread summary of shared memory accesses")~key:Mt_summary.access_idmodel(moduleMt_summary.AccessTable)