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);
NS_ENSURE_SUCCESS(rv, rv);
return startupCache->PutBuffer(spec.get(), buf.get(), len);
return startupCache->PutBuffer(spec.get(), Move(buf), len);
}
void

View File

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

View File

@ -62,8 +62,11 @@ WriteCachedScript(StartupCache* cache, nsACString& uri, JSContext* cx,
size_t size = buffer.length();
if (size > UINT32_MAX)
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(),
reinterpret_cast<char*>(buffer.begin()),
Move(buf),
size);
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.
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");
WaitOnWriteThread();
@ -310,9 +310,6 @@ StartupCache::PutBuffer(const char* id, const char* inbuf, uint32_t len)
return NS_ERROR_NOT_AVAILABLE;
}
auto data = MakeUnique<char[]>(len);
memcpy(data.get(), inbuf, len);
nsCString idStr(id);
// Cache it for now, we'll write all together later.
CacheEntry* entry;
@ -330,7 +327,7 @@ StartupCache::PutBuffer(const char* id, const char* inbuf, uint32_t len)
}
#endif
entry = new CacheEntry(Move(data), len);
entry = new CacheEntry(Move(inbuf), len);
mTable.Put(idStr, entry);
mPendingWrites.AppendElement(idStr);
return ResetStartupWriteTimer();

View File

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

View File

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