Bug 1517823 - Part 1: Store out of line TypedArray data in ArrayBuffer malloc-arena. r=sfink

This commit is contained in:
André Bargull 2019-01-07 05:46:34 -08:00
Родитель 24cff8e905
Коммит cd2bf34a4f
5 изменённых файлов: 24 добавлений и 16 удалений

Просмотреть файл

@ -456,7 +456,8 @@ void* js::Nursery::allocateBufferSameLocation(JSObject* obj, size_t nbytes) {
return allocate(nbytes); return allocate(nbytes);
} }
void* js::Nursery::allocateZeroedBuffer(Zone* zone, size_t nbytes) { void* js::Nursery::allocateZeroedBuffer(
Zone* zone, size_t nbytes, arena_id_t arena /*= js::MallocArena*/) {
MOZ_ASSERT(nbytes > 0); MOZ_ASSERT(nbytes > 0);
if (nbytes <= MaxNurseryBufferSize) { if (nbytes <= MaxNurseryBufferSize) {
@ -467,7 +468,7 @@ void* js::Nursery::allocateZeroedBuffer(Zone* zone, size_t nbytes) {
} }
} }
void* buffer = zone->pod_calloc<uint8_t>(nbytes); void* buffer = zone->pod_calloc<uint8_t>(nbytes, arena);
if (buffer && !registerMallocedBuffer(buffer)) { if (buffer && !registerMallocedBuffer(buffer)) {
js_free(buffer); js_free(buffer);
return nullptr; return nullptr;
@ -475,14 +476,15 @@ void* js::Nursery::allocateZeroedBuffer(Zone* zone, size_t nbytes) {
return buffer; return buffer;
} }
void* js::Nursery::allocateZeroedBuffer(JSObject* obj, size_t nbytes) { void* js::Nursery::allocateZeroedBuffer(
JSObject* obj, size_t nbytes, arena_id_t arena /*= js::MallocArena*/) {
MOZ_ASSERT(obj); MOZ_ASSERT(obj);
MOZ_ASSERT(nbytes > 0); MOZ_ASSERT(nbytes > 0);
if (!IsInsideNursery(obj)) { if (!IsInsideNursery(obj)) {
return obj->zone()->pod_calloc<uint8_t>(nbytes); return obj->zone()->pod_calloc<uint8_t>(nbytes, arena);
} }
return allocateZeroedBuffer(obj->zone(), nbytes); return allocateZeroedBuffer(obj->zone(), nbytes, arena);
} }
void* js::Nursery::reallocateBuffer(JSObject* obj, void* oldBuffer, void* js::Nursery::reallocateBuffer(JSObject* obj, void* oldBuffer,

Просмотреть файл

@ -244,15 +244,19 @@ class Nursery {
void* allocateBufferSameLocation(JSObject* obj, size_t nbytes); void* allocateBufferSameLocation(JSObject* obj, size_t nbytes);
/* Allocate a zero-initialized buffer for a given zone, using the nursery if /* Allocate a zero-initialized buffer for a given zone, using the nursery if
* possible. * possible. If the buffer isn't allocated in the nursery, the given arena is
* used.
*/ */
void* allocateZeroedBuffer(JS::Zone* zone, size_t nbytes); void* allocateZeroedBuffer(JS::Zone* zone, size_t nbytes,
arena_id_t arena = js::MallocArena);
/* /*
* Allocate a zero-initialized buffer for a given object, using the nursery if * Allocate a zero-initialized buffer for a given object, using the nursery if
* possible and obj is in the nursery. * possible and obj is in the nursery. If the buffer isn't allocated in the
* nursery, the given arena is used.
*/ */
void* allocateZeroedBuffer(JSObject* obj, size_t nbytes); void* allocateZeroedBuffer(JSObject* obj, size_t nbytes,
arena_id_t arena = js::MallocArena);
/* Resize an existing object buffer. */ /* Resize an existing object buffer. */
void* reallocateBuffer(JSObject* obj, void* oldBuffer, size_t oldBytes, void* reallocateBuffer(JSObject* obj, void* oldBuffer, size_t oldBytes,

Просмотреть файл

@ -1180,7 +1180,8 @@ static void AllocateObjectBufferWithInit(JSContext* cx, TypedArrayObject* obj,
MOZ_ASSERT((CheckedUint32(nbytes) + sizeof(Value)).isValid()); MOZ_ASSERT((CheckedUint32(nbytes) + sizeof(Value)).isValid());
nbytes = JS_ROUNDUP(nbytes, sizeof(Value)); nbytes = JS_ROUNDUP(nbytes, sizeof(Value));
void* buf = cx->nursery().allocateZeroedBuffer(obj, nbytes); void* buf = cx->nursery().allocateZeroedBuffer(obj, nbytes,
js::ArrayBufferContentsArena);
if (buf) { if (buf) {
obj->initPrivate(buf); obj->initPrivate(buf);
} }

Просмотреть файл

@ -49,8 +49,8 @@ namespace js {
template <class Client> template <class Client>
struct MallocProvider { struct MallocProvider {
template <class T> template <class T>
T* maybe_pod_malloc(size_t numElems) { T* maybe_pod_malloc(size_t numElems, arena_id_t arena = js::MallocArena) {
T* p = js_pod_malloc<T>(numElems); T* p = js_pod_arena_malloc<T>(arena, numElems);
if (MOZ_LIKELY(p)) { if (MOZ_LIKELY(p)) {
client()->updateMallocCounter(numElems * sizeof(T)); client()->updateMallocCounter(numElems * sizeof(T));
} }
@ -85,8 +85,8 @@ struct MallocProvider {
} }
template <class T> template <class T>
T* pod_malloc(size_t numElems) { T* pod_malloc(size_t numElems, arena_id_t arena = js::MallocArena) {
T* p = maybe_pod_malloc<T>(numElems); T* p = maybe_pod_malloc<T>(numElems, arena);
if (MOZ_LIKELY(p)) { if (MOZ_LIKELY(p)) {
return p; return p;
} }

Просмотреть файл

@ -192,7 +192,8 @@ void TypedArrayObject::finalize(FreeOp* fop, JSObject* obj) {
MOZ_ASSERT(!oldObj->hasInlineElements()); MOZ_ASSERT(!oldObj->hasInlineElements());
AutoEnterOOMUnsafeRegion oomUnsafe; AutoEnterOOMUnsafeRegion oomUnsafe;
nbytes = JS_ROUNDUP(nbytes, sizeof(Value)); nbytes = JS_ROUNDUP(nbytes, sizeof(Value));
void* data = newObj->zone()->pod_malloc<uint8_t>(nbytes); void* data = newObj->zone()->pod_malloc<uint8_t>(
nbytes, js::ArrayBufferContentsArena);
if (!data) { if (!data) {
oomUnsafe.crash( oomUnsafe.crash(
"Failed to allocate typed array elements while tenuring."); "Failed to allocate typed array elements while tenuring.");
@ -528,7 +529,7 @@ class TypedArrayObjectTemplate : public TypedArrayObject {
UniquePtr<void, JS::FreePolicy> buf; UniquePtr<void, JS::FreePolicy> buf;
if (!fitsInline) { if (!fitsInline) {
MOZ_ASSERT(len > 0); MOZ_ASSERT(len > 0);
buf.reset(cx->pod_calloc<uint8_t>(nbytes)); buf.reset(cx->pod_calloc<uint8_t>(nbytes, js::ArrayBufferContentsArena));
if (!buf) { if (!buf) {
return nullptr; return nullptr;
} }