mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-21 09:49:14 +00:00
Fixed reference counting of singleton image manager
This commit is contained in:
parent
7f7ecd4daf
commit
e267a36505
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user