Skip to content

Commit 4992bc7

Browse files
committed
Remove support for object grouping during Garbage Collection
- remove support for prolog weak persistent handles - remove support for construction of weak reference sets [email protected] Review URL: https://codereview.chromium.org/1459173004 .
1 parent 0f47702 commit 4992bc7

14 files changed

+35
-1188
lines changed

runtime/include/dart_api.h

Lines changed: 0 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -501,140 +501,6 @@ DART_EXPORT void Dart_DeleteWeakPersistentHandle(
501501
Dart_Isolate isolate,
502502
Dart_WeakPersistentHandle object);
503503

504-
/**
505-
* Allocates a prologue weak persistent handle for an object.
506-
*
507-
* Prologue weak persistent handles are similar to weak persistent
508-
* handles but exhibit different behavior during garbage collections
509-
* that invoke the prologue and epilogue callbacks. While weak
510-
* persistent handles always weakly reference their referents,
511-
* prologue weak persistent handles weakly reference their referents
512-
* only during a garbage collection that invokes the prologue and
513-
* epilogue callbacks. During all other garbage collections, prologue
514-
* weak persistent handles strongly reference their referents.
515-
*
516-
* This handle has the lifetime of the current isolate unless the object
517-
* pointed to by the handle is garbage collected, in this case the VM
518-
* automatically deletes the handle after invoking the callback associated
519-
* with the handle. The handle can also be explicitly deallocated by
520-
* calling Dart_DeleteWeakPersistentHandle.
521-
*
522-
* If the object becomes unreachable the callback is invoked with the weak
523-
* persistent handle and the peer as arguments. This gives the native code the
524-
* ability to cleanup data associated with the object and clear out any cached
525-
* references to the handle. All references to this handle after the callback
526-
* will be invalid. It is illegal to call into the VM from the callback.
527-
* If the handle is deleted before the object becomes unreachable,
528-
* the callback is never invoked.
529-
*
530-
* Requires there to be a current isolate.
531-
*
532-
* \param object An object.
533-
* \param peer A pointer to a native object or NULL. This value is
534-
* provided to callback when it is invoked.
535-
* \param external_allocation_size The number of externally allocated
536-
* bytes for peer. Used to inform the garbage collector.
537-
* \param callback A function pointer that will be invoked sometime
538-
* after the object is garbage collected, unless the handle has been deleted.
539-
* A valid callback needs to be specified it cannot be NULL.
540-
*
541-
* \return Success if the prologue weak persistent handle was created.
542-
* Otherwise, returns an error.
543-
*/
544-
DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle(
545-
Dart_Handle object,
546-
void* peer,
547-
intptr_t external_allocation_size,
548-
Dart_WeakPersistentHandleFinalizer callback);
549-
550-
/**
551-
* Is this object a prologue weak persistent handle?
552-
*
553-
* Requires there to be a current isolate.
554-
*/
555-
DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(
556-
Dart_WeakPersistentHandle object);
557-
558-
typedef struct _Dart_WeakReferenceSetBuilder* Dart_WeakReferenceSetBuilder;
559-
typedef struct _Dart_WeakReferenceSet* Dart_WeakReferenceSet;
560-
561-
/**
562-
* Constructs a weak references set builder.
563-
*
564-
* \returns a pointer to the weak reference set builder if successful.
565-
* Otherwise, returns NULL.
566-
*/
567-
DART_EXPORT Dart_WeakReferenceSetBuilder Dart_NewWeakReferenceSetBuilder();
568-
569-
/**
570-
* Constructs a set of weak references from the Cartesian product of
571-
* the objects in the key set and the objects in values set.
572-
*
573-
* \param set_builder The weak references set builder which was created
574-
* using Dart_NewWeakReferenceSetBuilder().
575-
* \param key An object reference. This references will be
576-
* considered weak by the garbage collector.
577-
* \param value An object reference. This reference will be
578-
* considered weak by garbage collector unless any object reference
579-
* in 'keys' is found to be strong.
580-
*
581-
* \return a pointer to the weak reference set if successful.
582-
* Otherwise, returns NULL.
583-
*/
584-
DART_EXPORT Dart_WeakReferenceSet Dart_NewWeakReferenceSet(
585-
Dart_WeakReferenceSetBuilder set_builder,
586-
Dart_WeakPersistentHandle key,
587-
Dart_WeakPersistentHandle value);
588-
589-
/**
590-
* Append the pair of key/value object references to the weak references set.
591-
*
592-
* \param reference_set A weak references set into which the pair of key/value
593-
* needs to be added.
594-
* \param key An object reference. This references will be
595-
* considered weak by the garbage collector.
596-
* \param value An object reference. This reference will be
597-
* considered weak by garbage collector unless any object reference
598-
* in 'keys' is found to be strong.
599-
*
600-
* \return Success if the prologue weak persistent handle was created.
601-
* Otherwise, returns an error.
602-
*/
603-
DART_EXPORT Dart_Handle Dart_AppendToWeakReferenceSet(
604-
Dart_WeakReferenceSet reference_set,
605-
Dart_WeakPersistentHandle key,
606-
Dart_WeakPersistentHandle value);
607-
608-
/**
609-
* Append the key object reference to the weak references set.
610-
*
611-
* \param reference_set A weak references set into which the key
612-
* needs to be added.
613-
* \param key An object reference. This references will be
614-
* considered weak by the garbage collector.
615-
*
616-
* \return Success if the prologue weak persistent handle was created.
617-
* Otherwise, returns an error.
618-
*/
619-
DART_EXPORT Dart_Handle Dart_AppendKeyToWeakReferenceSet(
620-
Dart_WeakReferenceSet reference_set,
621-
Dart_WeakPersistentHandle key);
622-
623-
/**
624-
* Append the value object reference to the weak references set.
625-
*
626-
* \param reference_set A weak references set into which the key
627-
* needs to be added.
628-
* \param value An object reference. This references will be
629-
* considered weak by the garbage collector.
630-
*
631-
* \return Success if the prologue weak persistent handle was created.
632-
* Otherwise, returns an error.
633-
*/
634-
DART_EXPORT Dart_Handle Dart_AppendValueToWeakReferenceSet(
635-
Dart_WeakReferenceSet reference_set,
636-
Dart_WeakPersistentHandle value);
637-
638504

