XMLObjectCache::~XMLObjectCache()
{
	try
	{
		// Note: You can remove the following 6 lines of code if you have you have 
		// a situation that leaves an invalid object reference in the cash.  Free'ing this
		// memory is non-essential because the process is ending if we are executing this code.
		// Therefore, any memory access exceptions on those references can be safely ignored.
		dumpCache();
		dumpStateCache();
		dumpForeignCache();
		delete m_cache;
		delete m_cacheState;
		delete m_cacheForeign;
	}
	catch (...)
	{
		// continue normal processing after the first chance exception of an Access Violation
	}

	delete m_cacheForeignAlternate;
	delete m_cacheData;
	m_cache = 0;
	m_cacheState = 0;
	m_cacheForeign = 0;
//	gthread_mutex_destroy(&m_cs);
	XML_DESTROY_MUTEX(&m_cs);

	gthread_mutex_destroy(&m_csState);
	gthread_mutex_destroy(&m_csForeign);
	gthread_mutex_destroy(&m_csData);
	
#ifdef _WIN32
	_gthread_processTerminate();
#endif
}
	~InterfaceController()
	{
		gthread_mutex_destroy(&m_condLock);
		gthread_mutex_destroy(&m_lock);
		gthread_cond_destroy(&m_cond);
	}
	~CLanguageDriverInterfaceCache()
	{
		gthread_mutex_destroy(&m_lock);
	}