]> sourceware.org Git - systemtap.git/commitdiff
Fix pausing of probes in monitor mode
authorFelix Lu <flu@redhat.com>
Tue, 14 Jun 2016 16:41:59 +0000 (12:41 -0400)
committerFelix Lu <flu@redhat.com>
Tue, 14 Jun 2016 16:56:15 +0000 (12:56 -0400)
Commit 8df0d9e8fb2cc6 caused the probe conditions to be added later in
semantic_pass.

* elaborate.cxx: Add probe conditions early on.
* parse.cxx: parse_synthetic_probe - Set synthetic probe flag.
* staptree.h: struct probe - New synthetic flag.

elaborate.cxx
parse.cxx
staptree.cxx
staptree.h
translate.cxx

index 277e1bb40d261efd610c9dccee7e8be3d51325a2..f2d959d49f940f19cd0e7cfc13af22d466d4106b 100644 (file)
@@ -68,6 +68,7 @@ derived_probe::derived_probe (probe *p, probe_point *l, bool rewrite_loc):
   assert (p);
   this->tok = p->tok;
   this->privileged = p->privileged;
+  this->synthetic = p->synthetic;
   this->body = deep_copy_visitor::deep_copy(p->body);
 
   assert (l);
@@ -2021,8 +2022,83 @@ void add_global_var_display (systemtap_session& s)
     }
 }
 
