Commit 24b55f88 authored by Matt Howell's avatar Matt Howell Committed by Georg Koppen
Browse files

Bug 1474659 Part 2 - Add dedicated AllocKinds just for ArrayBufferObjects. r?sfink

The reason for doing this is to get ArrayBufferObjects allocated into their own arenas.

The specific enum values were chosen to avoid breaking assumptions about where certain
values fall in the list, such as OBJECT_FIRST == FUNCTION.
parent 819f821d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -44,12 +44,16 @@ namespace gc {
    D(OBJECT0_BACKGROUND,  Object,       JSObject,          JSObject_Slots0,   true,   true)  \
    D(OBJECT2,             Object,       JSObject,          JSObject_Slots2,   false,  false) \
    D(OBJECT2_BACKGROUND,  Object,       JSObject,          JSObject_Slots2,   true,   true)  \
    D(ARRAYBUFFER4,        Object,       JSObject,          JSObject_Slots4,   true,   true)  \
    D(OBJECT4,             Object,       JSObject,          JSObject_Slots4,   false,  false) \
    D(OBJECT4_BACKGROUND,  Object,       JSObject,          JSObject_Slots4,   true,   true)  \
    D(ARRAYBUFFER8,        Object,       JSObject,          JSObject_Slots8,   true,   true)  \
    D(OBJECT8,             Object,       JSObject,          JSObject_Slots8,   false,  false) \
    D(OBJECT8_BACKGROUND,  Object,       JSObject,          JSObject_Slots8,   true,   true)  \
    D(ARRAYBUFFER12,       Object,       JSObject,          JSObject_Slots12,  true,   true)  \
    D(OBJECT12,            Object,       JSObject,          JSObject_Slots12,  false,  false) \
    D(OBJECT12_BACKGROUND, Object,       JSObject,          JSObject_Slots12,  true,   true)  \
    D(ARRAYBUFFER16,       Object,       JSObject,          JSObject_Slots16,  true,   true)  \
    D(OBJECT16,            Object,       JSObject,          JSObject_Slots16,  false,  false) \
    D(OBJECT16_BACKGROUND, Object,       JSObject,          JSObject_Slots16,  true,   true)

+53 −25
Original line number Diff line number Diff line
@@ -461,8 +461,10 @@ static const FinalizePhase BackgroundFinalizePhases[] = {
    {gcstats::PhaseKind::SWEEP_OBJECT,
     {AllocKind::FUNCTION, AllocKind::FUNCTION_EXTENDED,
      AllocKind::OBJECT0_BACKGROUND, AllocKind::OBJECT2_BACKGROUND,
      AllocKind::OBJECT4_BACKGROUND, AllocKind::OBJECT8_BACKGROUND,
      AllocKind::OBJECT12_BACKGROUND, AllocKind::OBJECT16_BACKGROUND}},
      AllocKind::ARRAYBUFFER4, AllocKind::OBJECT4_BACKGROUND,
      AllocKind::ARRAYBUFFER8, AllocKind::OBJECT8_BACKGROUND,
      AllocKind::ARRAYBUFFER12, AllocKind::OBJECT12_BACKGROUND,
      AllocKind::ARRAYBUFFER16, AllocKind::OBJECT16_BACKGROUND}},
    {gcstats::PhaseKind::SWEEP_SCOPE,
     {
         AllocKind::SCOPE,
@@ -1870,20 +1872,36 @@ static bool CanRelocateZone(Zone* zone) {
  return !zone->isAtomsZone() && !zone->isSelfHostingZone();
}

static const AllocKind AllocKindsToRelocate[] = {
    AllocKind::FUNCTION,        AllocKind::FUNCTION_EXTENDED,
    AllocKind::OBJECT0,         AllocKind::OBJECT0_BACKGROUND,
    AllocKind::OBJECT2,         AllocKind::OBJECT2_BACKGROUND,
    AllocKind::OBJECT4,         AllocKind::OBJECT4_BACKGROUND,
    AllocKind::OBJECT8,         AllocKind::OBJECT8_BACKGROUND,
    AllocKind::OBJECT12,        AllocKind::OBJECT12_BACKGROUND,
    AllocKind::OBJECT16,        AllocKind::OBJECT16_BACKGROUND,
    AllocKind::SCRIPT,          AllocKind::LAZY_SCRIPT,
    AllocKind::SHAPE,           AllocKind::ACCESSOR_SHAPE,
    AllocKind::BASE_SHAPE,      AllocKind::FAT_INLINE_STRING,
    AllocKind::STRING,          AllocKind::EXTERNAL_STRING,
    AllocKind::FAT_INLINE_ATOM, AllocKind::ATOM,
    AllocKind::SCOPE,           AllocKind::REGEXP_SHARED};
static const AllocKind AllocKindsToRelocate[] = {AllocKind::FUNCTION,
                                                 AllocKind::FUNCTION_EXTENDED,
                                                 AllocKind::OBJECT0,
                                                 AllocKind::OBJECT0_BACKGROUND,
                                                 AllocKind::OBJECT2,
                                                 AllocKind::OBJECT2_BACKGROUND,
                                                 AllocKind::ARRAYBUFFER4,
                                                 AllocKind::OBJECT4,
                                                 AllocKind::OBJECT4_BACKGROUND,
                                                 AllocKind::ARRAYBUFFER8,
                                                 AllocKind::OBJECT8,
                                                 AllocKind::OBJECT8_BACKGROUND,
                                                 AllocKind::ARRAYBUFFER12,
                                                 AllocKind::OBJECT12,
                                                 AllocKind::OBJECT12_BACKGROUND,
                                                 AllocKind::ARRAYBUFFER16,
                                                 AllocKind::OBJECT16,
                                                 AllocKind::OBJECT16_BACKGROUND,
                                                 AllocKind::SCRIPT,
                                                 AllocKind::LAZY_SCRIPT,
                                                 AllocKind::SHAPE,
                                                 AllocKind::ACCESSOR_SHAPE,
                                                 AllocKind::BASE_SHAPE,
                                                 AllocKind::FAT_INLINE_STRING,
                                                 AllocKind::STRING,
                                                 AllocKind::EXTERNAL_STRING,
                                                 AllocKind::FAT_INLINE_ATOM,
                                                 AllocKind::ATOM,
                                                 AllocKind::SCOPE,
                                                 AllocKind::REGEXP_SHARED};

Arena* ArenaList::removeRemainingArenas(Arena** arenap) {
// This is only ever called to remove arenas that are after the cursor, so
@@ -2516,14 +2534,24 @@ static const AllocKinds UpdatePhaseMisc{
    AllocKind::SHAPE,  AllocKind::ACCESSOR_SHAPE, AllocKind::OBJECT_GROUP,
    AllocKind::STRING, AllocKind::JITCODE,        AllocKind::SCOPE};

static const AllocKinds UpdatePhaseObjects{
    AllocKind::FUNCTION, AllocKind::FUNCTION_EXTENDED,
    AllocKind::OBJECT0,  AllocKind::OBJECT0_BACKGROUND,
    AllocKind::OBJECT2,  AllocKind::OBJECT2_BACKGROUND,
    AllocKind::OBJECT4,  AllocKind::OBJECT4_BACKGROUND,
    AllocKind::OBJECT8,  AllocKind::OBJECT8_BACKGROUND,
    AllocKind::OBJECT12, AllocKind::OBJECT12_BACKGROUND,
    AllocKind::OBJECT16, AllocKind::OBJECT16_BACKGROUND};
static const AllocKinds UpdatePhaseObjects{AllocKind::FUNCTION,
                                           AllocKind::FUNCTION_EXTENDED,
                                           AllocKind::OBJECT0,
                                           AllocKind::OBJECT0_BACKGROUND,
                                           AllocKind::OBJECT2,
                                           AllocKind::OBJECT2_BACKGROUND,
                                           AllocKind::ARRAYBUFFER4,
                                           AllocKind::OBJECT4,
                                           AllocKind::OBJECT4_BACKGROUND,
                                           AllocKind::ARRAYBUFFER8,
                                           AllocKind::OBJECT8,
                                           AllocKind::OBJECT8_BACKGROUND,
                                           AllocKind::ARRAYBUFFER12,
                                           AllocKind::OBJECT12,
                                           AllocKind::OBJECT12_BACKGROUND,
                                           AllocKind::ARRAYBUFFER16,
                                           AllocKind::OBJECT16,
                                           AllocKind::OBJECT16_BACKGROUND};

void GCRuntime::updateAllCellPointers(MovingTracer* trc, Zone* zone) {
  size_t bgTaskCount = CellUpdateBackgroundTaskCount();
+1 −1
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ class ChainedIter {
typedef HashMap<Value*, const char*, DefaultHasher<Value*>, SystemAllocPolicy>
    RootedValueMap;

using AllocKinds = mozilla::EnumSet<AllocKind>;
using AllocKinds = mozilla::EnumSet<AllocKind, uint64_t>;

// A singly linked list of zones.
class ZoneList {
+4 −0
Original line number Diff line number Diff line
@@ -107,15 +107,19 @@ static inline size_t GetGCKindSlots(AllocKind thingKind) {
    case AllocKind::OBJECT2:
    case AllocKind::OBJECT2_BACKGROUND:
      return 2;
    case AllocKind::ARRAYBUFFER4:
    case AllocKind::OBJECT4:
    case AllocKind::OBJECT4_BACKGROUND:
      return 4;
    case AllocKind::ARRAYBUFFER8:
    case AllocKind::OBJECT8:
    case AllocKind::OBJECT8_BACKGROUND:
      return 8;
    case AllocKind::ARRAYBUFFER12:
    case AllocKind::OBJECT12:
    case AllocKind::OBJECT12_BACKGROUND:
      return 12;
    case AllocKind::ARRAYBUFFER16:
    case AllocKind::OBJECT16:
    case AllocKind::OBJECT16_BACKGROUND:
      return 16;
+14 −1
Original line number Diff line number Diff line
@@ -1044,6 +1044,19 @@ void ArrayBufferObject::setFlags(uint32_t flags) {
  setSlot(FLAGS_SLOT, Int32Value(flags));
}

static inline AllocKind GetArrayBufferGCObjectKind(size_t numSlots) {
  if (numSlots <= 4) {
    return AllocKind::ARRAYBUFFER4;
  }
  if (numSlots <= 8) {
    return AllocKind::ARRAYBUFFER8;
  }
  if (numSlots <= 12) {
    return AllocKind::ARRAYBUFFER12;
  }
  return AllocKind::ARRAYBUFFER16;
}

ArrayBufferObject* ArrayBufferObject::create(
    JSContext* cx, uint32_t nbytes, BufferContents contents,
    OwnsState ownsState /* = OwnsData */, HandleObject proto /* = nullptr */,
@@ -1104,7 +1117,7 @@ ArrayBufferObject* ArrayBufferObject::create(
  }

  MOZ_ASSERT(!(class_.flags & JSCLASS_HAS_PRIVATE));
  gc::AllocKind allocKind = GetGCObjectKind(nslots);
  gc::AllocKind allocKind = GetArrayBufferGCObjectKind(nslots);

  AutoSetNewObjectMetadata metadata(cx);
  Rooted<ArrayBufferObject*> obj(cx, NewObjectWithClassProto<ArrayBufferObject>(