mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +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);
|
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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user