[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