ATLAS Offline Software
Public Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
DebugView Class Reference

Very simple pass-through implementation of IProxyDict. More...

#include <DebugView.h>

Inheritance diagram for DebugView:
Collaboration diagram for DebugView:

Public Member Functions

 DebugView ()=delete
 
 DebugView (std::string const &Name, bool AllowFallThrough=true, std::string const &storeName="StoreGateSvc")
 
virtual ~DebugView ()
 
virtual void linkParent (const IProxyDict *parent)
 
virtual SG::DataProxyproxy (const CLID &id, const std::string &key) const
 
virtual SG::DataProxyfindProxy (const CLID &id, const std::string &key, const bool allowFallThrough) const
 
virtual SG::DataProxyproxy (const void *const pTransient) const
 Get a proxy referencing a given transient object. More...
 
virtual SG::DataProxyrecordObject (SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting)
 
std::string viewKey (const std::string &key) const
 Construct a key as used in the parent store. More...
 
virtual const std::set< const SG::View * > & getParentLinks () const
 returns the links to the previously used views More...
 
void setFilter (std::vector< std::string > const &inputFilter)
 Set a filtering rule for anything loaded via fallthrough. More...
 
virtual SG::DataProxydeep_proxy (const void *const pTransient) const
 get proxy for a given data object address in memory, but performs a deep search among all possible 'symlinked' containers TEMPORARY: This method is going away. More...
 
virtual SG::DataProxyproxy_exact (SG::sgkey_t sgkey) const
 Get proxy given a hashed key+clid. More...
 
virtual std::vector< const SG::DataProxy * > proxies () const
 Return the list of all current proxies in store. More...
 
virtual StatusCode addToStore (CLID id, SG::DataProxy *proxy)
 Add a new proxy to the store. More...
 
virtual void boundHandle (IResetable *handle)
 Tell the store that a handle has been bound to a proxy. More...
 
virtual void unboundHandle (IResetable *handle)
 Tell the store that a handle has been unbound from a proxy. More...
 
virtual bool tryELRemap (sgkey_t sgkey_in, size_t index_in, sgkey_t &sgkey_out, size_t &index_out)
 Test to see if the target of an ElementLink has moved. More...
 
virtual const std::string & name () const
 
virtual IStringPool::sgkey_t stringToKey (const std::string &str, CLID clid)
 
virtual const std::string * keyToString (IStringPool::sgkey_t key) const
 
virtual const std::string * keyToString (IStringPool::sgkey_t key, CLID &clid) const
 
virtual void registerKey (IStringPool::sgkey_t key, const std::string &str, CLID clid)
 
std::string dump (const std::string &indent="") const
 
void setROI (const ElementLink< TrigRoiDescriptorCollection > &roi)
 
const ElementLink< TrigRoiDescriptorCollection > & getROI () const
 

Protected Attributes

tbb::concurrent_unordered_set< std::string > m_fallList ATLAS_THREAD_SAFE
 
ServiceHandle< StoreGateSvcm_store
 
ElementLink< TrigRoiDescriptorCollectionm_roi
 
std::string m_name
 
std::set< const SG::View * > m_parents
 
std::vector< std::string > m_fallFilter
 
bool m_allowFallThrough
 

Private Member Functions

bool msgLvl (const MSG::Level lvl) const
 Test the output level. More...
 
MsgStream & msg () const
 The standard message stream. More...
 
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream. More...
 
void setLevel (MSG::Level lvl)
 Change the current logging level. More...
 
void initMessaging () const
 Initialize our message level and MessageSvc. More...
 

Private Attributes

std::string m_nm
 Message source name. More...
 
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels) More...
 
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer. More...
 
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level. More...
 

Detailed Description

Very simple pass-through implementation of IProxyDict.

Most of the methods are copypasta and don't do anything Adds extra debugging information to SimpleView

Author
Ben Wynne - ATLAS

Definition at line 28 of file DebugView.h.

Constructor & Destructor Documentation

◆ DebugView() [1/2]

DebugView::DebugView ( )
delete

◆ DebugView() [2/2]

DebugView::DebugView ( std::string const Name,
bool  AllowFallThrough = true,
std::string const storeName = "StoreGateSvc" 
)

Definition at line 9 of file DebugView.cxx.

9  :
10  SimpleView( Name, AllowFallThrough, storeName ),
12 {
13 }

◆ ~DebugView()

DebugView::~DebugView ( )
virtual

Definition at line 15 of file DebugView.cxx.

