$OpenBSD$ index 6867c05..adc9cbf 100644 --- netwerk/protocol/http/nsHttpTransaction.cpp.orig Fri Feb 20 15:40:37 2015 +++ netwerk/protocol/http/nsHttpTransaction.cpp Fri Feb 20 15:40:37 2015 @@ -88,7 +88,7 @@ LogHeaders(const char *lineStart) //----------------------------------------------------------------------------- nsHttpTransaction::nsHttpTransaction() - : mCallbacksLock("transaction mCallbacks lock") + : mLock("transaction lock") , mRequestSize(0) , mConnection(nullptr) , mConnInfo(nullptr) @@ -378,12 +378,21 @@ nsHttpTransaction::Init(uint32_t caps, return NS_OK; } +// This method should only be used on the socket thread nsAHttpConnection * nsHttpTransaction::Connection() { return mConnection; } +already_AddRefed +nsHttpTransaction::GetConnectionReference() +{ + MutexAutoLock lock(mLock); + nsRefPtr connection = mConnection; + return connection.forget(); +} + nsHttpResponseHead * nsHttpTransaction::TakeResponseHead() { @@ -447,8 +456,11 @@ nsHttpTransaction::TakeSubTransactions( void nsHttpTransaction::SetConnection(nsAHttpConnection *conn) { - NS_IF_RELEASE(mConnection); - NS_IF_ADDREF(mConnection = conn); + { + MutexAutoLock lock(mLock); + NS_IF_RELEASE(mConnection); + NS_IF_ADDREF(mConnection = conn); + } if (conn) { MOZ_EVENT_TRACER_EXEC(static_cast(this), @@ -459,7 +471,7 @@ nsHttpTransaction::SetConnection(nsAHttpConnection *conn) void nsHttpTransaction::GetSecurityCallbacks(nsIInterfaceRequestor **cb) { - MutexAutoLock lock(mCallbacksLock); + MutexAutoLock lock(mLock); NS_IF_ADDREF(*cb = mCallbacks); } @@ -467,7 +479,7 @@ void nsHttpTransaction::SetSecurityCallbacks(nsIInterfaceRequestor* aCallbacks) { { - MutexAutoLock lock(mCallbacksLock); + MutexAutoLock lock(mLock); mCallbacks = aCallbacks; } @@ -911,8 +923,10 @@ nsHttpTransaction::Close(nsresult reason) mTimings.responseEnd.IsNull() && !mTimings.responseStart.IsNull()) mTimings.responseEnd = TimeStamp::Now(); - if (relConn && mConnection) + if (relConn && mConnection) { + MutexAutoLock lock(mLock); NS_RELEASE(mConnection); + } // save network statistics in the end of transaction SaveNetworkStats(true); @@ -1066,7 +1080,10 @@ nsHttpTransaction::Restart() // clear old connection state... mSecurityInfo = 0; - NS_IF_RELEASE(mConnection); + if (mConnection) { + MutexAutoLock lock(mLock); + NS_RELEASE(mConnection); + } // disable pipelining for the next attempt in case pipelining caused the // reset. this is being overly cautious since we don't know if pipelining