Bug 325229 part 2 - Stub out the old exitroutine functions which are fatally flawed, r=darin

This commit is contained in:
benjamin%smedbergs.us 2006-02-13 16:08:55 +00:00
Родитель 5e55605551
Коммит 10ed2f1d36
4 изменённых файлов: 21 добавлений и 106 удалений

Просмотреть файл

@ -39,12 +39,6 @@
#ifndef nsXPComPrivate_h__ #ifndef nsXPComPrivate_h__
#define nsXPComPrivate_h__ #define nsXPComPrivate_h__
// Map frozen functions to private symbol names if not using strict API.
#ifdef MOZILLA_INTERNAL_API
# define NS_RegisterXPCOMExitRoutine NS_RegisterXPCOMExitRoutine_P
# define NS_UnregisterXPCOMExitRoutine NS_UnregisterXPCOMExitRoutine_P
#endif
#include "nscore.h" #include "nscore.h"
#include "nsXPCOM.h" #include "nsXPCOM.h"
#include "nsStringAPI.h" #include "nsStringAPI.h"
@ -65,36 +59,6 @@ class nsIComponentLoader;
*/ */
#define NS_XPCOM_SHUTDOWN_LOADERS_OBSERVER_ID "xpcom-shutdown-loaders" #define NS_XPCOM_SHUTDOWN_LOADERS_OBSERVER_ID "xpcom-shutdown-loaders"
/**
* Private Method to register an exit routine. This method
* allows you to setup a callback that will be called from
* the NS_ShutdownXPCOM function after all services and
* components have gone away.
*
* This API is for the exclusive use of the xpcom glue library.
*
* Note that these APIs are NOT threadsafe and must be called on the
* main thread.
*
* @status FROZEN
* @param exitRoutine pointer to user defined callback function
* of type XPCOMExitRoutine.
* @param priority higher priorities are called before lower
* priorities.
*
* @return NS_OK for success;
* other error codes indicate a failure.
*
*/
typedef NS_CALLBACK(XPCOMExitRoutine)(void);
XPCOM_API(nsresult)
NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority);
XPCOM_API(nsresult)
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine);
// PUBLIC // PUBLIC
typedef nsresult (* InitFunc)(nsIServiceManager* *result, nsIFile* binDirectory, nsIDirectoryServiceProvider* appFileLocationProvider); typedef nsresult (* InitFunc)(nsIServiceManager* *result, nsIFile* binDirectory, nsIDirectoryServiceProvider* appFileLocationProvider);
typedef nsresult (* Init3Func)(nsIServiceManager* *result, nsIFile* binDirectory, nsIDirectoryServiceProvider* appFileLocationProvider, nsStaticModuleInfo const *staticComponents, PRUint32 componentCount); typedef nsresult (* Init3Func)(nsIServiceManager* *result, nsIFile* binDirectory, nsIDirectoryServiceProvider* appFileLocationProvider, nsStaticModuleInfo const *staticComponents, PRUint32 componentCount);
@ -146,7 +110,9 @@ typedef void (* LogReleaseFunc)(void*, nsrefcnt, const char*);
typedef void (* LogCtorFunc)(void*, const char*, PRUint32); typedef void (* LogCtorFunc)(void*, const char*, PRUint32);
typedef void (* LogCOMPtrFunc)(void*, nsISupports*); typedef void (* LogCOMPtrFunc)(void*, nsISupports*);
// PRIVATE // PRIVATE AND DEPRECATED
typedef NS_CALLBACK(XPCOMExitRoutine)(void);
typedef nsresult (* RegisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine, PRUint32 priority); typedef nsresult (* RegisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine, PRUint32 priority);
typedef nsresult (* UnregisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine); typedef nsresult (* UnregisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine);

Просмотреть файл

