Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit cf2166a

Browse files
committed
Bug 1550108 - Eliminate large buffer copies from StartupCache r=froydnj
The signatures were updated in the previous patch to hand us the raw, uncopied buffers. This just adjusts the callsites to match. Differential Revision: https://phabricator.services.mozilla.com/D34653 --HG-- extra : moz-landing-system : lando
1 parent eb024f4 commit cf2166a

7 files changed

Lines changed: 29 additions & 30 deletions

File tree

dom/xbl/nsXBLDocumentInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,14 +186,14 @@ nsresult nsXBLDocumentInfo::ReadPrototypeBindings(nsIURI* aURI,
186186
return NS_ERROR_FAILURE;
187187
}
188188

189-
UniquePtr<char[]> buf;
189+
const char* buf;
190190
uint32_t len;
191191
rv = startupCache->GetBuffer(spec.get(), &buf, &len);
192192
// GetBuffer will fail if the binding is not in the cache.
193193
if (NS_FAILED(rv)) return rv;
194194

195195
nsCOMPtr<nsIObjectInputStream> stream;
196-
rv = NewObjectInputStreamFromBuffer(std::move(buf), len,
196+
rv = NewObjectInputStreamFromBuffer(buf, len,
197197
getter_AddRefs(stream));
198198
NS_ENSURE_SUCCESS(rv, rv);
199199

dom/xul/nsXULPrototypeCache.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ nsresult nsXULPrototypeCache::GetInputStream(nsIURI* uri,
260260
nsresult rv = PathifyURI(uri, spec);
261261
if (NS_FAILED(rv)) return NS_ERROR_NOT_AVAILABLE;
262262

263-
UniquePtr<char[]> buf;
263+
const char* buf;
264264
uint32_t len;
265265
nsCOMPtr<nsIObjectInputStream> ois;
266266
StartupCache* sc = StartupCache::GetSingleton();
@@ -269,7 +269,7 @@ nsresult nsXULPrototypeCache::GetInputStream(nsIURI* uri,
269269
rv = sc->GetBuffer(spec.get(), &buf, &len);
270270
if (NS_FAILED(rv)) return NS_ERROR_NOT_AVAILABLE;
271271

272-
rv = NewObjectInputStreamFromBuffer(std::move(buf), len, getter_AddRefs(ois));
272+
rv = NewObjectInputStreamFromBuffer(buf, len, getter_AddRefs(ois));
273273
NS_ENSURE_SUCCESS(rv, rv);
274274

275275
mInputStreamTable.Put(uri, ois);
@@ -398,14 +398,13 @@ nsresult nsXULPrototypeCache::BeginCaching(nsIURI* aURI) {
398398

399399
nsAutoCString fileChromePath, fileLocale;
400400

401-
UniquePtr<char[]> buf;
401+
const char* buf = nullptr;
402402
uint32_t len, amtRead;
403403
nsCOMPtr<nsIObjectInputStream> objectInput;
404404

405405
rv = startupCache->GetBuffer(kXULCacheInfoKey, &buf, &len);
406406
if (NS_SUCCEEDED(rv))
407-
rv = NewObjectInputStreamFromBuffer(std::move(buf), len,
408-
getter_AddRefs(objectInput));
407+
rv = NewObjectInputStreamFromBuffer(buf, len, getter_AddRefs(objectInput));
409408

410409
if (NS_SUCCEEDED(rv)) {
411410
rv = objectInput->ReadCString(fileLocale);
@@ -461,10 +460,10 @@ nsresult nsXULPrototypeCache::BeginCaching(nsIURI* aURI) {
461460
}
462461

463462
if (NS_SUCCEEDED(rv)) {
464-
buf = MakeUnique<char[]>(len);
465-
rv = inputStream->Read(buf.get(), len, &amtRead);
463+
auto putBuf = MakeUnique<char[]>(len);
464+
rv = inputStream->Read(putBuf.get(), len, &amtRead);
466465
if (NS_SUCCEEDED(rv) && len == amtRead)
467-
rv = startupCache->PutBuffer(kXULCacheInfoKey, std::move(buf), len);
466+
rv = startupCache->PutBuffer(kXULCacheInfoKey, std::move(putBuf), len);
468467
else {
469468
rv = NS_ERROR_UNEXPECTED;
470469
}

gfx/thebes/gfxFT2FontList.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include "nsIMemory.h"
4949
#include "gfxFontConstants.h"
5050

51+
#include "mozilla/EndianUtils.h"
5152
#include "mozilla/Preferences.h"
5253
#include "mozilla/scache/StartupCache.h"
5354
#include <fcntl.h>
@@ -699,8 +700,8 @@ class FontNameCache {
699700
}
700701

701702
uint32_t size;
702-
UniquePtr<char[]> buf;
703-
if (NS_FAILED(mCache->GetBuffer(CACHE_KEY, &buf, &size))) {
703+
const char* cur;
704+
if (NS_FAILED(mCache->GetBuffer(CACHE_KEY, &cur, &size))) {
704705
LOG(("no cache of " CACHE_KEY));
705706
return;
706707
}
@@ -710,8 +711,6 @@ class FontNameCache {
710711
mMap.Clear();
711712
mWriteNeeded = false;
712713

713-
const char* cur = buf.get();
714-
715714
while (const char* fileEnd = strchr(cur, kFileSep)) {
716715
// The cached record for one file is at [cur, fileEnd].
717716

@@ -1117,15 +1116,15 @@ void gfxFT2FontList::FindFontsInOmnijar(FontNameCache* aCache) {
11171116

11181117
mozilla::scache::StartupCache* cache =
11191118
mozilla::scache::StartupCache::GetSingleton();
1120-
UniquePtr<char[]> cachedModifiedTimeBuf;
1119+
const char* cachedModifiedTimeBuf;
11211120
uint32_t longSize;
11221121
if (cache &&
11231122
NS_SUCCEEDED(cache->GetBuffer(JAR_LAST_MODIFED_TIME,
11241123
&cachedModifiedTimeBuf, &longSize)) &&
11251124
longSize == sizeof(int64_t)) {
11261125
nsCOMPtr<nsIFile> jarFile = Omnijar::GetPath(Omnijar::Type::GRE);
11271126
jarFile->GetLastModifiedTime(&mJarModifiedTime);
1128-
if (mJarModifiedTime > *(int64_t*)cachedModifiedTimeBuf.get()) {
1127+
if (mJarModifiedTime > LittleEndian::readInt64(cachedModifiedTimeBuf)) {
11291128
jarChanged = true;
11301129
}
11311130
}
@@ -1384,7 +1383,7 @@ void gfxFT2FontList::WriteCache() {
13841383
if (cache && mJarModifiedTime > 0) {
13851384
const size_t bufSize = sizeof(mJarModifiedTime);
13861385
auto buf = MakeUnique<char[]>(bufSize);
1387-
memcpy(buf.get(), &mJarModifiedTime, bufSize);
1386+
LittleEndian::writeInt64(buf.get(), mJarModifiedTime);
13881387

13891388
LOG(("WriteCache: putting Jar, length %zu", bufSize));
13901389
cache->PutBuffer(JAR_LAST_MODIFED_TIME, std::move(buf), bufSize);

js/xpconnect/loader/mozJSLoaderUtils.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ using mozilla::UniquePtr;
2020
// principals to the system principals.
2121
nsresult ReadCachedScript(StartupCache* cache, nsACString& uri, JSContext* cx,
2222
MutableHandleScript scriptp) {
23-
UniquePtr<char[]> buf;
23+
const char* buf;
2424
uint32_t len;
2525
nsresult rv = cache->GetBuffer(PromiseFlatCString(uri).get(), &buf, &len);
2626
if (NS_FAILED(rv)) {
2727
return rv; // don't warn since NOT_AVAILABLE is an ok error
2828
}
29-
29+
void* copy = malloc(len);
30+
memcpy(copy, buf, len);
3031
JS::TranscodeBuffer buffer;
31-
buffer.replaceRawBuffer(reinterpret_cast<uint8_t*>(buf.release()), len);
32+
buffer.replaceRawBuffer(reinterpret_cast<uint8_t*>(copy), len);
3233
JS::TranscodeResult code = JS::DecodeScript(cx, buffer, scriptp);
3334
if (code == JS::TranscodeResult_Ok) {
3435
return NS_OK;

startupcache/StartupCacheUtils.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919
namespace mozilla {
2020
namespace scache {
2121

22-
nsresult NewObjectInputStreamFromBuffer(UniquePtr<char[]> buffer, uint32_t len,
22+
nsresult NewObjectInputStreamFromBuffer(const char* buffer, uint32_t len,
2323
nsIObjectInputStream** stream) {
2424
nsCOMPtr<nsIInputStream> stringStream;
2525
nsresult rv = NS_NewByteInputStream(getter_AddRefs(stringStream),
26-
MakeSpan(buffer.release(), len),
27-
NS_ASSIGNMENT_ADOPT);
26+
MakeSpan(buffer, len),
27+
NS_ASSIGNMENT_DEPEND);
2828
MOZ_ALWAYS_SUCCEEDS(rv);
2929

3030
nsCOMPtr<nsIObjectInputStream> objectInput =

startupcache/StartupCacheUtils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class nsIURI;
1616
namespace mozilla {
1717
namespace scache {
1818

19-
nsresult NewObjectInputStreamFromBuffer(UniquePtr<char[]> buffer, uint32_t len,
19+
nsresult NewObjectInputStreamFromBuffer(const char* buffer, uint32_t len,
2020
nsIObjectInputStream** stream);
2121

2222
// We can't retrieve the wrapped stream from the objectOutputStream later,

startupcache/test/TestStartupCache.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,30 +86,30 @@ TEST_F(TestStartupCache, StartupWriteRead) {
8686

8787
const char* buf = "Market opportunities for BeardBook";
8888
const char* id = "id";
89-
UniquePtr<char[]> outbuf;
89+
const char* outbuf;
9090
uint32_t len;
9191

9292
rv = sc->PutBuffer(id, UniquePtr<char[]>(strdup(buf)), strlen(buf) + 1);
9393
EXPECT_TRUE(NS_SUCCEEDED(rv));
9494

9595
rv = sc->GetBuffer(id, &outbuf, &len);
9696
EXPECT_TRUE(NS_SUCCEEDED(rv));
97-
EXPECT_STREQ(buf, outbuf.get());
97+
EXPECT_STREQ(buf, outbuf);
9898

9999
rv = sc->ResetStartupWriteTimer();
100100
EXPECT_TRUE(NS_SUCCEEDED(rv));
101101
WaitForStartupTimer();
102102

103103
rv = sc->GetBuffer(id, &outbuf, &len);
104104
EXPECT_TRUE(NS_SUCCEEDED(rv));
105-
EXPECT_STREQ(buf, outbuf.get());
105+
EXPECT_STREQ(buf, outbuf);
106106
}
107107

108108
TEST_F(TestStartupCache, WriteInvalidateRead) {
109109
nsresult rv;
110110
const char* buf = "BeardBook competitive analysis";
111111
const char* id = "id";
112-
UniquePtr<char[]> outbuf;
112+
const char* outbuf;
113113
uint32_t len;
114114
StartupCache* sc = StartupCache::GetSingleton();
115115
ASSERT_TRUE(sc);
@@ -168,13 +168,13 @@ TEST_F(TestStartupCache, WriteObject) {
168168
rv = sc->PutBuffer(id, std::move(buf), len);
169169
EXPECT_TRUE(NS_SUCCEEDED(rv));
170170

171-
UniquePtr<char[]> buf2;
171+
const char* buf2;
172172
uint32_t len2;
173173
nsCOMPtr<nsIObjectInputStream> objectInput;
174174
rv = sc->GetBuffer(id, &buf2, &len2);
175175
EXPECT_TRUE(NS_SUCCEEDED(rv));
176176

177-
rv = NewObjectInputStreamFromBuffer(std::move(buf2), len2,
177+
rv = NewObjectInputStreamFromBuffer(buf2, len2,
178178
getter_AddRefs(objectInput));
179179
EXPECT_TRUE(NS_SUCCEEDED(rv));
180180

0 commit comments

Comments
 (0)