16 {
17  // Debugging info
18  ATH_MSG_INFO( "Loaded via fallthrough from view " << m_name << ": " );
19  for ( auto const& key : m_fallList ) ATH_MSG_INFO( key );
20 
21  ATH_MSG_INFO( "View " << m_name << " has " << m_parents.size() << " parents" );
22 }

Member Function Documentation

◆ addToStore()

StatusCode SimpleView::addToStore ( CLID  id,
SG::DataProxy proxy 
)
virtualinherited

Add a new proxy to the store.

Parameters
idCLID as which the proxy should be added.
proxyThe proxy to add.

Simple addition of a proxy to the store. The key is taken as the primary key of the proxy. Does not handle things like overwrite, history, symlinks, etc. Should return failure if there is already an entry for this clid/key.

Definition at line 146 of file SimpleView.cxx.

147 {
148  return m_store->addToStore( id, proxy );
149 }

◆ boundHandle()

void SimpleView::boundHandle ( IResetable handle)
virtualinherited

Tell the store that a handle has been bound to a proxy.

Parameters
handleThe handle that was bound. The default implementation does nothing.

Definition at line 189 of file SimpleView.cxx.

190 {
191  return m_store->boundHandle( handle );
192 }

◆ deep_proxy()

virtual SG::DataProxy* SimpleView::deep_proxy ( const void *const  pTransient) const
inlinevirtualinherited

get proxy for a given data object address in memory, but performs a deep search among all possible 'symlinked' containers TEMPORARY: This method is going away.

Definition at line 71 of file SimpleView.h.

72  { return proxy (pTransient); }

◆ dump()

std::string SimpleView::dump ( const std::string &  indent = "") const
inherited

Definition at line 237 of file SimpleView.cxx.

237  {
238 
239  // Dump view contents
240  std::string ret = indent + "Dump " + name() + "\n";
241  ret += indent + "[";
242  for ( const SG::DataProxy* dp: proxies() ) {
243  if ( dp->name().find( name() ) == 0 )
244  ret += " " + dp->name();
245  }
246  ret += " ]\n";
247 
248  // Dump parent views
249  if ( m_parents.size() ) ret += indent + "Parents:\n";
250  for ( auto p : m_parents ) {
251  ret += p->dump( indent + " " );
252  }
253 
254  // Fallthrough
255  if ( indent == "" ) {
256  if ( m_allowFallThrough ) {
257  ret += indent + "May access main store: " + m_store->name();
258  } else {
259  ret += indent + "May not access main store";
260  }
261  }
262  return ret;
263 }

◆ findProxy()

SG::DataProxy * DebugView::findProxy ( const CLID id,
const std::string &  key,
const bool  allowFallThrough 
) const
virtual

Reimplemented from SimpleView.

Definition at line 50 of file DebugView.cxx.

51 {
52  auto isValid = [](const SG::DataProxy* p) { return p != nullptr and p->isValid(); };
53  auto localProxy = m_store->proxy( id, viewKey(key) );
54  if ( isValid( localProxy ) ) {
55  return localProxy;
56  }
57 
58  // Locate any parent views containing the data
59  SG::DataProxy* parentProxy = nullptr;
60  std::vector< const SG::View* > validParents;
61  for ( auto& parent: m_parents ) {
62 
63  // Don't allow parents to access whole-event store independently of this view
64  auto inParentProxy = parent->impl()->findProxy( id, key, false );
65 
66  // Record parents that contain the data
67  if ( isValid( inParentProxy ) ) {
68 
69  // Warn if two different data objects conflict
70  if ( parentProxy && ( parentProxy->object() != inParentProxy->object() ) ) {
71  ATH_MSG_WARNING( "Parent view " << parent->name() << " contains conflicting data (" << inParentProxy->object() << ") vs " << parentProxy->object() << " found first" );
72  }
73 
74  // Retrive the first data found
75  if ( !parentProxy ) parentProxy = inParentProxy;
76 
77  // Make list of all parents returning data
78  validParents.push_back( parent );
79  }
80  }
81 
82  // Return results from parent view search
83  if ( parentProxy ) {
84 
85  // Warn if multiple parents returned result
86  if ( validParents.size() > 1 ) {
87 
88  std::string validNames = "";
89  for ( auto& parent : validParents ) validNames += parent->name() + " ";
90 
91  ATH_MSG_WARNING( "Key " << key << " in multiple parents (" << validParents.size() << "): " << validNames );
92  }
93  return parentProxy;
94  }
95 
96  // Look in the default store if cound not find in any view - for instance for event-wise IDCs
97  if ( (not isValid( localProxy )) and allowFallThrough ) {
98 
99  // Apply filtering
100  if ( m_fallFilter.size() ) {
101  bool filterPass = false;
102 
103  // Filter passes if the key contains one of the possible values
104  for ( auto& entry : m_fallFilter ) {
105  if ( key.find( entry ) != std::string::npos ) {
106  filterPass = true;
107  break;
108  }
109  }
110 
111  if ( !filterPass ) {
112  ATH_MSG_INFO( "Key " << key << " not found in filter for view " << m_name << ": returning 0" );
113  return nullptr;
114  }
115  }
116 
117  auto mainStoreProxy = m_store->proxy( id, key );
118  if ( mainStoreProxy ) {
119  ATH_MSG_INFO( "Key " << key << " fell through to main store from view " << m_name << ": returning " << mainStoreProxy );
120  m_fallList.insert( key );
121  }
122  return mainStoreProxy;
123  }
124  return nullptr;
125 }

