mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-02 20:20:00 +00:00
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:
parent
cbfd16320a
commit
8b8acc64f2
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user