Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
e1b71e109d7b29b147ac80c227ffcd8d3610aea2
[simgrid.git] / src / instr / msg_process_instr.c
1 /*
2  * msg_process_instr.c
3  *
4  *  Created on: Feb 24, 2010
5  *      Author: Lucas Schnorr
6  *     License: This program is free software; you can redistribute
7  *              it and/or modify it under the terms of the license
8  *              (GNU LGPL) which comes with this package.
9  *
10  *     Copyright (c) 2009 The SimGrid team.
11  */
12
13 #include "instr/private.h"
14 #include "instr/config.h"
15
16 #ifdef HAVE_TRACING
17
18 static xbt_dict_t process_containers = NULL;
19
20 void __TRACE_msg_process_init (void)
21 {
22   process_containers = xbt_dict_new();
23 }
24
25 void __TRACE_msg_process_location (m_process_t process)
26 {
27   char name[200], alias[200];
28   m_host_t host = MSG_process_get_host (process);
29   TRACE_process_container (process, name, 200);
30   TRACE_process_alias_container (process, host, alias, 200);
31
32   //check if process_alias container is already created
33   if (!xbt_dict_get_or_null (process_containers, alias)){
34     if (IS_TRACING_PROCESSES) pajeCreateContainer (MSG_get_clock(), alias, "PROCESS", MSG_host_get_name(host), name);
35     if (IS_TRACING_PROCESSES) pajePushState (MSG_get_clock(), "presence", alias, "1");
36     xbt_dict_set (process_containers, xbt_strdup(alias), xbt_strdup("1"), xbt_free);
37   }
38 }
39
40 /*
41  * TRACE_msg_set_process_category: tracing interface function
42  */
43 void TRACE_msg_set_process_category (m_process_t process, const char *category)
44 {
45   if (!IS_TRACING) return;
46
47   //set process category
48   process->category = xbt_new (char, strlen (category)+1);
49   strncpy (process->category, category, strlen(category)+1);
50
51   //create container of type "PROCESS" to indicate location
52   __TRACE_msg_process_location (process);
53
54   //create container of type "process" to indicate behavior
55   char name[200];
56   TRACE_process_container (process, name, 200);
57   if (IS_TRACING_PROCESSES) pajeCreateContainer (MSG_get_clock(), name, "process", category, name);
58   if (IS_TRACING_PROCESSES) pajeSetState (MSG_get_clock(), "process-state", name, "executing");
59 }
60
61 /*
62  * Instrumentation functions to trace MSG processes (m_process_t)
63  */
64 void TRACE_msg_process_change_host (m_process_t process, m_host_t old_host, m_host_t new_host)
65 {
66   if (!IS_TRACING_PROCESSES || !IS_TRACED(process)) return;
67
68   char alias[200];
69   TRACE_process_alias_container (process, old_host, alias, 200);
70   if (IS_TRACING_PROCESSES) pajePopState (MSG_get_clock(), "presence", alias);
71
72   __TRACE_msg_process_location (process);
73   TRACE_process_alias_container (process, new_host, alias, 200);
74   if (IS_TRACING_PROCESSES) pajePushState (MSG_get_clock(), "presence", alias, "1");
75 }
76
77 void TRACE_msg_process_kill (m_process_t process)
78 {
79   if (!IS_TRACING_PROCESSES || !IS_TRACED(process)) return;
80
81   char name[200];
82   TRACE_process_container (process, name, 200);
83   pajeDestroyContainer (MSG_get_clock(), "process", name);
84 }
85
86 void TRACE_msg_process_suspend (m_process_t process)
87 {
88   if (!IS_TRACING_PROCESSES || !IS_TRACED(process)) return;
89
90   char name[200];
91   TRACE_process_container (process, name, 200);
92   pajeSetState (MSG_get_clock(), "process-state", name, "suspend");
93 }
94
95 void TRACE_msg_process_resume (m_process_t process)
96 {
97   if (!IS_TRACING_PROCESSES || !IS_TRACED(process)) return;
98
99   char name[200];
100   TRACE_process_container (process, name, 200);
101   pajeSetState (MSG_get_clock(), "process-state", name, "executing");
102 }
103
104 void TRACE_msg_process_sleep_in (m_process_t process)
105 {
106   if (!IS_TRACING_PROCESSES || !IS_TRACED(process)) return;
107
108   char name[200];
109   TRACE_process_container (process, name, 200);
110   pajeSetState (MSG_get_clock(), "process-state", name, "sleep");
111 }
112
113 void TRACE_msg_process_sleep_out (m_process_t process)
114 {
115   if (!IS_TRACING_PROCESSES || !IS_TRACED(process)) return;
116
117   char name[200];
118   TRACE_process_container (process, name, 200);
119   pajeSetState (MSG_get_clock(), "process-state", name, "executing");
120 }
121
122 void TRACE_msg_process_end (m_process_t process)
123 {
124   if (!IS_TRACED(process)) return;
125
126   char name[200], alias[200];
127   m_host_t host = MSG_process_get_host (process);
128   TRACE_process_container (process, name, 200);
129   TRACE_process_alias_container (process, host, alias, 200);
130   if (IS_TRACING_PROCESSES) pajeDestroyContainer (MSG_get_clock(), "process", name);
131   if (IS_TRACING_PROCESSES) pajeDestroyContainer (MSG_get_clock(), "PROCESS", alias);
132 }
133
134 #endif