◆ getParentLinks()

virtual const std::set< const SG::View* >& SimpleView::getParentLinks ( ) const
inlinevirtualinherited

returns the links to the previously used views

Definition at line 57 of file SimpleView.h.

58  { return m_parents; }

◆ getROI()

const ElementLink< TrigRoiDescriptorCollection > & SimpleView::getROI ( ) const
inherited

Definition at line 233 of file SimpleView.cxx.

233  {
234  return m_roi;
235 }

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40 {
42  m_lvl = m_imsg ?
43  static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
44  MSG::INFO;
45 }

◆ keyToString() [1/2]

const std::string * SimpleView::keyToString ( IStringPool::sgkey_t  key) const
virtualinherited

Definition at line 214 of file SimpleView.cxx.

215 {
216  throw std::runtime_error( "Not implemented: SimpleView::keyToString" );
217  return m_store->keyToString( key );
218 }

◆ keyToString() [2/2]

const std::string * SimpleView::keyToString ( IStringPool::sgkey_t  key,
CLID clid 
) const
virtualinherited

Definition at line 219 of file SimpleView.cxx.

220 {
221  throw std::runtime_error( "Not implemented: SimpleView::keyToString" );
222  return m_store->keyToString( key, clid );
223 }

◆ linkParent()

void DebugView::linkParent ( const IProxyDict parent)
virtual
See also
SimpleView::linkParent

Reimplemented from SimpleView.

Definition at line 24 of file DebugView.cxx.

24  {
25 
26  // Check the parent is a view
27  auto castParent = dynamic_cast< const SG::View* >( parent );
28  if ( castParent ) {
29 
30  // Check for uniqueness
31  auto result = m_parents.insert( castParent );
32  if ( std::get<1>( result ) ) {
33  ATH_MSG_INFO( "Adding parent view " << parent->name() << " to view " << name() << " with " << m_parents.size() - 1 << " existing parents" );
34  }
35  else {
36  ATH_MSG_WARNING( "Attempted to add duplicate parent " << parent->name() << " to view " << name() );
37  }
38  }
39  else {
40  ATH_MSG_ERROR( "Unable to link parent view that cannot be cast to SG::View" );
41  }
42 }

◆ msg() [1/2]

MsgStream & AthMessaging::msg ( ) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 164 of file AthMessaging.h.

165 {
166  MsgStream* ms = m_msg_tls.get();
167  if (!ms) {
168  if (!m_initialized.test_and_set()) initMessaging();
169  ms = new MsgStream(m_imsg,m_nm);
170  m_msg_tls.reset( ms );
171  }
172 
173  ms->setLevel (m_lvl);
174  return *ms;
175 }

◆ msg() [2/2]

MsgStream & AthMessaging::msg ( const MSG::Level  lvl) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 179 of file AthMessaging.h.

180 { return msg() << lvl; }

◆ msgLvl()

bool AthMessaging::msgLvl ( const MSG::Level  lvl) const
inlineinherited

Test the output level.

Parameters
lvlThe message level to test against
Returns
boolean Indicating if messages at given level will be printed
Return values
trueMessages at level "lvl" will be printed

Definition at line 151 of file AthMessaging.h.

152 {
153  if (!m_initialized.test_and_set()) initMessaging();
154  if (m_lvl <= lvl) {
155  msg() << lvl;
156  return true;
157  } else {
158  return false;
159  }
160 }

◆ name()

const std::string & SimpleView::name ( ) const
virtualinherited

Definition at line 204 of file SimpleView.cxx.

205 {
206  return m_name;
207 }

◆ proxies()

std::vector< const SG::DataProxy * > SimpleView::proxies ( ) const
virtualinherited

