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 ? "\"+\"" : "")