@ -627,51 +627,6 @@ NS_InitXPCOM3(nsIServiceManager* *result,
} }
static nsVoidArray* gExitRoutines;
static void CallExitRoutines()
{
if (!gExitRoutines)
return;
PRInt32 count = gExitRoutines->Count();
for (PRInt32 i = 0; i < count; i++) {
XPCOMExitRoutine func = (XPCOMExitRoutine) gExitRoutines->ElementAt(i);
func();
}
gExitRoutines->Clear();
delete gExitRoutines;
gExitRoutines = nsnull;
}
EXPORT_XPCOM_API(nsresult)
NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority)
{
// priority are not used right now. It will need to be implemented as more
// classes are moved into the glue library --dougt
if (!gExitRoutines) {
gExitRoutines = new nsVoidArray();
if (!gExitRoutines) {
NS_WARNING("Failed to allocate gExitRoutines");
return NS_ERROR_FAILURE;
}
}
PRBool okay = gExitRoutines->AppendElement((void*)exitRoutine);
return okay ? NS_OK : NS_ERROR_FAILURE;
}
EXPORT_XPCOM_API(nsresult)
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine)
{
if (!gExitRoutines)
return NS_ERROR_FAILURE;
PRBool okay = gExitRoutines->RemoveElement((void*)exitRoutine);
return okay ? NS_OK : NS_ERROR_FAILURE;
}
// //
// NS_ShutdownXPCOM() // NS_ShutdownXPCOM()
// //
@ -806,8 +761,6 @@ NS_ShutdownXPCOM(nsIServiceManager* servMgr)
// shutting down the component manager // shutting down the component manager
nsTimerImpl::Shutdown(); nsTimerImpl::Shutdown();
CallExitRoutines();
// Shutdown xpcom. This will release all loaders and cause others holding // Shutdown xpcom. This will release all loaders and cause others holding
// a refcount to the component manager to release it. // a refcount to the component manager to release it.
if (nsComponentManagerImpl::gComponentManager) { if (nsComponentManagerImpl::gComponentManager) {

Просмотреть файл

@ -206,22 +206,6 @@ NS_NewNativeLocalFile(const nsACString &path, PRBool followLinks, nsILocalFile*
return xpcomFunctions.newNativeLocalFile(path, followLinks, result); return xpcomFunctions.newNativeLocalFile(path, followLinks, result);
} }
XPCOM_API(nsresult)
NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority)
{
if (!xpcomFunctions.registerExitRoutine)
return NS_ERROR_NOT_INITIALIZED;
return xpcomFunctions.registerExitRoutine(exitRoutine, priority);
}
XPCOM_API(nsresult)
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine)
{
if (!xpcomFunctions.unregisterExitRoutine)
return NS_ERROR_NOT_INITIALIZED;
return xpcomFunctions.unregisterExitRoutine(exitRoutine);
}
XPCOM_API(nsresult) XPCOM_API(nsresult)
NS_GetDebug(nsIDebug* *result) NS_GetDebug(nsIDebug* *result)
{ {

Просмотреть файл

@ -41,6 +41,20 @@
#include <string.h> #include <string.h>
/**
* Private Method to register an exit routine. This method
* used to allow you to setup a callback that will be called from
* the NS_ShutdownXPCOM function after all services and
* components have gone away. It was fatally flawed in that the component
* DLL could be released before the exit function was called; it is now a
* stub implementation that does nothing.
*/
XPCOM_API(nsresult)
NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority);
XPCOM_API(nsresult)
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine);
static const XPCOMFunctions kFrozenFunctions = { static const XPCOMFunctions kFrozenFunctions = {
XPCOM_GLUE_VERSION, XPCOM_GLUE_VERSION,
sizeof(XPCOMFunctions), sizeof(XPCOMFunctions),
@ -52,8 +66,8 @@ static const XPCOMFunctions kFrozenFunctions = {
&NS_GetMemoryManager_P, &NS_GetMemoryManager_P,
&NS_NewLocalFile_P, &NS_NewLocalFile_P,
&NS_NewNativeLocalFile_P, &NS_NewNativeLocalFile_P,
&NS_RegisterXPCOMExitRoutine_P, &NS_RegisterXPCOMExitRoutine,
&NS_UnregisterXPCOMExitRoutine_P, &NS_UnregisterXPCOMExitRoutine,
// these functions were added post 1.4 // these functions were added post 1.4
&NS_GetDebug_P, &NS_GetDebug_P,
@ -302,18 +316,16 @@ NS_LogCOMPtrRelease(void *aCOMPtr, nsISupports* aObject)
* Stubs for nsXPCOMPrivate.h * Stubs for nsXPCOMPrivate.h
*/ */
#undef NS_RegisterXPCOMExitRoutine
EXPORT_XPCOM_API(nsresult) EXPORT_XPCOM_API(nsresult)
NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority) NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority)
{ {
return NS_RegisterXPCOMExitRoutine_P(exitRoutine, priority); return NS_OK;
} }
#undef NS_UnregisterXPCOMExitRoutine
EXPORT_XPCOM_API(nsresult) EXPORT_XPCOM_API(nsresult)
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine) NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine)
{ {
return NS_UnregisterXPCOMExitRoutine_P(exitRoutine); return NS_OK;
} }
/* /*