Return the list of all current proxies in store.

Definition at line 130 of file SimpleView.cxx.

131 {
132  return m_store->proxies();
133 }

◆ proxy() [1/2]

SG::DataProxy * DebugView::proxy ( const CLID id,
const std::string &  key 
) const
virtual
See also
SimpleView::proxy

Reimplemented from SimpleView.

Definition at line 45 of file DebugView.cxx.

46 {
47  return findProxy( id, key, m_allowFallThrough );
48 }

◆ proxy() [2/2]

SG::DataProxy * DebugView::proxy ( const void *const  pTransient) const
virtual

Get a proxy referencing a given transient object.

Parameters
pTransientThe object to find.

Returns 0 to flag failure

Reimplemented from SimpleView.

Definition at line 127 of file DebugView.cxx.

128 {
129  throw std::runtime_error( "Not implemented: SimpleView::proxy" );
130  return m_store->proxy( pTransient );
131 }

◆ proxy_exact()

SG::DataProxy * SimpleView::proxy_exact ( SG::sgkey_t  sgkey) const
virtualinherited

Get proxy given a hashed key+clid.

Parameters
sgkeyHashed key to look up.

Find an exact match; no handling of aliases, etc. Returns 0 to flag failure.

Definition at line 51 of file SimpleView.cxx.

52 {
53  return nullptr;
54 }

◆ recordObject()

SG::DataProxy * DebugView::recordObject ( SG::DataObjectSharedPtr< DataObject >  obj,
const std::string &  key,
bool  allowMods,
bool  returnExisting 
)
virtual
See also
SimpleView::recordObject

Reimplemented from SimpleView.

Definition at line 133 of file DebugView.cxx.

134 {
135  // Warn if fallthrough already happened for the object
136  if ( m_fallList.find( key ) != m_fallList.end() ) {
137  ATH_MSG_WARNING( "Key " << key << " was recorded to view " << m_name << " but was previously retrieved via fallthrough" );
138  }
139 
140  return m_store->recordObject( obj, viewKey(key), allowMods, returnExisting );
141 }

◆ registerKey()

void SimpleView::registerKey ( IStringPool::sgkey_t  key,
const std::string &  str,
CLID  clid 
)
virtualinherited

Definition at line 224 of file SimpleView.cxx.

225 {
226  m_store->registerKey( key, viewKey(str), clid );
227 }

◆ setFilter()

void SimpleView::setFilter ( std::vector< std::string > const inputFilter)
inlineinherited

Set a filtering rule for anything loaded via fallthrough.

Definition at line 63 of file SimpleView.h.

64  { m_fallFilter = inputFilter; }

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level  lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29 {
30  m_lvl = lvl;
31 }

◆ setROI()

void SimpleView::setROI ( const ElementLink< TrigRoiDescriptorCollection > &  roi)
inherited

Definition at line 229 of file SimpleView.cxx.

229  {
230  m_roi = roi;
231 }

◆ stringToKey()

IStringPool::sgkey_t SimpleView::stringToKey ( const std::string &  str,
CLID  clid 
)
virtualinherited

Definition at line 210 of file SimpleView.cxx.

211 {
212  return m_store->stringToKey( viewKey(str), clid );
213 }

◆ tryELRemap()

bool SimpleView::tryELRemap ( sgkey_t  sgkey_in,
size_t  index_in,
sgkey_t &  sgkey_out,
size_t &  index_out 
)
virtualinherited

Test to see if the target of an ElementLink has moved.

Parameters
sgkey_inOriginal hashed key of the EL.
index_inOriginal index of the EL.
sgkey_out[out]New hashed key for the EL.
index_out[out]New index for the EL.
Returns
True if there is a remapping; false otherwise.

The default implementation here always returns false.

Definition at line 162 of file SimpleView.cxx.

163 {
164  throw std::runtime_error( "Not implemented: SimpleView::tryELRemap" );
165  return m_store->tryELRemap( sgkey_in, index_in, sgkey_out, index_out );
166 }

◆ unboundHandle()

void SimpleView::unboundHandle ( IResetable handle)
virtualinherited

Tell the store that a handle has been unbound from a proxy.

Parameters
handleThe handle that was unbound. The default implementation does nothing.

Definition at line 199 of file SimpleView.cxx.

200 {
201  return m_store->unboundHandle( handle );
202 }

◆ viewKey()

std::string SimpleView::viewKey ( const std::string &  key) const
inherited

Construct a key as used in the parent store.

key The key as used in the view.

Definition at line 27 of file SimpleView.cxx.