639505
/*
640506
* ============================

runtime/vm/dart_api_impl.cc

Lines changed: 4 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -347,16 +347,6 @@ static RawObject* Send1Arg(const Instance& receiver,
347347
}
348348

349349

350-
WeakReferenceSetBuilder* ApiState::NewWeakReferenceSetBuilder() {
351-
return new WeakReferenceSetBuilder(this);
352-
}
353-
354-
355-
void ApiState::DelayWeakReferenceSet(WeakReferenceSet* reference_set) {
356-
WeakReferenceSet::Push(reference_set, &delayed_weak_reference_sets_);
357-
}
358-
359-
360350
Dart_Handle Api::InitNewHandle(Isolate* isolate, RawObject* raw) {
361351
LocalHandles* local_handles = Api::TopScope(isolate)->local_handles();
362352
ASSERT(local_handles != NULL);
@@ -691,8 +681,7 @@ FinalizablePersistentHandle* FinalizablePersistentHandle::Cast(
691681
Dart_WeakPersistentHandle handle) {
692682
#if defined(DEBUG)
693683
ApiState* state = Isolate::Current()->api_state();
694-
ASSERT(state->IsValidWeakPersistentHandle(handle) ||
695-
state->IsValidPrologueWeakPersistentHandle(handle));
684+
ASSERT(state->IsValidWeakPersistentHandle(handle));
696685
#endif
697686
return reinterpret_cast<FinalizablePersistentHandle*>(handle);
698687
}
@@ -710,11 +699,7 @@ void FinalizablePersistentHandle::Finalize(
710699
(*callback)(isolate->init_callback_data(), object, peer);
711700
ApiState* state = isolate->api_state();
712701
ASSERT(state != NULL);
713-
if (handle->IsPrologueWeakPersistent()) {
714-
state->prologue_weak_persistent_handles().FreeHandle(handle);
715-
} else {
716-
state->weak_persistent_handles().FreeHandle(handle);
717-
}
702+
state->weak_persistent_handles().FreeHandle(handle);
718703
}
719704

720705

@@ -1018,7 +1003,6 @@ DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
10181003
static Dart_WeakPersistentHandle AllocateFinalizableHandle(
10191004
Thread* thread,
10201005
Dart_Handle object,
1021-
bool is_prologue,
10221006
void* peer,
10231007
intptr_t external_allocation_size,
10241008
Dart_WeakPersistentHandleFinalizer callback) {
@@ -1027,7 +1011,6 @@ static Dart_WeakPersistentHandle AllocateFinalizableHandle(
10271011
ref = Api::UnwrapHandle(object);
10281012
FinalizablePersistentHandle* finalizable_ref =
10291013
FinalizablePersistentHandle::New(thread->isolate(),
1030-
is_prologue,
10311014
ref,
10321015
peer,
10331016
callback,
@@ -1048,26 +1031,6 @@ DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle(
10481031
}
10491032
return AllocateFinalizableHandle(thread,
10501033
object,
1051-
false,
1052-
peer,
1053-
external_allocation_size,
1054-
callback);
1055-
}
1056-
1057-
1058-
DART_EXPORT Dart_WeakPersistentHandle Dart_NewPrologueWeakPersistentHandle(
1059-
Dart_Handle object,
1060-
void* peer,
1061-
intptr_t external_allocation_size,
1062-
Dart_WeakPersistentHandleFinalizer callback) {
1063-
Thread* thread = Thread::Current();
1064-
CHECK_ISOLATE(thread->isolate());
1065-
if (callback == NULL) {
1066-
return NULL;
1067-
}
1068-
return AllocateFinalizableHandle(thread,
1069-
object,
1070-
true,
10711034
peer,
10721035
external_allocation_size,
10731036
callback);
@@ -1098,81 +1061,7 @@ DART_EXPORT void Dart_DeleteWeakPersistentHandle(
10981061
FinalizablePersistentHandle* weak_ref =
10991062
FinalizablePersistentHandle::Cast(object);
11001063
weak_ref->EnsureFreeExternal(isolate);
1101-
if (weak_ref->IsPrologueWeakPersistent()) {
1102-
ASSERT(state->IsValidPrologueWeakPersistentHandle(object));
1103-
state->prologue_weak_persistent_handles().FreeHandle(weak_ref);
1104-
} else {
1105-
ASSERT(!state->IsValidPrologueWeakPersistentHandle(object));
1106-
state->weak_persistent_handles().FreeHandle(weak_ref);
1107-
}
1108-
}
1109-
1110-
1111-
DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(
1112-
Dart_WeakPersistentHandle object) {
1113-
FinalizablePersistentHandle* weak_ref =
1114-
FinalizablePersistentHandle::Cast(object);
1115-
return weak_ref->IsPrologueWeakPersistent();
1116-
}
1117-
1118-
1119-
DART_EXPORT Dart_WeakReferenceSetBuilder Dart_NewWeakReferenceSetBuilder() {
1120-
Isolate* isolate = Isolate::Current();
1121-
CHECK_ISOLATE(isolate);
1122-
ApiState* state = isolate->api_state();
1123-
ASSERT(state != NULL);
1124-
return reinterpret_cast<Dart_WeakReferenceSetBuilder>(
1125-
state->NewWeakReferenceSetBuilder());
1126-
}
1127-
1128-
1129-
DART_EXPORT Dart_WeakReferenceSet Dart_NewWeakReferenceSet(
1130-
Dart_WeakReferenceSetBuilder set_builder,
1131-
Dart_WeakPersistentHandle key,
1132-
Dart_WeakPersistentHandle value) {
1133-
ASSERT(set_builder != NULL && key != NULL);
1134-
WeakReferenceSetBuilder* builder =
1135-
reinterpret_cast<WeakReferenceSetBuilder*>(set_builder);
1136-
ApiState* state = builder->api_state();
1137-
ASSERT(state == Isolate::Current()->api_state());
1138-
WeakReferenceSet* reference_set = builder->NewWeakReferenceSet();
1139-
reference_set->AppendKey(key);
1140-
if (value != NULL) {
1141-
reference_set->AppendValue(value);
1142-
}
1143-
state->DelayWeakReferenceSet(reference_set);
1144-
return reinterpret_cast<Dart_WeakReferenceSet>(reference_set);
1145-
}
1146-
1147-
1148-
DART_EXPORT Dart_Handle Dart_AppendToWeakReferenceSet(
1149-
Dart_WeakReferenceSet reference_set,
1150-
Dart_WeakPersistentHandle key,
1151-
Dart_WeakPersistentHandle value) {
1152-
ASSERT(reference_set != NULL);
1153-
WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set);
1154-
set->Append(key, value);
1155-
return Api::Success();
1156-
}
1157-
1158-
1159-
DART_EXPORT Dart_Handle Dart_AppendKeyToWeakReferenceSet(
1160-
Dart_WeakReferenceSet reference_set,
1161-
Dart_WeakPersistentHandle key) {
1162-
ASSERT(reference_set != NULL);
1163-
WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set);
1164-
set->AppendKey(key);
1165-
return Api::Success();
1166-
}
1167-
1168-
1169-
DART_EXPORT Dart_Handle Dart_AppendValueToWeakReferenceSet(
1170-
Dart_WeakReferenceSet reference_set,
1171-
Dart_WeakPersistentHandle value) {
1172-
ASSERT(reference_set != NULL);
1173-
WeakReferenceSet* set = reinterpret_cast<WeakReferenceSet*>(reference_set);
1174-
set->AppendValue(value);
1175-
return Api::Success();
1064+
state->weak_persistent_handles().FreeHandle(weak_ref);
11761065
}
11771066

11781067

@@ -1217,53 +1106,6 @@ DART_EXPORT Dart_Handle Dart_SetGcCallbacks(
12171106
}
12181107

12191108

1220-
class PrologueWeakVisitor : public HandleVisitor {
1221-
public:
1222-
PrologueWeakVisitor(Thread* thread,
1223-
Dart_GcPrologueWeakHandleCallback callback)
1224-
: HandleVisitor(thread),
1225-
callback_(callback) {
1226-
}
1227-
1228-
1229-
void VisitHandle(uword addr) {
1230-
NoSafepointScope no_safepoint;
1231-
FinalizablePersistentHandle* handle =
1232-
reinterpret_cast<FinalizablePersistentHandle*>(addr);
1233-
RawObject* raw_obj = handle->raw();
1234-
if (raw_obj->IsHeapObject()) {
1235-
ASSERT(handle->IsPrologueWeakPersistent());
1236-
ReusableInstanceHandleScope reused_instance_handle(thread());
1237-
Instance& instance = reused_instance_handle.Handle();
1238-
instance ^= reinterpret_cast<RawInstance*>(handle->raw());
1239-
intptr_t num_native_fields = instance.NumNativeFields();
1240-
intptr_t* native_fields = instance.NativeFieldsDataAddr();
1241-
if (native_fields != NULL) {
1242-
callback_(thread()->isolate()->init_callback_data(),
1243-
reinterpret_cast<Dart_WeakPersistentHandle>(addr),
1244-
num_native_fields,
1245-
native_fields);
1246-
}
1247-
}
1248-
}
1249-
1250-
private:
1251-
Dart_GcPrologueWeakHandleCallback callback_;
1252-
1253-
DISALLOW_COPY_AND_ASSIGN(PrologueWeakVisitor);
1254-
};
1255-
1256-
1257-
DART_EXPORT Dart_Handle Dart_VisitPrologueWeakHandles(
1258-
Dart_GcPrologueWeakHandleCallback callback) {
1259-
Thread* thread = Thread::Current();
1260-
CHECK_ISOLATE(thread->isolate());
1261-
PrologueWeakVisitor visitor(thread, callback);
1262-
thread->isolate()->VisitPrologueWeakPersistentHandles(&visitor);
1263-
return Api::Success();
1264-
}
1265-
1266-
12671109
// --- Initialization and Globals ---
12681110

12691111
DART_EXPORT const char* Dart_VersionString() {
@@ -4976,8 +4818,7 @@ DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args,
49764818
Isolate* isolate = arguments->thread()->isolate();
49774819
ASSERT(isolate == Isolate::Current());
49784820
ASSERT(isolate->api_state() != NULL &&
4979-
(isolate->api_state()->IsValidWeakPersistentHandle(rval) ||
4980-
isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval)));
4821+
(isolate->api_state()->IsValidWeakPersistentHandle(rval)));
49814822
#endif
49824823
Api::SetWeakHandleReturnValue(arguments, rval);
49834824
}

0 commit comments

Comments
 (0)