Bug 1229235 - Make RedirectChannelRegistrar thread-safe. r=jduell
authorHonza Bambas <honzab.moz@firemni.cz>
Fri, 04 Dec 2015 09:55:00 +0100
changeset 316131 24c79f3927989882518f2c218f9d8e3a43d4466f
parent 316130 9b7df7c7adc159676b893127d14ab9bc256a6a85
child 316132 401c10d24183485f5a88ecc5a57e607cd2834139
push id8516
push userjlund@mozilla.com
push dateFri, 18 Dec 2015 00:52:34 +0000
reviewersjduell
bugs1229235
milestone46.0a1
Bug 1229235 - Make RedirectChannelRegistrar thread-safe. r=jduell
netwerk/base/RedirectChannelRegistrar.cpp
netwerk/base/RedirectChannelRegistrar.h
--- a/netwerk/base/RedirectChannelRegistrar.cpp
+++ b/netwerk/base/RedirectChannelRegistrar.cpp
@@ -8,69 +8,80 @@ namespace mozilla {
 namespace net {
 
 NS_IMPL_ISUPPORTS(RedirectChannelRegistrar, nsIRedirectChannelRegistrar)
 
 RedirectChannelRegistrar::RedirectChannelRegistrar()
   : mRealChannels(32)
   , mParentChannels(32)
   , mId(1)
+  , mLock("RedirectChannelRegistrar")
 {
 }
 
 NS_IMETHODIMP
 RedirectChannelRegistrar::RegisterChannel(nsIChannel *channel,
                                           uint32_t *_retval)
 {
+  MutexAutoLock lock(mLock);
+
   mRealChannels.Put(mId, channel);
   *_retval = mId;
 
   ++mId;
 
   // Ensure we always provide positive ids
   if (!mId)
     mId = 1;
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 RedirectChannelRegistrar::GetRegisteredChannel(uint32_t id,
                                                nsIChannel **_retval)
 {
+  MutexAutoLock lock(mLock);
+
   if (!mRealChannels.Get(id, _retval))
     return NS_ERROR_NOT_AVAILABLE;
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 RedirectChannelRegistrar::LinkChannels(uint32_t id,
                                        nsIParentChannel *channel,
                                        nsIChannel** _retval)
 {
+  MutexAutoLock lock(mLock);
+
   if (!mRealChannels.Get(id, _retval))
     return NS_ERROR_NOT_AVAILABLE;
 
   mParentChannels.Put(id, channel);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 RedirectChannelRegistrar::GetParentChannel(uint32_t id,
                                            nsIParentChannel **_retval)
 {
+  MutexAutoLock lock(mLock);
+
   if (!mParentChannels.Get(id, _retval))
     return NS_ERROR_NOT_AVAILABLE;
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 RedirectChannelRegistrar::DeregisterChannels(uint32_t id)
 {
+  MutexAutoLock lock(mLock);
+
   mRealChannels.Remove(id);
   mParentChannels.Remove(id);
   return NS_OK;
 }
 
 } // namespace net
 } // namespace mozilla
--- a/netwerk/base/RedirectChannelRegistrar.h
+++ b/netwerk/base/RedirectChannelRegistrar.h
@@ -29,14 +29,15 @@ protected:
   typedef nsInterfaceHashtable<nsUint32HashKey, nsIChannel>
           ChannelHashtable;
   typedef nsInterfaceHashtable<nsUint32HashKey, nsIParentChannel>
           ParentChannelHashtable;
 
   ChannelHashtable mRealChannels;
   ParentChannelHashtable mParentChannels;
   uint32_t mId;
+  Mutex mLock;
 };
 
 } // namespace net
 } // namespace mozilla
 
 #endif