28 {
29  return SG::transientKey (m_name + "_" + key);
30 }

Member Data Documentation

◆ ATLAS_THREAD_SAFE

tbb::concurrent_unordered_set< std::string > m_fallList DebugView::ATLAS_THREAD_SAFE
mutableprotected

Definition at line 65 of file DebugView.h.

◆ m_allowFallThrough

bool SimpleView::m_allowFallThrough
protectedinherited

Definition at line 197 of file SimpleView.h.

◆ m_fallFilter

std::vector< std::string > SimpleView::m_fallFilter
protectedinherited

Definition at line 196 of file SimpleView.h.

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels)

Definition at line 132 of file AthMessaging.h.

◆ m_name

std::string SimpleView::m_name
protectedinherited

Definition at line 194 of file SimpleView.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_parents

std::set< const SG::View* > SimpleView::m_parents
protectedinherited

Definition at line 195 of file SimpleView.h.

◆ m_roi

ElementLink<TrigRoiDescriptorCollection> SimpleView::m_roi
protectedinherited

Definition at line 193 of file SimpleView.h.

◆ m_store

ServiceHandle< StoreGateSvc > SimpleView::m_store
protectedinherited

Definition at line 190 of file SimpleView.h.


The documentation for this class was generated from the following files:
AthMessaging::m_lvl
std::atomic< MSG::Level > m_lvl
Current logging level.
Definition: AthMessaging.h:138
TileDCSDataPlotter.dp
dp
Definition: TileDCSDataPlotter.py:840
SimpleView::m_fallFilter
std::vector< std::string > m_fallFilter
Definition: SimpleView.h:196
get_generator_info.result
result
Definition: get_generator_info.py:21
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SimpleView::m_allowFallThrough
bool m_allowFallThrough
Definition: SimpleView.h:197
SimpleView::m_name
std::string m_name
Definition: SimpleView.h:194
isValid
bool isValid(const T &p)
Definition: AtlasPID.h:225
AthMessaging::m_imsg
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
Definition: AthMessaging.h:135
python.SystemOfUnits.ms
int ms
Definition: SystemOfUnits.py:132
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
SimpleView::m_parents
std::set< const SG::View * > m_parents
Definition: SimpleView.h:195
AthMessaging::AthMessaging
AthMessaging()
Default constructor:
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
TrigConf::MSGTC::Level
Level
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStream.h:21
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
geometry_dat_to_json.indent
indent
Definition: geometry_dat_to_json.py:36
SimpleView::proxies
virtual std::vector< const SG::DataProxy * > proxies() const
Return the list of all current proxies in store.
Definition: SimpleView.cxx:130
SimpleView::proxy
virtual SG::DataProxy * proxy(const CLID &id, const std::string &key) const
Get proxy with given id and key.
Definition: SimpleView.cxx:70
test_pyathena.parent
parent
Definition: test_pyathena.py:15
AthMessaging::msg
MsgStream & msg() const
The standard message stream.
Definition: AthMessaging.h:164
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
SimpleView::viewKey
std::string viewKey(const std::string &key) const
Construct a key as used in the parent store.
Definition: SimpleView.cxx:27
SimpleView::name
virtual const std::string & name() const
Definition: SimpleView.cxx:204
Name
JetDumper::Name Name
Definition: JetDumper.cxx:19
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
AthMessaging::m_nm
std::string m_nm
Message source name.
Definition: AthMessaging.h:129
SimpleView::SimpleView
SimpleView()=delete
SG::transientKey
std::string transientKey(const std::string &key)
Make a key transient.
Definition: transientKey.h:51
str
Definition: BTagTrackIpAccessor.cxx:11
SimpleView::m_roi
ElementLink< TrigRoiDescriptorCollection > m_roi
Definition: SimpleView.h:193
AthMessaging::initMessaging
void initMessaging() const
Initialize our message level and MessageSvc.
Definition: AthMessaging.cxx:39
AthMessaging::m_msg_tls
boost::thread_specific_ptr< MsgStream > m_msg_tls
MsgStream instance (a std::cout like with print-out levels)
Definition: AthMessaging.h:132
SG::View
Definition: View.h:25
python.PyAthena.obj
obj
Definition: PyAthena.py:132
SG::DataProxy
Definition: DataProxy.h:44
DebugView::findProxy
virtual SG::DataProxy * findProxy(const CLID &id, const std::string &key, const bool allowFallThrough) const
Definition: DebugView.cxx:50
SimpleView::m_store
ServiceHandle< StoreGateSvc > m_store
Definition: SimpleView.h:190
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37