forked from pool/systemtap
95 lines
3.3 KiB
Diff
95 lines
3.3 KiB
Diff
|
diff -uNar systemtap-0708-ioblockpatch.orig/translate.cxx systemtap-0708-ioblockpatch/translate.cxx
|
||
|
--- systemtap-0708-ioblockpatch.orig/translate.cxx 2007-02-23 15:24:23.000000000 -0800
|
||
|
+++ systemtap-0708-ioblockpatch/translate.cxx 2007-02-23 15:26:38.000000000 -0800
|
||
|
@@ -348,29 +348,39 @@
|
||
|
else
|
||
|
return qname() + " = 0;";
|
||
|
case pe_stats:
|
||
|
- switch (sd.type)
|
||
|
- {
|
||
|
- case statistic_decl::none:
|
||
|
- return (qname()
|
||
|
- + " = _stp_stat_init (HIST_NONE);");
|
||
|
- break;
|
||
|
-
|
||
|
- case statistic_decl::linear:
|
||
|
- return (qname()
|
||
|
- + " = _stp_stat_init (HIST_LINEAR"
|
||
|
- + ", " + stringify(sd.linear_low)
|
||
|
- + ", " + stringify(sd.linear_high)
|
||
|
- + ", " + stringify(sd.linear_step)
|
||
|
- + ");");
|
||
|
- break;
|
||
|
-
|
||
|
- case statistic_decl::logarithmic:
|
||
|
- return (qname()
|
||
|
- + " = _stp_stat_init (HIST_LOG"
|
||
|
- + ", " + stringify(sd.logarithmic_buckets)
|
||
|
- + ");");
|
||
|
- break;
|
||
|
- }
|
||
|
+ {
|
||
|
+ // See also mapvar::init().
|
||
|
+
|
||
|
+ string prefix = qname() + " = _stp_stat_init (";
|
||
|
+ // Check for errors during allocation.
|
||
|
+ string suffix = "if (" + qname () + " == NULL) rc = -ENOMEM;";
|
||
|
+
|
||
|
+ switch (sd.type)
|
||
|
+ {
|
||
|
+ case statistic_decl::none:
|
||
|
+ prefix += "HIST_NONE";
|
||
|
+ break;
|
||
|
+
|
||
|
+ case statistic_decl::linear:
|
||
|
+ prefix += string("HIST_LINEAR")
|
||
|
+ + ", " + stringify(sd.linear_low)
|
||
|
+ + ", " + stringify(sd.linear_high)
|
||
|
+ + ", " + stringify(sd.linear_step);
|
||
|
+ break;
|
||
|
+
|
||
|
+ case statistic_decl::logarithmic:
|
||
|
+ prefix += string("HIST_LOG")
|
||
|
+ + ", " + stringify(sd.logarithmic_buckets);
|
||
|
+ break;
|
||
|
+
|
||
|
+ default:
|
||
|
+ throw semantic_error("unsupported stats type for " + qname());
|
||
|
+ }
|
||
|
+
|
||
|
+ prefix = prefix + "); ";
|
||
|
+ return string (prefix + suffix);
|
||
|
+ }
|
||
|
+
|
||
|
default:
|
||
|
throw semantic_error("unsupported initializer for " + qname());
|
||
|
}
|
||
|
@@ -602,6 +612,8 @@
|
||
|
string prefix = qname() + " = _stp_" + mtype + "_new_" + keysym() + " (" +
|
||
|
(maxsize > 0 ? stringify(maxsize) : "MAXMAPENTRIES") ;
|
||
|
|
||
|
+ // See also var::init().
|
||
|
+
|
||
|
// Check for errors during allocation.
|
||
|
string suffix = "if (" + qname () + " == NULL) rc = -ENOMEM;";
|
||
|
|
||
|
@@ -1094,6 +1106,8 @@
|
||
|
if (basest_names.find(nm) == basest_names.end())
|
||
|
{
|
||
|
o->newline() << "time_" << nm << " = _stp_stat_init (HIST_NONE);";
|
||
|
+ // NB: we don't check for null return here, but instead at
|
||
|
+ // passage to probe handlers and at final printing.
|
||
|
basest_names.insert (nm);
|
||
|
}
|
||
|
}
|
||
|
@@ -1207,7 +1221,8 @@
|
||
|
if (basest_names.find(nm) == basest_names.end())
|
||
|
{
|
||
|
basest_names.insert (nm);
|
||
|
- o->newline() << "{";
|
||
|
+ // NB: check for null stat object
|
||
|
+ o->newline() << "if (likely (time_" << p->name << ")) {";
|
||
|
o->newline(1) << "const char *probe_point = "
|
||
|
<< lex_cast_qstring (* p->locations[0])
|
||
|
<< (p->locations.size() > 1 ? "\"+\"" : "")
|