summaryrefslogtreecommitdiff
path: root/dwarfdump2/srcfilesholder.h
diff options
context:
space:
mode:
Diffstat (limited to 'dwarfdump2/srcfilesholder.h')
-rw-r--r--dwarfdump2/srcfilesholder.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/dwarfdump2/srcfilesholder.h b/dwarfdump2/srcfilesholder.h
new file mode 100644
index 0000000..0594c07
--- /dev/null
+++ b/dwarfdump2/srcfilesholder.h
@@ -0,0 +1,89 @@
+/*
+ Copyright (C) 2009-2011 David Anderson All Rights Reserved.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of version 2 of the GNU General Public License as
+ published by the Free Software Foundation.
+
+ This program is distributed in the hope that it would be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ Further, this software is distributed without any warranty that it is
+ free of the rightful claim of any third person regarding infringement
+ or the like. Any license provided herein, whether implied or
+ otherwise, applies only to this software file. Patent licenses, if
+ any, provided herein do not apply to combinations of this program with
+ other software, or any other product whatsoever.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write the Free Software Foundation, Inc., 51
+ Franklin Street - Fifth Floor, Boston MA 02110-1301, USA.
+
+ Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
+ Mountain View, CA 94043, or:
+
+ http://www.sgi.com
+
+ For further information regarding this notice, see:
+
+ http://oss.sgi.com/projects/GenInfo/NoticeExplan
+
+
+*/
+
+#ifndef SRCFILESHOLDER_H
+#define SRCFILESHOLDER_H
+// Reference counting eliminates confusion and bugs
+// when deciding when to do dealloc.
+// It might be nice to store a vector of string here and
+// dealloc the dwarf data on construction.
+// But for now we store the libdwarf strings.
+class SrcfilesHolder {
+public:
+ SrcfilesHolder():dbg_(0),srcfiles_(0),cnt_(0),refcount_(new int(1)) { };
+ SrcfilesHolder(Dwarf_Debug dbg, char **srcfiles, Dwarf_Signed cnt):
+ dbg_(dbg),srcfiles_(srcfiles),cnt_(cnt),refcount_(new int(1)) { };
+ ~SrcfilesHolder() {
+ (*refcount_)--;
+ if( (*refcount_) == 0) {
+ delete refcount_;
+ if(srcfiles_) do_delete();
+ }
+ };
+ SrcfilesHolder(const SrcfilesHolder & d):dbg_(d.dbg_),
+ srcfiles_(d.srcfiles_),cnt_(d.cnt_),
+ refcount_(d.refcount_) {
+ (*refcount_)++;
+ };
+ SrcfilesHolder & operator=(const SrcfilesHolder & d) {
+ if(this != &d) {
+ (*d.refcount_)++;
+ (*refcount_)--;
+ if( (*refcount_) == 0) {
+ delete refcount_;
+ if(srcfiles_) do_delete();
+ }
+ refcount_ = d.refcount_;
+ srcfiles_ = d.srcfiles_;
+ cnt_ = d.cnt_;
+ dbg_ = d.dbg_;
+ }
+ return *this;
+ };
+ Dwarf_Signed count() { return cnt_; };
+ char ** srcfiles() { return srcfiles_; };
+ Dwarf_Debug dbg() { return dbg_; };
+private:
+ void do_delete() {
+ for (Dwarf_Signed si = 0; si < cnt_; ++si) {
+ dwarf_dealloc(dbg_, srcfiles_[si], DW_DLA_STRING);
+ }
+ dwarf_dealloc(dbg_, srcfiles_, DW_DLA_LIST);
+ };
+ Dwarf_Debug dbg_;
+ char **srcfiles_;
+ Dwarf_Signed cnt_;
+ int *refcount_;
+};
+#endif // SRCFILESHOLDER_H