[commit] r1893 - in trunk/GME: GMEActiveBrowser Gme Mga
GMESRC Repository Notifications
gme-commit at list.isis.vanderbilt.edu
Tue Apr 17 16:36:07 CDT 2012
Author: ksmyth
Date: Tue Apr 17 16:36:07 2012
New Revision: 1893
Log:
GME-218: Support _ATL_DEBUG_INTERFACES in Mga
Modified:
trunk/GME/GMEActiveBrowser/MgaMap.cpp
trunk/GME/Gme/GMEApp.cpp
trunk/GME/Mga/MgaFCO.cpp
trunk/GME/Mga/MgaFCO.h
trunk/GME/Mga/MgaFolder.cpp
trunk/GME/Mga/MgaLibOps.cpp
trunk/GME/Mga/MgaLibRefr.cpp
trunk/GME/Mga/MgaLibRefr.h
trunk/GME/Mga/MgaModel.cpp
trunk/GME/Mga/MgaProject.cpp
trunk/GME/Mga/MgaSet.cpp
trunk/GME/Mga/StdAfx.h
Modified: trunk/GME/GMEActiveBrowser/MgaMap.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/MgaMap.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/GMEActiveBrowser/MgaMap.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -68,13 +68,7 @@
// Retreives the corresponding TreeItem handle from an Object Proxy
BOOL CMgaMap::LookupTreeItem(CMgaObjectProxy MgaObjectProxy, HTREEITEM &hTreeItem)
{
- CMgaObjectProxyMapItem* pMgaObjectProxyMapItem;
-
- BOOL bResult=m_MapObject2Item.Lookup(MgaObjectProxy.m_pMgaObject,pMgaObjectProxyMapItem);
-
- if(bResult) hTreeItem=pMgaObjectProxyMapItem->m_hTreeItem;
-
- return bResult;
+ return LookupTreeItem(MgaObjectProxy.m_pMgaObject, hTreeItem);
}
@@ -129,7 +123,9 @@
{
CMgaObjectProxyMapItem* pObjectProxyMapItem;
- if(!m_MapObject2Item.Lookup(MgaObjectProxy.m_pMgaObject,pObjectProxyMapItem))
+ CComPtr<IUnknown> pUnk;
+ MgaObjectProxy.m_pMgaObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
+ if(!m_MapObject2Item.Lookup(pUnk, pObjectProxyMapItem))
{
return FALSE;
}
@@ -154,10 +150,12 @@
// the value belonging to the already existing key
// resulting an inconsistency with the other map.
RemoveTreeItem(hTreeItem);
- RemoveObjectProxy(MgaObjectProxy);
+ RemoveObjectProxy(MgaObjectProxy);
// Increase reference counter for this map
- MgaObjectProxy.m_pMgaObject->AddRef();
+ IUnknown* pUnk = MgaObjectProxy.m_pMgaObject;
+ MgaObjectProxy.m_pMgaObject = NULL;
+ pUnk->QueryInterface(IID_IUnknown, (void**)&MgaObjectProxy.m_pMgaObject);
m_MapItem2Object.SetAt(hTreeItem,MgaObjectProxy.m_pMgaObject);
@@ -212,11 +210,14 @@
BOOL CMgaMap::LookupTreeItem(LPUNKNOWN pUnknown, HTREEITEM &hTreeItem)
{
+ CComPtr<IUnknown> pUnk;
+ pUnknown->QueryInterface(IID_IUnknown, (void**)&pUnk);
CMgaObjectProxyMapItem* pMgaObjectProxyMapItem;
- BOOL bResult=m_MapObject2Item.Lookup(pUnknown,pMgaObjectProxyMapItem);
+ BOOL bResult=m_MapObject2Item.Lookup(pUnk,pMgaObjectProxyMapItem);
- if(bResult) hTreeItem=pMgaObjectProxyMapItem->m_hTreeItem;
+ if (bResult)
+ hTreeItem=pMgaObjectProxyMapItem->m_hTreeItem;
return bResult;
}
@@ -225,8 +226,11 @@
BOOL CMgaMap::bIsInMap(LPUNKNOWN pUnknown)
{
+ CComPtr<IUnknown> pUnk;
+ pUnknown->QueryInterface(IID_IUnknown, (void**)&pUnk);
+
CMgaObjectProxyMapItem* pMgaObjectProxyMapItem;
- return m_MapObject2Item.Lookup(pUnknown,pMgaObjectProxyMapItem);
+ return m_MapObject2Item.Lookup(pUnk,pMgaObjectProxyMapItem);
}
BOOL CMgaMap::bIsInMap(HTREEITEM hTreeItem)
Modified: trunk/GME/Gme/GMEApp.cpp
==============================================================================
--- trunk/GME/Gme/GMEApp.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Gme/GMEApp.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -1915,6 +1915,21 @@
{
CGMEEventLogger::LogGMEEvent(_T("CGMEApp::OnFileCloseproject\r\n"));
SaveAllModified();
+#ifdef _DEBUG
+ //CoFreeUnusedLibraries();
+ HMODULE mga = GetModuleHandle(L"Mga.dll");
+ if (mga)
+ {
+ typedef HRESULT (__stdcall *DllCanUnloadNow)(void);
+ DllCanUnloadNow proc = (DllCanUnloadNow)GetProcAddress(mga, "DllCanUnloadNow");
+ if (proc && (*proc)() != S_OK)
+ {
+ DebugBreak();
+ // If Mga.dll is compiled with /D_ATL_DEBUG_INTERFACES, this will dump the leaks via OutputDebugString (then crash later)
+ FreeLibrary(mga);
+ }
+ }
+#endif
}
Modified: trunk/GME/Mga/MgaFCO.cpp
==============================================================================
--- trunk/GME/Mga/MgaFCO.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaFCO.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -30,7 +30,15 @@
}
CComPtr<ICoreProject> cp;
COMTHROW(self->get_Project(&cp));
+#ifdef _ATL_DEBUG_INTERFACES
+ CComPtr<IMgaProject> proj;
+ COMTHROW(cp->QueryInterface(IID_IMgaProject,(void **)&proj));
+ IUnknown* pUnk = ((ATL::_QIThunk *)(proj.p))->m_pUnk;
+ pUnk->AddRef();
+ mgaproject.Attach((CMgaProject*)(IDispatchImpl<IMgaProject, &IID_IMgaProject, &LIBID_MGALib>*)(pUnk));
+#else
COMTHROW(cp->QueryInterface(IID_IMgaProject,(void **)&mgaproject));
+#endif
} COMCATCH(;);
}
@@ -953,7 +961,8 @@
// send message to all territories that contain parent,
CoreObj parent = self[ATTRID_PARENT];
if(parent.IsContainer()) {
- FCO &p = *ObjForCore(parent);
+ auto objforcore = ObjForCore(parent);
+ FCO &p = *objforcore;
// if parent is also new, notify it first
if(p.notifymask & OBJEVENT_CREATED) COMTHROW(p.objnotify());
@@ -1024,7 +1033,8 @@
// send message to all territories that contain parent,
CoreObj parent = self[ATTRID_PARENT];
if(parent.IsContainer()) {
- FCO &p = *ObjForCore(parent);
+ auto objforcore = ObjForCore(parent);
+ FCO &p = *objforcore;
// if parent is also new, notify it first
if(p.notifymask & OBJEVENT_CREATED) COMTHROW(p.objnotify());
Modified: trunk/GME/Mga/MgaFCO.h
==============================================================================
--- trunk/GME/Mga/MgaFCO.h Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaFCO.h Tue Apr 17 16:36:07 2012 (r1893)
@@ -21,7 +21,11 @@
class ATL_NO_VTABLE IMgaFCOImpl : public T1, public T2 {
protected:
friend class FCO;
+#ifdef _ATL_DEBUG_INTERFACES
+ friend CComPtr<FCO> ObjFor(IMgaObject *s);
+#else
friend FCO *ObjFor(IMgaObject *s);
+#endif
DEFSIG;
#ifdef DEBUG
// in DEBUG, inFCO is transformed to a macro, which checks territory compatibility
@@ -656,14 +660,31 @@
+#ifdef _ATL_DEBUG_INTERFACES
+inline FCOPtr ObjForCore(ICoreObject *s) {
+#else
inline FCO *ObjForCore(ICoreObject *s) {
+#endif
CComQIPtr<IMgaO> p = s;
if(!p) COMTHROW(E_MGA_MODULE_INCOMPATIBILITY);
+#ifdef _ATL_DEBUG_INTERFACES
+ IUnknown* pUnk = ((ATL::_QIThunk *)(p.p))->m_pUnk;
+ return (FCO*)((ATL::CComContainedObject<FCO>*)pUnk);
+#else
return (FCO *)(p.p);
+#endif
+}
+
+#ifdef _ATL_DEBUG_INTERFACES
+inline CComPtr<FCO> ObjFor(IMgaObject *s) {
+ IUnknown* pUnk = ((ATL::_QIThunk *)(s))->m_pUnk;
+ return ((CMgaAtom*)pUnk)->innFCO;
}
+#else
inline FCO *ObjFor(IMgaObject *s) {
return (static_cast<CMgaAtom *>(s)->innFCO);
}
+#endif
void CoreObjMark(CoreObj const &o, long mask);
Modified: trunk/GME/Mga/MgaFolder.cpp
==============================================================================
--- trunk/GME/Mga/MgaFolder.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaFolder.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -35,7 +35,7 @@
metaref_type mr;
COMTHROW(meta->get_MetaRef(&mr));
subfolder[ATTRID_META]=mr;
- FCO *nff = ObjForCore(subfolder);
+ auto nff = ObjForCore(subfolder);
nff->initialname();
COMTHROW(nff->Check());
nff->SelfMark(OBJEVENT_CREATED);
@@ -323,7 +323,7 @@
if(self[ATTRID_PERMISSIONS] & LIBROOT_FLAG) COMTHROW(E_MGA_NOT_CHANGEABLE);
CoreObj newobj;
COMTHROW(ContainerCreateFCO(meta, newobj));
- FCO *nfco = ObjForCore(newobj);
+ auto nfco = ObjForCore(newobj);
nfco->initialname();
COMTHROW(nfco->Check());
nfco->SelfMark(OBJEVENT_CREATED);
Modified: trunk/GME/Mga/MgaLibOps.cpp
==============================================================================
--- trunk/GME/Mga/MgaLibOps.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaLibOps.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -945,7 +945,7 @@
#ifdef _DEBUG
CComBSTR nm;
try {
- FCO *f = ObjForCore(cur);
+ auto f = ObjForCore(cur);
if( f)
f->get_Name( &nm);
} catch( hresult_exception& ) {
@@ -1199,7 +1199,7 @@
COMTHROW(p_log.Append( "<br>External library in attachment:"));
//p_log.Append( "<br>External library being attached");
//p_log.Append( "<br>External library:");
- FCO* it_lib( ObjForCore( *it));
+ auto it_lib = ObjForCore( *it);
CComBSTR nm, id, gd;
if( it_lib)
{
@@ -1225,7 +1225,7 @@
COMTHROW(p_log.Append( "<br>Hosted library already present:"));
//p_log.Append( "<br>A hosted library:");
- FCO* jt_lib( ObjForCore( *jt));
+ auto jt_lib = ObjForCore( *jt);
CComBSTR nm, id, gd;
if( jt_lib)
{
@@ -1267,7 +1267,7 @@
try {
CComBSTR nm, id;
nm = (iiit->second)[ATTRID_NAME];
- FCO* lib = ObjForCore( iiit->second);
+ auto lib = ObjForCore(iiit->second);
if( lib)
COMTHROW(lib->get_ID( &id));
@@ -1291,7 +1291,7 @@
for( Typedefs::LIBVEC_ITER it = p_superfluousLibs.begin(), en = p_superfluousLibs.end(); it != en; ++it)
{
try {
- FCO* lib = ObjForCore(*it);
+ auto lib = ObjForCore(*it);
if( lib) lib->inDeleteObject();
else throw hresult_exception( -1);
}
@@ -1301,7 +1301,7 @@
try {
CComBSTR nm, id;
nm = (*it)[ATTRID_NAME];
- FCO* lib = ObjForCore( *it);
+ auto lib = ObjForCore(*it);
if( lib) lib->get_ID( &id);
COMTHROW(msg.AppendBSTR( nm));
Modified: trunk/GME/Mga/MgaLibRefr.cpp
==============================================================================
--- trunk/GME/Mga/MgaLibRefr.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaLibRefr.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -331,7 +331,7 @@
void RefreshManager::collectMixedConns( CoreObj& one_fco)
{
- FCO * obj = ObjForCore(one_fco);
+ auto obj = ObjForCore(one_fco);
if( obj)
{
CComPtr<IMgaConnPoints> cps1;
@@ -417,7 +417,7 @@
, const CoreObj& p_base, const CoreObj& p_derd)
{
CComPtr<IMgaFCO> fco;
- FCO * c = ObjForCore( p_coreConn);
+ auto c = ObjForCore( p_coreConn);
if( c) c->getinterface( &fco);
CComQIPtr<IMgaConnection> conn( fco);
@@ -2866,7 +2866,7 @@
//
void RefreshManager::collectDersFromLib( CoreObj& one_fco)
{
- FCO * obj = ObjForCore(one_fco);
+ auto obj = ObjForCore(one_fco);
if( obj)
{
elem_struct elem_self;
@@ -2968,7 +2968,7 @@
void RefreshManager::collectRefsToLib( CoreObj& one_fco)
{
- FCO * obj = ObjForCore(one_fco);
+ auto obj = ObjForCore(one_fco);
if( obj)
{
short dist_self = distance( one_fco); // the distance to the archetype of target (one_fco)
@@ -3061,7 +3061,7 @@
// thus when one_fco is destroyed it won't be followed by them
void RefreshManager::cutDersFromLib( CoreObj& one_fco)
{
- FCO * obj = ObjForCore(one_fco);
+ auto obj = ObjForCore(one_fco);
if( obj)
{
CComPtr<IMgaFCOs> subs;
@@ -3290,12 +3290,12 @@
COMTHROW( p_metar->get_Kind( &meta));
CoreObj a_self( p_parent);
- FCO* parent( ObjForCore( a_self));
+ auto parent = ObjForCore(a_self);
COMTHROW( parent->ContainerCreateFCO( meta, nobj));
nobj[ATTRID_ROLEMETA]=rr;
- FCO *nfco = ObjForCore(nobj);
+ auto nfco = ObjForCore(nobj);
nfco->initialname();
setcheck( p_mgaProject, nobj, CHK_NEW);
@@ -3369,7 +3369,7 @@
peers[pos] = NULLCOREOBJ;
CoreObj a_self( p_conn);
- FCO* this_conn( ObjForCore( a_self));
+ auto this_conn( ObjForCore( a_self));
AddConnPTask( p_maxinrole, p_rolename).DoWithDeriveds( a_self, &peers);
CMgaConnPoint::GetConnPoint( this_conn, peers[pos], pVal);
Modified: trunk/GME/Mga/MgaLibRefr.h
==============================================================================
--- trunk/GME/Mga/MgaLibRefr.h Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaLibRefr.h Tue Apr 17 16:36:07 2012 (r1893)
@@ -191,6 +191,12 @@
COMTHROW(Append( L"NullObject"));
}
+ template<>
+ void appendLink<FCOPtr>( const FCOPtr& ptr)
+ {
+ appendLink(static_cast<FCO*>(ptr));
+ }
+
void appendLink( const CComBSTR& id, const CComBSTR& nm = L"NonameObject")
{
COMTHROW(Append(L"<A HREF=\"mga:"));
@@ -604,7 +610,7 @@
metaid_type mtyp = ITER.GetMetaID();
if( mtyp == DTID_FOLDER)
{
- FCO* kid = ObjForCore( ITER);
+ auto kid = ObjForCore( ITER);
if( !kid) continue;
CComBSTR id;
Modified: trunk/GME/Mga/MgaModel.cpp
==============================================================================
--- trunk/GME/Mga/MgaModel.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaModel.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -23,7 +23,7 @@
COMTHROW(ContainerCreateFCO(meta, nobj));
nobj[ATTRID_ROLEMETA]=rr;
- FCO *nfco = ObjForCore(nobj);
+ auto nfco = ObjForCore(nobj);
nfco->initialname();
setcheck(mgaproject, nobj, CHK_NEW);
Modified: trunk/GME/Mga/MgaProject.cpp
==============================================================================
--- trunk/GME/Mga/MgaProject.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaProject.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -1956,7 +1956,7 @@
long perm = ITER[ATTRID_PERMISSIONS];
if( perm & LIBROOT_FLAG)
{
- FCO *lib = ObjForCore( ITER);
+ auto lib = ObjForCore(ITER);
if( lib)
{
CComBSTR gd;
Modified: trunk/GME/Mga/MgaSet.cpp
==============================================================================
--- trunk/GME/Mga/MgaSet.cpp Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/MgaSet.cpp Tue Apr 17 16:36:07 2012 (r1893)
@@ -42,7 +42,7 @@
bool addmember::Do(CoreObj self, std::vector<CoreObj> *peers) {
CoreObjs members = self[ATTRID_SETMEMBER + ATTRID_COLLECTION];
- FCO *fco = ObjForCore(self);
+ auto fco = ObjForCore(self);
ITERATE_THROUGH(members) {
if(COM_EQUAL((*peers)[0], CoreObj(ITER[ATTRID_XREF]))) { // Already there !!!
ASSERT(!CoreObj(ITER[ATTRID_MASTEROBJ]));
Modified: trunk/GME/Mga/StdAfx.h
==============================================================================
--- trunk/GME/Mga/StdAfx.h Tue Apr 17 16:35:42 2012 (r1892)
+++ trunk/GME/Mga/StdAfx.h Tue Apr 17 16:36:07 2012 (r1893)
@@ -8,6 +8,10 @@
#pragma once
+//#define _ATL_DEBUG_INTERFACES
+// If you find a leak, put this in DllMain to DebugBreak on every AddRef/Release on that interface pointer
+// _AtlDebugInterfacesModule.m_nIndexBreakAt = 42;
+
#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif
More information about the gme-commit
mailing list