diff --git a/nsprpub/pr/include/private/primpl.h b/nsprpub/pr/include/private/primpl.h index 424d0f1e36d..826dc716279 100644 --- a/nsprpub/pr/include/private/primpl.h +++ b/nsprpub/pr/include/private/primpl.h @@ -1735,6 +1735,7 @@ extern void _PR_InitMW(void); extern void _PR_InitRWLocks(void); extern void _PR_NotifyCondVar(PRCondVar *cvar, PRThread *me); extern void _PR_CleanupThread(PRThread *thread); +extern void _PR_CleanupLayerCache(void); extern void _PR_CleanupStacks(void); extern void _PR_CleanupThreads(void); extern void _PR_CleanupTPD(void); diff --git a/nsprpub/pr/src/io/prlayer.c b/nsprpub/pr/src/io/prlayer.c index 8cb5cda6a30..d74fa8be4b4 100644 --- a/nsprpub/pr/src/io/prlayer.c +++ b/nsprpub/pr/src/io/prlayer.c @@ -743,4 +743,23 @@ void _PR_InitLayerCache() PR_ASSERT(NULL != identity_cache.ml); } /* _PR_InitLayerCache */ +void _PR_CleanupLayerCache(void) +{ + if (identity_cache.ml) + { + PR_DestroyLock(identity_cache.ml); + identity_cache.ml = NULL; + } + + if (identity_cache.name) + { + PRDescIdentity ident; + + for (ident = 0; ident <= identity_cache.ident; ident++) + PR_DELETE(identity_cache.name[ident]); + + PR_DELETE(identity_cache.name); + } +} /* _PR_CleanupLayerCache */ + /* prlayer.c */ diff --git a/nsprpub/pr/src/misc/prinit.c b/nsprpub/pr/src/misc/prinit.c index bfa59fa018e..b9a4b07a4f5 100644 --- a/nsprpub/pr/src/misc/prinit.c +++ b/nsprpub/pr/src/misc/prinit.c @@ -447,6 +447,7 @@ PR_IMPLEMENT(PRStatus) PR_Cleanup() * _PR_XXXCleanup() that we can call here. */ _PR_CleanupThreads(); + _PR_CleanupLayerCache(); _PR_CleanupStacks(); _PR_CleanupBeforeExit(); _pr_initialized = PR_FALSE; diff --git a/nsprpub/pr/src/pthreads/ptthread.c b/nsprpub/pr/src/pthreads/ptthread.c index c573fe3f73d..3ae5feeeae0 100644 --- a/nsprpub/pr/src/pthreads/ptthread.c +++ b/nsprpub/pr/src/pthreads/ptthread.c @@ -936,6 +936,7 @@ PR_IMPLEMENT(PRStatus) PR_Cleanup() PR_DestroyLock(pt_book.ml); pt_book.ml = NULL; } _pt_thread_death(me); + _PR_CleanupLayerCache(); _pr_initialized = PR_FALSE; return PR_SUCCESS; }