Bug 1439047 - Part 1: Make StartupCache::PutBuffer take ownership of the buffer. r=froydnj

This avoids a redundant alloc and copy in `PutBuffer`. All existing callers
were destroying the passed in buffer after the call.

--HG--
extra : rebase_source : 39a21686becedf32c38e58fa832ae47845b2f5e0
This commit is contained in:
Eric Rahm 2018-02-16 15:30:47 -08:00
parent cbfd16320a
commit 8b8acc64f2
6 changed files with 14 additions and 14 deletions

View File

@ -298,7 +298,7 @@ nsXBLDocumentInfo::WritePrototypeBindings()
rv = NewBufferFromStorageStream(storageStream, &buf, &len); rv = NewBufferFromStorageStream(storageStream, &buf, &len);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
return startupCache->PutBuffer(spec.get(), buf.get(), len); return startupCache->PutBuffer(spec.get(), Move(buf), len);
} }
void void

View File

@ -446,7 +446,7 @@ nsXULPrototypeCache::FinishOutputStream(nsIURI* uri)
rv = PathifyURI(uri, spec); rv = PathifyURI(uri, spec);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return NS_ERROR_NOT_AVAILABLE; return NS_ERROR_NOT_AVAILABLE;
rv = sc->PutBuffer(spec.get(), buf.get(), len); rv = sc->PutBuffer(spec.get(), Move(buf), len);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
mOutputStreamTable.Remove(uri); mOutputStreamTable.Remove(uri);
mStartupCacheURITable.PutEntry(uri); mStartupCacheURITable.PutEntry(uri);
@ -591,7 +591,7 @@ nsXULPrototypeCache::BeginCaching(nsIURI* aURI)
buf = MakeUnique<char[]>(len); buf = MakeUnique<char[]>(len);
rv = inputStream->Read(buf.get(), len, &amtRead); rv = inputStream->Read(buf.get(), len, &amtRead);
if (NS_SUCCEEDED(rv) && len == amtRead) if (NS_SUCCEEDED(rv) && len == amtRead)
rv = startupCache->PutBuffer(kXULCacheInfoKey, buf.get(), len); rv = startupCache->PutBuffer(kXULCacheInfoKey, Move(buf), len);
else { else {
rv = NS_ERROR_UNEXPECTED; rv = NS_ERROR_UNEXPECTED;
} }

View File

@ -62,8 +62,11 @@ WriteCachedScript(StartupCache* cache, nsACString& uri, JSContext* cx,
size_t size = buffer.length(); size_t size = buffer.length();
if (size > UINT32_MAX) if (size > UINT32_MAX)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
// Move the vector buffer into a unique pointer buffer.
UniquePtr<char[]> buf(reinterpret_cast<char*>(buffer.extractOrCopyRawBuffer()));
nsresult rv = cache->PutBuffer(PromiseFlatCString(uri).get(), nsresult rv = cache->PutBuffer(PromiseFlatCString(uri).get(),
reinterpret_cast<char*>(buffer.begin()), Move(buf),
size); size);
return rv; return rv;
} }

View File

@ -302,7 +302,7 @@ StartupCache::GetBuffer(const char* id, UniquePtr<char[]>* outbuf, uint32_t* len
// Makes a copy of the buffer, client retains ownership of inbuf. // Makes a copy of the buffer, client retains ownership of inbuf.
nsresult nsresult
StartupCache::PutBuffer(const char* id, const char* inbuf, uint32_t len) StartupCache::PutBuffer(const char* id, UniquePtr<char[]>&& inbuf, uint32_t len)
{ {
NS_ASSERTION(NS_IsMainThread(), "Startup cache only available on main thread"); NS_ASSERTION(NS_IsMainThread(), "Startup cache only available on main thread");
WaitOnWriteThread(); WaitOnWriteThread();
@ -310,9 +310,6 @@ StartupCache::PutBuffer(const char* id, const char* inbuf, uint32_t len)
return NS_ERROR_NOT_AVAILABLE; return NS_ERROR_NOT_AVAILABLE;
} }
auto data = MakeUnique<char[]>(len);
memcpy(data.get(), inbuf, len);
nsCString idStr(id); nsCString idStr(id);
// Cache it for now, we'll write all together later. // Cache it for now, we'll write all together later.
CacheEntry* entry; CacheEntry* entry;
@ -330,7 +327,7 @@ StartupCache::PutBuffer(const char* id, const char* inbuf, uint32_t len)
} }
#endif #endif
entry = new CacheEntry(Move(data), len); entry = new CacheEntry(Move(inbuf), len);
mTable.Put(idStr, entry); mTable.Put(idStr, entry);
mPendingWrites.AppendElement(idStr); mPendingWrites.AppendElement(idStr);
return ResetStartupWriteTimer(); return ResetStartupWriteTimer();

View File

@ -113,8 +113,8 @@ public:
// Returns a buffer that was previously stored, caller takes ownership. // Returns a buffer that was previously stored, caller takes ownership.
nsresult GetBuffer(const char* id, UniquePtr<char[]>* outbuf, uint32_t* length); nsresult GetBuffer(const char* id, UniquePtr<char[]>* outbuf, uint32_t* length);
// Stores a buffer. Caller keeps ownership, we make a copy. // Stores a buffer. Caller yields ownership.
nsresult PutBuffer(const char* id, const char* inbuf, uint32_t length); nsresult PutBuffer(const char* id, UniquePtr<char[]>&& inbuf, uint32_t length);
// Removes the cache file. // Removes the cache file.
void InvalidateCache(); void InvalidateCache();

View File

@ -96,7 +96,7 @@ TEST_F(TestStartupCache, StartupWriteRead)
UniquePtr<char[]> outbuf; UniquePtr<char[]> outbuf;
uint32_t len; uint32_t len;
rv = sc->PutBuffer(id, buf, strlen(buf) + 1); rv = sc->PutBuffer(id, UniquePtr<char[]>(strdup(buf)), strlen(buf) + 1);
EXPECT_TRUE(NS_SUCCEEDED(rv)); EXPECT_TRUE(NS_SUCCEEDED(rv));
rv = sc->GetBuffer(id, &outbuf, &len); rv = sc->GetBuffer(id, &outbuf, &len);
@ -122,7 +122,7 @@ TEST_F(TestStartupCache, WriteInvalidateRead)
StartupCache* sc = StartupCache::GetSingleton(); StartupCache* sc = StartupCache::GetSingleton();
ASSERT_TRUE(sc); ASSERT_TRUE(sc);
rv = sc->PutBuffer(id, buf, strlen(buf) + 1); rv = sc->PutBuffer(id, UniquePtr<char[]>(strdup(buf)), strlen(buf) + 1);
EXPECT_TRUE(NS_SUCCEEDED(rv)); EXPECT_TRUE(NS_SUCCEEDED(rv));
sc->InvalidateCache(); sc->InvalidateCache();
@ -177,7 +177,7 @@ TEST_F(TestStartupCache, WriteObject)
// Since this is a post-startup write, it should be written and // Since this is a post-startup write, it should be written and
// available. // available.
rv = sc->PutBuffer(id, buf.get(), len); rv = sc->PutBuffer(id, Move(buf), len);
EXPECT_TRUE(NS_SUCCEEDED(rv)); EXPECT_TRUE(NS_SUCCEEDED(rv));
UniquePtr<char[]> buf2; UniquePtr<char[]> buf2;