Initialize thrd in a new FrameNode ctor
[dyninst.git] / stackwalk / src / framestepper_pimple.h
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 //We have lots of PIMPL (private implementation) classes for FrameSteppers.  This file
32 //contains a "template" for the common code.  Unfortunately, this isn't a real C++ template,
33 //as actual template classes wouldn't instanciate in the right place.  Instead we'll fake
34 //a template with macros.  I'm bad, but this would otherwise be a lot of repeated code.
35
36
37 #if defined(PIMPL_CLASS)
38 //Can optionally define PIMPL_IMPL_CLASS
39 //Can optionally define PIMPL_NAME
40
41 const char *PIMPL_CLASS::getName() const
42 {
43 #if defined(PIMPL_NAME)
44    return PIMPL_NAME;
45 #else
46    return "<ERROR>";
47 #endif
48 }
49
50 #if defined(PIMPL_IMPL_CLASS)
51
52 const char *PIMPL_IMPL_CLASS::getName() const
53 {
54 #if defined(PIMPL_NAME)
55    return PIMPL_NAME;
56 #else
57    return "<ERROR>";
58 #endif
59 }
60
61 PIMPL_CLASS::PIMPL_CLASS(Walker *w
62 #if defined(PIMPL_ARG1)
63                          , PIMPL_ARG1 arg1
64 #endif
65 #if defined(PIMPL_ARG2)
66                          , PIMPL_ARG2 arg2
67 #endif
68                          ) :
69   FrameStepper(w)
70 {
71 #if defined(PIMPL_NAME)
72   sw_printf("[%s:%u] - Constructing " PIMPL_NAME " at %p\n",
73             __FILE__, __LINE__, this);
74 #endif
75   impl = new PIMPL_IMPL_CLASS(w, this
76 #if defined(PIMPL_ARG1)
77                               , arg1
78 #endif
79 #if defined(PIMPL_ARG2)
80                               , arg2
81 #endif                        
82                               );
83 }
84
85 gcframe_ret_t PIMPL_CLASS::getCallerFrame(const Frame &in, Frame &out)
86 {
87   if (!impl) {
88 #if defined(PIMPL_NAME)
89     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
90               __FILE__, __LINE__);
91     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
92     return gcf_error;
93 #else
94     return gcf_not_me;
95 #endif
96   }
97   return impl->getCallerFrame(in, out);
98 }
99
100 #if defined(OVERLOAD_NEWLIBRARY)
101 void PIMPL_CLASS::newLibraryNotification(LibAddrPair *la, lib_change_t change)
102 {
103   if (!impl) {
104 #if defined(PIMPL_NAME)
105     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
106               __FILE__, __LINE__);
107     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
108 #endif
109     return;
110   }
111   impl->newLibraryNotification(la, change);
112 }
113 #endif
114
115 unsigned PIMPL_CLASS::getPriority() const
116 {
117   if (!impl) {
118 #if defined(PIMPL_NAME)
119     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
120               __FILE__, __LINE__);
121     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
122 #endif
123     return 0;
124   }
125   return impl->getPriority();
126 }
127
128 void PIMPL_CLASS::registerStepperGroup(StepperGroup *group)
129 {
130   if (!impl) {
131 #if defined(PIMPL_NAME)
132     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
133               __FILE__, __LINE__);
134     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
135 #endif
136     return;
137   }
138   impl->registerStepperGroup(group);
139 }
140
141 PIMPL_CLASS::~PIMPL_CLASS()
142 {
143 #if defined(PIMPL_NAME)
144   sw_printf("[%s:%u] - Destructing " PIMPL_NAME " at %p\n", __FILE__, __LINE__, this);
145 #endif  
146   if (impl)
147     delete impl;
148   impl = NULL;
149 }
150
151 #else
152
153 PIMPL_CLASS::PIMPL_CLASS(Walker *w
154 #if defined(PIMPL_ARG1)
155                          , PIMPL_ARG1
156 #endif
157 #if defined(PIMPL_ARG2)
158                          , PIMPL_ARG2
159 #endif
160                          ) :
161   FrameStepper(w),
162   impl(NULL)
163 {
164 }
165
166 gcframe_ret_t PIMPL_CLASS::getCallerFrame(const Frame &, Frame &)
167 {
168 #if defined(PIMPL_NAME)
169   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
170             __FILE__, __LINE__);
171   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
172   return gcf_error;
173 #else
174   return gcf_not_me;
175 #endif
176 }
177
178 #if defined(OVERLOAD_NEWLIBRARY)
179 void PIMPL_CLASS::newLibraryNotification(LibAddrPair *, lib_change_t)
180 {
181 #if defined(PIMPL_NAME)
182   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
183             __FILE__, __LINE__);
184   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
185 #endif
186 }
187 #endif
188
189 unsigned PIMPL_CLASS::getPriority() const
190 {
191 #if defined(PIMPL_NAME)
192   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
193             __FILE__, __LINE__);
194   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
195 #endif
196   return 0;
197 }
198
199 void PIMPL_CLASS::registerStepperGroup(StepperGroup *)
200 {
201 #if defined(PIMPL_NAME)
202   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
203             __FILE__, __LINE__);
204   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
205 #endif
206   return;
207 }
208
209 PIMPL_CLASS::~PIMPL_CLASS()
210 {
211 }
212
213 #endif
214
215 #endif
216