Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
2b2b425a5800cddaca8684887ec6a79285568f96
[simgrid.git] / src / msg / instr_msg_task.cpp
1 /* Copyright (c) 2010, 2012-2017. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include "mc/mc.h"
8 #include "src/instr/instr_private.hpp"
9 #include "src/msg/msg_private.hpp"
10
11 #include <atomic>
12
13 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_msg, instr, "MSG instrumentation");
14
15 void TRACE_msg_set_task_category(msg_task_t task, const char *category)
16 {
17   xbt_assert(task->category == nullptr, "Task %p(%s) already has a category (%s).",
18       task, task->name, task->category);
19
20   //if user provides a nullptr category, task is no longer traced
21   if (category == nullptr) {
22     xbt_free (task->category);
23     task->category = nullptr;
24     XBT_DEBUG("MSG task %p(%s), category removed", task, task->name);
25     return;
26   }
27
28   //set task category
29   task->category = xbt_strdup (category);
30   XBT_DEBUG("MSG task %p(%s), category %s", task, task->name, task->category);
31 }
32
33 /* MSG_task_create related function*/
34 void TRACE_msg_task_create(msg_task_t task)
35 {
36   static std::atomic_ullong counter{0};
37   task->counter = counter++;
38   task->category = nullptr;
39
40   if(MC_is_active())
41     MC_ignore_heap(&(task->counter), sizeof(task->counter));
42
43   XBT_DEBUG("CREATE %p, %lld", task, task->counter);
44 }
45
46 /* MSG_task_execute related functions */
47 void TRACE_msg_task_execute_start(msg_task_t task)
48 {
49   XBT_DEBUG("EXEC,in %p, %lld, %s", task, task->counter, task->category);
50
51   if (TRACE_msg_process_is_enabled()){
52     container_t process_container = simgrid::instr::Container::byName(instr_process_id(MSG_process_self()));
53     simgrid::instr::StateType* state =
54         static_cast<simgrid::instr::StateType*>(process_container->type_->byName("MSG_PROCESS_STATE"));
55     simgrid::instr::Value* val = state->getEntityValue("task_execute");
56     new simgrid::instr::PushStateEvent(MSG_get_clock(), process_container, state, val);
57   }
58 }
59
60 void TRACE_msg_task_execute_end(msg_task_t task)
61 {
62   XBT_DEBUG("EXEC,out %p, %lld, %s", task, task->counter, task->category);
63
64   if (TRACE_msg_process_is_enabled()){
65     container_t process_container = simgrid::instr::Container::byName(instr_process_id(MSG_process_self()));
66     simgrid::instr::Type* type    = process_container->type_->byName("MSG_PROCESS_STATE");
67     new simgrid::instr::PopStateEvent(MSG_get_clock(), process_container, type);
68   }
69 }
70
71 /* MSG_task_destroy related functions */
72 void TRACE_msg_task_destroy(msg_task_t task)
73 {
74   XBT_DEBUG("DESTROY %p, %lld, %s", task, task->counter, task->category);
75
76   //free category
77   xbt_free(task->category);
78   task->category = nullptr;
79 }
80
81 /* MSG_task_get related functions */
82 void TRACE_msg_task_get_start()
83 {
84   XBT_DEBUG("GET,in");
85
86   if (TRACE_msg_process_is_enabled()){
87     container_t process_container = simgrid::instr::Container::byName(instr_process_id(MSG_process_self()));
88     simgrid::instr::StateType* state =
89         static_cast<simgrid::instr::StateType*>(process_container->type_->byName("MSG_PROCESS_STATE"));
90     simgrid::instr::Value* val    = state->getEntityValue("receive");
91     new simgrid::instr::PushStateEvent(MSG_get_clock(), process_container, state, val);
92   }
93 }
94
95 void TRACE_msg_task_get_end(double start_time, msg_task_t task)
96 {
97   XBT_DEBUG("GET,out %p, %lld, %s", task, task->counter, task->category);
98
99   if (TRACE_msg_process_is_enabled()){
100     container_t process_container = simgrid::instr::Container::byName(instr_process_id(MSG_process_self()));
101     simgrid::instr::Type* type    = process_container->type_->byName("MSG_PROCESS_STATE");
102     new simgrid::instr::PopStateEvent(MSG_get_clock(), process_container, type);
103
104     std::string key = std::string("p") + std::to_string(task->counter);
105     type = simgrid::instr::Type::getRootType()->byName("MSG_PROCESS_TASK_LINK");
106     new simgrid::instr::EndLinkEvent(MSG_get_clock(), simgrid::instr::Container::getRootContainer(), type,
107                                      process_container, "SR", key);
108   }
109 }
110
111 /* MSG_task_put related functions */
112 int TRACE_msg_task_put_start(msg_task_t task)
113 {
114   XBT_DEBUG("PUT,in %p, %lld, %s", task, task->counter, task->category);
115
116   if (TRACE_msg_process_is_enabled()){
117     container_t process_container = simgrid::instr::Container::byName(instr_process_id(MSG_process_self()));
118     simgrid::instr::StateType* state =
119         static_cast<simgrid::instr::StateType*>(process_container->type_->byName("MSG_PROCESS_STATE"));
120     simgrid::instr::Value* val = state->getEntityValue("send");
121     new simgrid::instr::PushStateEvent(MSG_get_clock(), process_container, state, val);
122
123     std::string key = std::string("p") + std::to_string(task->counter);
124     simgrid::instr::LinkType* type =
125         static_cast<simgrid::instr::LinkType*>(simgrid::instr::Type::getRootType()->byName("MSG_PROCESS_TASK_LINK"));
126     new simgrid::instr::StartLinkEvent(MSG_get_clock(), simgrid::instr::Container::getRootContainer(), type,
127                                        process_container, "SR", key);
128   }
129
130   return 1;
131 }
132
133 void TRACE_msg_task_put_end()
134 {
135   XBT_DEBUG("PUT,out");
136
137   if (TRACE_msg_process_is_enabled()){
138     container_t process_container = simgrid::instr::Container::byName(instr_process_id(MSG_process_self()));
139     simgrid::instr::Type* type    = process_container->type_->byName("MSG_PROCESS_STATE");
140     new simgrid::instr::PopStateEvent(MSG_get_clock(), process_container, type);
141   }
142 }