Fixed reference counting of singleton image manager

This commit is contained in:
troy%netscape.com 1998-08-03 21:05:36 +00:00
parent 7f7ecd4daf
commit e267a36505
2 changed files with 22 additions and 17 deletions

View File

@ -77,8 +77,8 @@ private:
ImageGroupImpl::ImageGroupImpl(nsIImageManager *aManager)
{
NS_INIT_REFCNT();
// XXX: The caller has already called AddRef() on aManager...
mManager = aManager;
NS_ADDREF(mManager);
}
ImageGroupImpl::~ImageGroupImpl()
@ -242,6 +242,7 @@ NS_NewImageGroup(nsIImageGroup **aInstancePtrResult)
if (group == nsnull) {
return NS_ERROR_OUT_OF_MEMORY;
}
NS_RELEASE(manager);
return group->QueryInterface(kIImageGroupIID, (void **) aInstancePtrResult);
}

View File

@ -26,8 +26,6 @@ static NS_DEFINE_IID(kIImageManagerIID, NS_IIMAGEMANAGER_IID);
class ImageManagerImpl : public nsIImageManager {
public:
static ImageManagerImpl *sTheImageManager;
ImageManagerImpl();
~ImageManagerImpl();
@ -50,8 +48,6 @@ private:
ilISystemServices *mSS;
};
ImageManagerImpl* ImageManagerImpl::sTheImageManager = nsnull;
ImageManagerImpl::ImageManagerImpl()
{
NS_NewImageSystemServices(&mSS);
@ -116,6 +112,24 @@ ImageManagerImpl::GetImageType(const char *buf, PRInt32 length)
}
}
// The singleton image manager
static ImageManagerImpl* gImageManager;
// Class to manage construction and destruction of the singleton
// image manager
struct ImageManagerInit {
ImageManagerInit() {
gImageManager = new ImageManagerImpl();
NS_ADDREF(gImageManager);
}
~ImageManagerInit() {
NS_RELEASE(gImageManager);
}
};
static ImageManagerInit imageManagerInit;
extern "C" NS_GFX_(nsresult)
NS_NewImageManager(nsIImageManager **aInstancePtrResult)
{
@ -124,16 +138,6 @@ NS_NewImageManager(nsIImageManager **aInstancePtrResult)
return NS_ERROR_NULL_POINTER;
}
if (ImageManagerImpl::sTheImageManager == nsnull) {
ImageManagerImpl::sTheImageManager = new ImageManagerImpl();
// XXX: This will prevent the ImageManager from being deleted :-(
NS_IF_ADDREF(ImageManagerImpl::sTheImageManager);
}
if (ImageManagerImpl::sTheImageManager == nsnull) {
return NS_ERROR_OUT_OF_MEMORY;
}
return ImageManagerImpl::sTheImageManager->QueryInterface(kIImageManagerIID,
(void **) aInstancePtrResult);
NS_ASSERTION(nsnull != gImageManager, "no image manager");
return gImageManager->QueryInterface(kIImageManagerIID, (void **)aInstancePtrResult);
}