From: fche Date: Sat, 17 Feb 2007 12:26:14 +0000 (+0000) Subject: 2007-02-17 Frank Ch. Eigler X-Git-Tag: release-0.5.13~70 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=133467ef6474702648f60d6c251f80b687527735;p=systemtap.git 2007-02-17 Frank Ch. Eigler PR 4066. * translate.cxx (var::init): Check stat scalar initialization, just like is done for arrays. (emit_module_exit): Check unlikely but possible null timing stat. --- diff --git a/ChangeLog b/ChangeLog index 45453c64d..1926988d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-02-17 Frank Ch. Eigler + + PR 4066. + * translate.cxx (var::init): Check stat scalar initialization, + just like is done for arrays. + (emit_module_exit): Check unlikely but possible null timing stat. + 2007-02-15 David Smith PR 3625. diff --git a/translate.cxx b/translate.cxx index 30fb21b81..83ee88150 100644 --- a/translate.cxx +++ b/translate.cxx @@ -348,29 +348,39 @@ public: 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()); } @@ -601,6 +611,8 @@ struct mapvar 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;"; @@ -1078,6 +1090,8 @@ c_unparser::emit_module_init () 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); } } @@ -1209,7 +1223,8 @@ c_unparser::emit_module_exit () 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 ? "\"+\"" : "")