Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
| index 048ee57d4f133bcb0d51319acf39d03b9c3eb074..97b2a2f5e535ebb42f4b6760182dba3c21b29254 100644 |
| --- a/runtime/vm/dart_api_impl.cc |
| +++ b/runtime/vm/dart_api_impl.cc |
| @@ -490,6 +490,80 @@ DART_EXPORT Dart_Handle Dart_NewWeakReferenceSet(Dart_Handle* keys, |
| return Api::Success(); |
| } |
| + |
| +// --- Garbage Collection Callbacks -- |
| + |
| + |
| +DART_EXPORT Dart_Handle Dart_NewGcPrologueCallback( |
| + Dart_GcPrologueCallback callback) { |
| + Isolate* isolate = Isolate::Current(); |
| + CHECK_ISOLATE(isolate); |
| + ApiState* state = isolate->api_state(); |
|
turnidge
2012/03/07 00:25:16
You could permissibly move these callback lists to
cshapiro
2012/03/07 03:06:10
Done. I will move the weak references in a follow
|
| + ASSERT(state != NULL); |
| + GcPrologueCallbacks& callbacks = state->gc_prologue_callbacks(); |
| + if (callbacks.Contains(callback)) { |
| + return Api::NewError( |
| + "%s permits only one instance of 'callback' to be present in the " |
| + "prologue callback list.", |
| + CURRENT_FUNC); |
| + } |
| + state->gc_prologue_callbacks().Add(callback); |
| + return Api::Success(); |
| +} |
| + |
| + |
| +DART_EXPORT Dart_Handle Dart_DeleteGcPrologueCallback( |
| + Dart_GcPrologueCallback callback) { |
| + Isolate* isolate = Isolate::Current(); |
| + CHECK_ISOLATE(isolate); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| + GcPrologueCallbacks& callbacks = state->gc_prologue_callbacks(); |
| + if (!callbacks.Contains(callback)) { |
| + return Api::NewError( |
| + "%s expects 'callback' to be present in the prologue callback list.", |
| + CURRENT_FUNC); |
| + } |
| + state->gc_prologue_callbacks().Remove(callback); |
| + return Api::Success(); |
| +} |
| + |
| + |
| +DART_EXPORT Dart_Handle Dart_NewGcEpilogueCallback( |
| + Dart_GcEpilogueCallback callback) { |
| + Isolate* isolate = Isolate::Current(); |
| + CHECK_ISOLATE(isolate); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| + GcEpilogueCallbacks& callbacks = state->gc_epilogue_callbacks(); |
| + if (callbacks.Contains(callback)) { |
| + return Api::NewError( |
| + "%s permits only one instance of 'callback' to be present in the " |
| + "epilogue callback list.", |
| + CURRENT_FUNC); |
| + } |
| + callbacks.Add(callback); |
| + return Api::Success(); |
| +} |
| + |
| + |
| +DART_EXPORT Dart_Handle Dart_DeleteGcEpilogueCallback( |
| + Dart_GcEpilogueCallback callback) { |
| + Isolate* isolate = Isolate::Current(); |
| + CHECK_ISOLATE(isolate); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| + GcEpilogueCallbacks& callbacks = state->gc_epilogue_callbacks(); |
| + if (!callbacks.Contains(callback)) { |
| + return Api::NewError( |
| + "%s expects 'callback' to be present in the epilogue callback list.", |
| + CURRENT_FUNC); |
| + } |
| + callbacks.Remove(callback); |
| + return Api::Success(); |
| +} |
| + |
| + |
| // --- Initialization and Globals --- |