+static void gen_monitor_data(systemtap_session& s)
+{
+  vardecl* v;
+  embeddedcode* ec;
+
+  v = new vardecl;
+  v->unmangled_name = v->name = "__global___monitor_module_start";
+  v->set_arity(0, 0);
+  v->type = pe_long;
+  v->synthetic = true;
+  s.globals.push_back(v);
+
+  ec = new embeddedcode;
+  ec->code = "#define STAP_MONITOR_READ 8192\n"
+             "static char _monitor_buf[STAP_MONITOR_READ];";
+  s.embeds.push_back(ec);
+
+  functiondecl* fd = new functiondecl;
+  fd->synthetic = true;
+  fd->unmangled_name = fd->name = "__private___monitor_data_function_probes";
+  fd->type = pe_string;
+  v = new vardecl;
+  v->type = pe_long;
+  v->unmangled_name = v->name = "index";
+  fd->formal_args.push_back(v);
+  ec = new embeddedcode;
+  string code;
+  code = "/* unprivileged */ /* pure */"
+         "const struct stap_probe *const p = &stap_probes[STAP_ARG_index];\n"
+         "if (likely (probe_timing(STAP_ARG_index))) {\n"
+         "struct stat_data *stats = _stp_stat_get (probe_timing(STAP_ARG_index), 0);\n"
+         "if (stats->count) {\n"
+         "int64_t avg = _stp_div64 (NULL, stats->sum, stats->count);\n"
+         "snprintf(_monitor_buf, STAP_MONITOR_READ,\n"
+         "\"\\\"index\\\": %zu, \\\"state\\\": \\\"%s\\\", \\\"hits\\\": %lld, "
+         "\\\"min\\\": %lld, \\\"avg\\\": %lld, \\\"max\\\": %lld, \",\n"
+         "p->index, p->cond_enabled ? \"on\" : \"off\", (long long) stats->count,\n"
+         "(long long) stats->min, (long long) avg, (long long) stats->max);\n"
+         "} else {\n"
+         "snprintf(_monitor_buf, STAP_MONITOR_READ,\n"
+         "\"\\\"index\\\": %zu, \\\"state\\\": \\\"%s\\\", \\\"hits\\\": %d, "
+         "\\\"min\\\": %d, \\\"avg\\\": %d, \\\"max\\\": %d, \",\n"
+         "p->index, p->cond_enabled ? \"on\" : \"off\", 0, 0, 0, 0);}}\n"
+         "STAP_RETURN(_monitor_buf);\n";
+  ec->code = code;
+  fd->body = ec;
+  s.functions[fd->name] = fd;
+
+  stringstream probe_code;
+  probe_code << "probe begin {" << endl;
+  probe_code << "__monitor_module_start = jiffies()" << endl;
+  probe_code << "}" << endl;
+
+  probe* p = parse_synthetic_probe(s, probe_code, 0);
+  if (!p)
+    throw SEMANTIC_ERROR (_("can't create begin probe"), 0);
+
+  vector<derived_probe*> dps;
+  derive_probes (s, p, dps);
+
+  derived_probe* dp = dps[0];
+  s.probes.push_back (dp);
+  dp->join_group (s);
+
+  // Repopulate symbol info
+  symresolution_info sym (s);
+  sym.current_function = 0;
+  sym.current_probe = dp;
+  dp->body->visit (&sym);
+}
+
 static void monitor_mode_read(systemtap_session& s)
 {
+  if (!s.monitor) return;
+
+  gen_monitor_data(s);
+
   stringstream code;
 
   unsigned long rough_max_json_size = 100 +
@@ -2065,6 +2141,8 @@ static void monitor_mode_read(systemtap_session& s)
   code << "$value .= sprintf(\"\\\"probe_list\\\": [\\n\")" << endl;
   for (auto it = s.probes.cbegin(); it != s.probes.cend(); ++it)
     {
+      if ((*it)->synthetic) continue;
+
       if (it != s.probes.cbegin())
         code << "$value .= sprintf(\",\\n\")" << endl;
 
@@ -2100,11 +2178,16 @@ static void monitor_mode_read(systemtap_session& s)
   sym.current_function = 0;
   sym.current_probe = dp;
   dp->body->visit (&sym);
+
+  // Resolve types for variables used in the new procfs probe
+  semantic_pass_types(s);
 }
 
 static void monitor_mode_write(systemtap_session& s)
 {
-  for (auto it = s.probes.cbegin(); it != s.probes.cend()-1; ++it) // Skip monitor read probe
+  if (!s.monitor) return;
+
+  for (auto it = s.probes.cbegin(); it != s.probes.cend(); ++it)
     {
       vardecl* v = new vardecl;
       v->unmangled_name = v->name = "__monitor_" + lex_cast(it-s.probes.begin()) + "_enabled";
@@ -2170,13 +2253,13 @@ static void monitor_mode_write(systemtap_session& s)
     }
 
   code << "} else if ($value == \"resume\") {" << endl;
-  for (auto it = s.probes.cbegin(); it != s.probes.cend()-1; ++it)
+  for (auto it = s.probes.cbegin(); it != s.probes.cend(); ++it)
     {
       code << "  __monitor_" << it-s.probes.begin() << "_enabled" << " = 1" << endl;
     }
 
   code << "} else if ($value == \"pause\") {" << endl;
-  for (auto it = s.probes.cbegin(); it != s.probes.cend()-1; ++it)
+  for (auto it = s.probes.cbegin(); it != s.probes.cend(); ++it)
     {
       code << "  __monitor_" << it-s.probes.begin() << "_enabled" << " = 0" << endl;
     }
@@ -2184,7 +2267,7 @@ static void monitor_mode_write(systemtap_session& s)
   code << "  exit()" << endl;
   code << "}";
 
-  for (auto it = s.probes.cbegin(); it != s.probes.cend()-1; ++it)
+  for (auto it = s.probes.cbegin(); it != s.probes.cend(); ++it)
     {
       code << "  if ($value == \"" << it-s.probes.begin() << "\")"
            << "  __monitor_" << it-s.probes.begin() << "_enabled" << " ^= 1" << endl;
@@ -2210,89 +2293,6 @@ static void monitor_mode_write(systemtap_session& s)
   dp->body->visit (&sym);
 }
 
-static void create_monitor_function(systemtap_session& s)
-{
-  functiondecl* fd = new functiondecl;
-  fd->synthetic = true;
-  fd->unmangled_name = fd->name = "__private___monitor_data_function_probes";
-  fd->type = pe_string;
-
-  vardecl* v = new vardecl;
-  v->type = pe_long;
-  v->unmangled_name = v->name = "index";
-  fd->formal_args.push_back(v);
-
-  embeddedcode* ec = new embeddedcode;
-  string code;
-  code = "/* unprivileged */ /* pure */"
-         "const struct stap_probe *const p = &stap_probes[STAP_ARG_index];\n"
-         "if (likely (probe_timing(STAP_ARG_index))) {\n"
-         "struct stat_data *stats = _stp_stat_get (probe_timing(STAP_ARG_index), 0);\n"
-         "if (stats->count) {\n"
-         "int64_t avg = _stp_div64 (NULL, stats->sum, stats->count);\n"
-         "snprintf(_monitor_buf, STAP_MONITOR_READ,\n"
-         "\"\\\"index\\\": %zu, \\\"state\\\": \\\"%s\\\", \\\"hits\\\": %lld, "
-         "\\\"min\\\": %lld, \\\"avg\\\": %lld, \\\"max\\\": %lld, \",\n"
-         "p->index, p->cond_enabled ? \"on\" : \"off\", (long long) stats->count,\n"
-         "(long long) stats->min, (long long) avg, (long long) stats->max);\n"
-         "} else {\n"
-         "snprintf(_monitor_buf, STAP_MONITOR_READ,\n"
-         "\"\\\"index\\\": %zu, \\\"state\\\": \\\"%s\\\", \\\"hits\\\": %d, "
-         "\\\"min\\\": %d, \\\"avg\\\": %d, \\\"max\\\": %d, \",\n"
-         "p->index, p->cond_enabled ? \"on\" : \"off\", 0, 0, 0, 0);}}\n"
-         "STAP_RETURN(_monitor_buf);\n";
-  ec->code = code;
-  fd->body = ec;
-
-  s.functions[fd->name] = fd;
-}
-
-static void monitor_mode_init(systemtap_session& s)
-{
-  if (!s.monitor) return;
-
-  vardecl* v = new vardecl;
-  v->unmangled_name = v->name = "__global___monitor_module_start";
-  v->set_arity(0, 0);
-  v->type = pe_long;
-  v->synthetic = true;
-  s.globals.push_back(v);
-
-  embeddedcode* ec = new embeddedcode;
-  ec->code = "#define STAP_MONITOR_READ 8192\n"
-             "static char _monitor_buf[STAP_MONITOR_READ];";
-  s.embeds.push_back(ec);
-
-  create_monitor_function(s);
-  monitor_mode_read(s);
-  monitor_mode_write(s);
-
-  stringstream code;
-  code << "probe begin {" << endl;
-  code << "__monitor_module_start = jiffies()" << endl;
-  code << "}" << endl;
-
-  probe* p = parse_synthetic_probe(s, code, 0);
-  if (!p)
-    throw SEMANTIC_ERROR (_("can't create begin probe"), 0);
-
-  vector<derived_probe*> dps;
-  derive_probes (s, p, dps);
-
-  derived_probe* dp = dps[0];
-  s.probes.push_back (dp);
-  dp->join_group (s);
-
-  // Repopulate symbol info
-  symresolution_info sym (s);
-  sym.current_function = 0;
-  sym.current_probe = dp;
-  dp->body->visit (&sym);
-
-  // Resolve types for variables in the new procfs probes
-  semantic_pass_types(s);
-}
-
 static void setup_timeout(systemtap_session& s)
 {
   if (!s.timeout) return;
@@ -2333,12 +2333,13 @@ semantic_pass (systemtap_session& s)
 
       if (rc == 0) setup_timeout(s);
       if (rc == 0) rc = semantic_pass_symbols (s);
+      if (rc == 0) monitor_mode_write (s);
       if (rc == 0) rc = semantic_pass_conditions (s);
       if (rc == 0) rc = semantic_pass_optimize1 (s);
       if (rc == 0) rc = semantic_pass_types (s);
       if (rc == 0) rc = gen_dfa_table(s);
       if (rc == 0) add_global_var_display (s);
-      if (rc == 0) monitor_mode_init (s);
+      if (rc == 0) monitor_mode_read(s);
       if (rc == 0) rc = semantic_pass_optimize2 (s);
       if (rc == 0) rc = semantic_pass_vars (s);
       if (rc == 0) rc = semantic_pass_stats (s);
index ab14ba96a702d0ea12364c98513540cd2cf86608..1f8e90ff3d3eae0b8996942cf725d5eb3a281fc3 100644 (file)
--- a/parse.cxx
+++ b/parse.cxx
@@ -2012,6 +2012,7 @@ parser::parse_synthetic_probe (const token* chain)
 
   input.set_current_file(0);
   input.set_current_token_chain(0);
+  p->synthetic = true;
   return p;
 }
 
index a69acd6d5ea065795dba29fab9394cf859179a26..b691a69710f57efbc3854a587ae5b7d443953b11 100644 (file)
@@ -123,7 +123,7 @@ unsigned probe::last_probeidx = 0;
 
 probe::probe ():
   body (0), base (0), tok (0), systemtap_v_conditional (0), privileged (false),
-  id (last_probeidx ++)
+  synthetic (false), id (last_probeidx ++)
 {
 }
 
@@ -134,7 +134,7 @@ probe::probe ():
 probe::probe(probe* p, probe_point* l):
   locations (1, l), body (deep_copy_visitor::deep_copy (p->body)),
   base (p), tok (p->tok), systemtap_v_conditional (p->systemtap_v_conditional),
-  privileged (p->privileged), id (last_probeidx ++)
+  privileged (p->privileged), synthetic (p->synthetic), id (last_probeidx ++)
 {
   assert (p->locals.size() == 0);
   assert (p->unused_locals.size() == 0);
index 9bc65d06c83fa7bb1b6f8a4fd8b6b68af2cd5b84..8a1705eb19ff04c9e26d3a2148083ed9fe02b91b 100644 (file)
@@ -831,6 +831,7 @@ struct probe
   std::vector<vardecl*> locals;
   std::vector<vardecl*> unused_locals;
   bool privileged;
+  bool synthetic;
   unsigned id;
 
   probe ();
index 5daf725c7d70612d6aac7ad14bcf3e6615bd974e..4c91660f4316af972cbeb8a7dc491454a8953966 100644 (file)
@@ -1964,7 +1964,7 @@ c_unparser::emit_module_init ()
                       it != session->probes[i]->probes_with_affected_conditions.end()
                             && !start_timer; ++it)
                   {
-                    if ((*it)->group->otf_supported(*session))
+                    if ((*it)->group && (*it)->group->otf_supported(*session))
                       start_timer = true;
                   }
               }
This page took 0.045423 seconds and 5 git commands to generate.