Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fa6895cbf62458624b8f1f6baea893b246bd7163
[simgrid.git] / src / msg / instr_msg_process.c
1 /* Copyright (c) 2010, 2012-2014. 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 "msg_private.h"
8
9 #include "msg/datatypes.h"
10 #include "simix/smx_process_private.h"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_msg_process, instr, "MSG process");
13
14 char *instr_process_id (msg_process_t proc, char *str, int len)
15 {
16   return instr_process_id_2 (proc->name, proc->pid, str, len);//MSG_process_get_name(proc), MSG_process_get_PID(proc), str, len);
17 }
18
19 char *instr_process_id_2 (const char *process_name, int process_pid, char *str, int len)
20 {
21   snprintf (str, len, "%s-%d", process_name, process_pid);
22   return str;
23 }
24
25 /*
26  * Instrumentation functions to trace MSG processes (msg_process_t)
27  */
28 void TRACE_msg_process_change_host(msg_process_t process, msg_host_t old_host, msg_host_t new_host)
29 {
30   if (TRACE_msg_process_is_enabled()){
31     static long long int counter = 0;
32
33     char key[INSTR_DEFAULT_STR_SIZE];
34     snprintf (key, INSTR_DEFAULT_STR_SIZE, "%lld", counter++);
35
36     int len = INSTR_DEFAULT_STR_SIZE;
37     char str[INSTR_DEFAULT_STR_SIZE];
38
39     //start link
40     container_t msg = PJ_container_get (instr_process_id(process, str, len));
41     type_t type = PJ_type_get ("MSG_PROCESS_LINK", PJ_type_get_root());
42     new_pajeStartLink (MSG_get_clock(), PJ_container_get_root(), type, msg, "M", key);
43
44     //destroy existing container of this process
45     TRACE_msg_process_destroy (MSG_process_get_name (process), MSG_process_get_PID (process), old_host);
46
47     //create new container on the new_host location
48     TRACE_msg_process_create (MSG_process_get_name (process), MSG_process_get_PID (process), new_host);
49
50     //end link
51     msg = PJ_container_get(instr_process_id(process, str, len));
52     type = PJ_type_get ("MSG_PROCESS_LINK", PJ_type_get_root());
53     new_pajeEndLink (MSG_get_clock(), PJ_container_get_root(), type, msg, "M", key);
54   }
55 }
56
57 void TRACE_msg_process_create (const char *process_name, int process_pid, msg_host_t host)
58 {
59   if (TRACE_msg_process_is_enabled()){
60     int len = INSTR_DEFAULT_STR_SIZE;
61     char str[INSTR_DEFAULT_STR_SIZE];
62
63     container_t host_container = PJ_container_get (SIMIX_host_get_name(host));
64     PJ_container_new(instr_process_id_2(process_name, process_pid, str, len), INSTR_MSG_PROCESS, host_container);
65   }
66 }
67
68 void TRACE_msg_process_destroy (const char *process_name, int process_pid, msg_host_t host)
69 {
70   int len = INSTR_DEFAULT_STR_SIZE;
71   char str[INSTR_DEFAULT_STR_SIZE];
72
73   container_t process = PJ_container_get (instr_process_id_2 (process_name, process_pid, str, len));
74   PJ_container_remove_from_parent (process);
75   PJ_container_free (process);
76 }
77
78 void TRACE_msg_process_kill(smx_process_exit_status_t status, msg_process_t process)
79 {
80   if (TRACE_msg_process_is_enabled() && status==SMX_EXIT_FAILURE){
81     //kill means that this process no longer exists, let's destroy it
82     TRACE_msg_process_destroy(MSG_process_get_name (process), MSG_process_get_PID (process), MSG_process_get_host (process));
83   }
84 }
85
86 void TRACE_msg_process_suspend(msg_process_t process)
87 {
88   if (TRACE_msg_process_is_enabled()){
89     int len = INSTR_DEFAULT_STR_SIZE;
90     char str[INSTR_DEFAULT_STR_SIZE];
91
92     container_t process_container = PJ_container_get (instr_process_id(process, str, len));
93     type_t type = PJ_type_get ("MSG_PROCESS_STATE", process_container->type);
94     val_t value = PJ_value_get ("suspend", type);
95     new_pajePushState (MSG_get_clock(), process_container, type, value);
96   }
97 }
98
99 void TRACE_msg_process_resume(msg_process_t process)
100 {
101   if (TRACE_msg_process_is_enabled()){
102     int len = INSTR_DEFAULT_STR_SIZE;
103     char str[INSTR_DEFAULT_STR_SIZE];
104
105     container_t process_container = PJ_container_get (instr_process_id(process, str, len));
106     type_t type = PJ_type_get ("MSG_PROCESS_STATE", process_container->type);
107     new_pajePopState (MSG_get_clock(), process_container, type);
108   }
109 }
110
111 void TRACE_msg_process_sleep_in(msg_process_t process)
112 {
113   if (TRACE_msg_process_is_enabled()){
114     int len = INSTR_DEFAULT_STR_SIZE;
115     char str[INSTR_DEFAULT_STR_SIZE];
116
117     container_t process_container = PJ_container_get (instr_process_id(process, str, len));
118     type_t type = PJ_type_get ("MSG_PROCESS_STATE", process_container->type);
119     val_t value = PJ_value_get ("sleep", type);
120     new_pajePushState (MSG_get_clock(), process_container, type, value);
121   }
122 }
123
124 void TRACE_msg_process_sleep_out(msg_process_t process)
125 {
126   if (TRACE_msg_process_is_enabled()){
127     int len = INSTR_DEFAULT_STR_SIZE;
128     char str[INSTR_DEFAULT_STR_SIZE];
129
130     container_t process_container = PJ_container_get (instr_process_id(process, str, len));
131     type_t type = PJ_type_get ("MSG_PROCESS_STATE", process_container->type);
132     new_pajePopState (MSG_get_clock(), process_container, type);
133   }
134 }
135
136 void TRACE_msg_process_end(msg_process_t process)
137 {
138   if (TRACE_msg_process_is_enabled()) {
139     int len = INSTR_DEFAULT_STR_SIZE;
140     char str[INSTR_DEFAULT_STR_SIZE];
141
142     //that's the end, let's destroy it
143     container_t container = PJ_container_get (instr_process_id(process, str, len));
144     PJ_container_remove_from_parent (container);
145     PJ_container_free (container);
146   }
147 }