Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(480)

Side by Side Diff: runtime/vm/dart_api_impl_test.cc

Issue 197963002: Remove the ability to allow multiple gc prologue and gc epilogue callbacks (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/gc_callbacks.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/builtin.h" 5 #include "bin/builtin.h"
6 #include "include/dart_api.h" 6 #include "include/dart_api.h"
7 #include "include/dart_debugger_api.h" 7 #include "include/dart_debugger_api.h"
8 #include "include/dart_mirrors_api.h" 8 #include "include/dart_mirrors_api.h"
9 #include "include/dart_native_api.h" 9 #include "include/dart_native_api.h"
10 #include "platform/assert.h" 10 #include "platform/assert.h"
(...skipping 2852 matching lines...) Expand 10 before | Expand all | Expand 10 after
2863 2863
2864 2864
2865 static void PrologueCallbackTimes3() { 2865 static void PrologueCallbackTimes3() {
2866 global_prologue_callback_status *= 3; 2866 global_prologue_callback_status *= 3;
2867 } 2867 }
2868 2868
2869 2869
2870 static int global_epilogue_callback_status; 2870 static int global_epilogue_callback_status;
2871 2871
2872 2872
2873 static void EpilogueCallbackNOP() {
2874 }
2875
2876
2873 static void EpilogueCallbackTimes4() { 2877 static void EpilogueCallbackTimes4() {
2874 global_epilogue_callback_status *= 4; 2878 global_epilogue_callback_status *= 4;
2875 } 2879 }
2876 2880
2877 2881
2878 static void EpilogueCallbackTimes5() { 2882 static void EpilogueCallbackTimes5() {
2879 global_epilogue_callback_status *= 5; 2883 global_epilogue_callback_status *= 5;
2880 } 2884 }
2881 2885
2882 2886
2883 TEST_CASE(AddGarbageCollectionCallbacks) { 2887 TEST_CASE(AddGarbageCollectionCallbacks) {
2888 // Prologue callback addition testing.
2889
2884 // Add a prologue callback. 2890 // Add a prologue callback.
2885 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); 2891 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
2886 2892
2887 // Add the same prologue callback again. This is an error. 2893 // Add the same prologue callback again. This is an error.
2888 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2))); 2894 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)));
2889 2895
2890 // Add another prologue callback. 2896 // Add another prologue callback. This is an error.
2891 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)); 2897 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)));
2892 2898
2893 // Add the same prologue callback again. This is an error. 2899 // Epilogue callback addition testing.
2894 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)));
2895 2900
2896 // Add an epilogue callback. 2901 // Add an epilogue callback.
2897 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); 2902 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
2898 2903
2899 // Add the same epilogue callback again. This is an error. 2904 // Add the same epilogue callback again. This is an error.
2900 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4))); 2905 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)));
2901 2906
2902 // Add annother epilogue callback. 2907 // Add annother epilogue callback. This is an error.
2903 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
2904
2905 // Add the same epilogue callback again. This is an error.
2906 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5))); 2908 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5)));
2907 } 2909 }
2908 2910
2909 2911
2910 TEST_CASE(RemoveGarbageCollectionCallbacks) { 2912 TEST_CASE(RemoveGarbageCollectionCallbacks) {
2913 // Prologue callback removal testing.
2914
2911 // Remove a prologue callback that has not been added. This is an error. 2915 // Remove a prologue callback that has not been added. This is an error.
2912 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2))); 2916 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)));
2913 2917
2914 // Add a prologue callback. 2918 // Add a prologue callback.
2915 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); 2919 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
2916 2920
2917 // Remove a prologue callback. 2921 // Remove a prologue callback.
2918 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)); 2922 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
2919 2923
2920 // Remove a prologue callback again. This is an error. 2924 // Remove a prologue callback again. This is an error.
2921 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2))); 2925 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)));
2922 2926
2923 // Add two prologue callbacks. 2927 // Add a prologue callback.
2924 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); 2928 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
2925 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
2926 2929
2927 // Remove two prologue callbacks. 2930 // Remove a prolog callback that was not added. This is an error.
2928 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3)); 2931 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3)));
2929 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
2930 2932
2931 // Remove epilogue callbacks again. This is an error. 2933 // Epilogue callback removal testing.
2934
2935 // Remove epilogue callback that was not added. This is an error.
2932 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); 2936 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
2933 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
2934 2937
2935 // Remove a epilogue callback that has not been added. This is an error. 2938 // Add an epilogue callback.
2936 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
2937
2938 // Add a epilogue callback.
2939 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); 2939 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
2940 2940
2941 // Remove a epilogue callback. 2941 // Remove an epilogue callback.
2942 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)); 2942 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
2943 2943
2944 // Remove a epilogue callback again. This is an error. 2944 // Remove an epilogue callback again. This is an error.
2945 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); 2945 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
2946 2946
2947 // Add two epilogue callbacks. 2947 // Add an epilogue callbacks.
2948 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); 2948 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
2949 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
2950 2949
2951 // Remove two epilogue callbacks. 2950 // Remove an epilogue callback that was not added. This is an error.
2952 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)); 2951 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
2953 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)); 2952 }
2954 2953
2955 // Remove epilogue callbacks again. This is an error. 2954
2956 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4))); 2955 TEST_CASE(SetGarbageCollectionCallbacks) {
2957 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5))); 2956 // GC callback addition testing.
2957
2958 // Add GC callbacks.
2959 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
2960 &EpilogueCallbackTimes4));
2961
2962 // Add the same callbacks again. This is an error.
2963 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
2964 &EpilogueCallbackTimes4)));
2965
2966 // Add another callback. This is an error.
2967 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes3,
2968 &EpilogueCallbackTimes5)));
2969
2970 // GC callback removal testing.
2971
2972 // Remove GC callbacks.
2973 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
2974
2975 // Remove GC callbacks whennone exist. This is an error.
2976 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, NULL)));
2977
2978 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
2979 &EpilogueCallbackTimes4));
2980 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, NULL)));
2981 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, &EpilogueCallbackTimes4)));
2958 } 2982 }
2959 2983
2960 2984
2961 TEST_CASE(SingleGarbageCollectionCallback) { 2985 TEST_CASE(SingleGarbageCollectionCallback) {
2962 // Add a prologue callback. 2986 // Add a prologue callback.
2963 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)); 2987 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
2988 &EpilogueCallbackNOP));
2964 2989
2965 // Garbage collect new space ignoring callbacks. This should not 2990 // Garbage collect new space ignoring callbacks. This should not
2966 // invoke the prologue callback. No status values should change. 2991 // invoke the prologue callback. No status values should change.
2967 global_prologue_callback_status = 3; 2992 global_prologue_callback_status = 3;
2968 global_epilogue_callback_status = 7; 2993 global_epilogue_callback_status = 7;
2969 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); 2994 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
2970 EXPECT_EQ(3, global_prologue_callback_status); 2995 EXPECT_EQ(3, global_prologue_callback_status);
2971 EXPECT_EQ(7, global_epilogue_callback_status); 2996 EXPECT_EQ(7, global_epilogue_callback_status);
2972 2997
2973 // Garbage collect new space invoking callbacks. This should 2998 // Garbage collect new space invoking callbacks. This should
(...skipping 21 matching lines...) Expand all
2995 EXPECT_EQ(6, global_prologue_callback_status); 3020 EXPECT_EQ(6, global_prologue_callback_status);
2996 EXPECT_EQ(7, global_epilogue_callback_status); 3021 EXPECT_EQ(7, global_epilogue_callback_status);
2997 3022
2998 // Garbage collect old space again. Callbacks are persistent so the 3023 // Garbage collect old space again. Callbacks are persistent so the
2999 // prologue status value should change again. 3024 // prologue status value should change again.
3000 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 3025 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3001 EXPECT_EQ(12, global_prologue_callback_status); 3026 EXPECT_EQ(12, global_prologue_callback_status);
3002 EXPECT_EQ(7, global_epilogue_callback_status); 3027 EXPECT_EQ(7, global_epilogue_callback_status);
3003 3028
3004 // Add an epilogue callback. 3029 // Add an epilogue callback.
3005 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)); 3030 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
3031 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2,
3032 &EpilogueCallbackTimes4));
3006 3033
3007 // Garbage collect new space. This should not invoke the prologue 3034 // Garbage collect new space. This should not invoke the prologue
3008 // or the epilogue callback. No status values should change. 3035 // or the epilogue callback. No status values should change.
3009 global_prologue_callback_status = 3; 3036 global_prologue_callback_status = 3;
3010 global_epilogue_callback_status = 7; 3037 global_epilogue_callback_status = 7;
3011 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); 3038 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
3012 EXPECT_EQ(3, global_prologue_callback_status); 3039 EXPECT_EQ(3, global_prologue_callback_status);
3013 EXPECT_EQ(7, global_epilogue_callback_status); 3040 EXPECT_EQ(7, global_epilogue_callback_status);
3014 3041
3015 // Garbage collect new space. This should invoke the prologue and 3042 // Garbage collect new space. This should invoke the prologue and
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3047 3074
3048 // Garbage collect old space. No callbacks should be invoked. No 3075 // Garbage collect old space. No callbacks should be invoked. No
3049 // status values should change. 3076 // status values should change.
3050 global_prologue_callback_status = 3; 3077 global_prologue_callback_status = 3;
3051 global_epilogue_callback_status = 7; 3078 global_epilogue_callback_status = 7;
3052 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 3079 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3053 EXPECT_EQ(3, global_prologue_callback_status); 3080 EXPECT_EQ(3, global_prologue_callback_status);
3054 EXPECT_EQ(7, global_epilogue_callback_status); 3081 EXPECT_EQ(7, global_epilogue_callback_status);
3055 } 3082 }
3056 3083
3057 TEST_CASE(MultipleGarbageCollectionCallbacks) {
3058 // Add prologue callbacks.
3059 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
3060 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
3061
3062 // Add an epilogue callback.
3063 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
3064
3065 // Garbage collect new space. This should not invoke the prologue
3066 // or epilogue callbacks. No status values should change.
3067 global_prologue_callback_status = 3;
3068 global_epilogue_callback_status = 7;
3069 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
3070 EXPECT_EQ(3, global_prologue_callback_status);
3071 EXPECT_EQ(7, global_epilogue_callback_status);
3072
3073 // Garbage collect old space. This should invoke both prologue
3074 // callbacks and the epilogue callback. The prologue and epilogue
3075 // status values should change.
3076 global_prologue_callback_status = 3;
3077 global_epilogue_callback_status = 7;
3078 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3079 EXPECT_EQ(18, global_prologue_callback_status);
3080 EXPECT_EQ(28, global_epilogue_callback_status);
3081
3082 // Add another GC epilogue callback.
3083 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
3084
3085 // Garbage collect old space. This should invoke both prologue
3086 // callbacks and both epilogue callbacks. The prologue and epilogue
3087 // status values should change.
3088 global_prologue_callback_status = 3;
3089 global_epilogue_callback_status = 7;
3090 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3091 EXPECT_EQ(18, global_prologue_callback_status);
3092 EXPECT_EQ(140, global_epilogue_callback_status);
3093
3094 // Remove an epilogue callback.
3095 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
3096
3097 // Garbage collect old space. This should invoke both prologue
3098 // callbacks and the remaining epilogue callback. The prologue and
3099 // epilogue status values should change.
3100 global_prologue_callback_status = 3;
3101 global_epilogue_callback_status = 7;
3102 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3103 EXPECT_EQ(18, global_prologue_callback_status);
3104 EXPECT_EQ(35, global_epilogue_callback_status);
3105
3106 // Remove the remaining epilogue callback.
3107 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5));
3108
3109 // Garbage collect old space. This should invoke both prologue
3110 // callbacks. The prologue status value should change.
3111 global_prologue_callback_status = 3;
3112 global_epilogue_callback_status = 7;
3113 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3114 EXPECT_EQ(18, global_prologue_callback_status);
3115 EXPECT_EQ(7, global_epilogue_callback_status);
3116
3117 // Remove a prologue callback.
3118 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3));
3119
3120 // Garbage collect old space. This should invoke the remaining
3121 // prologue callback. The prologue status value should change.
3122 global_prologue_callback_status = 3;
3123 global_epilogue_callback_status = 7;
3124 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3125 EXPECT_EQ(6, global_prologue_callback_status);
3126 EXPECT_EQ(7, global_epilogue_callback_status);
3127
3128 // Remove the remaining prologue callback.
3129 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
3130
3131 // Garbage collect old space. No callbacks should be invoked. No
3132 // status values should change.
3133 global_prologue_callback_status = 3;
3134 global_epilogue_callback_status = 7;
3135 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3136 EXPECT_EQ(3, global_prologue_callback_status);
3137 EXPECT_EQ(7, global_epilogue_callback_status);
3138 }
3139
3140 3084
3141 // Unit test for creating multiple scopes and local handles within them. 3085 // Unit test for creating multiple scopes and local handles within them.
3142 // Ensure that the local handles get all cleaned out when exiting the 3086 // Ensure that the local handles get all cleaned out when exiting the
3143 // scope. 3087 // scope.
3144 UNIT_TEST_CASE(LocalHandles) { 3088 UNIT_TEST_CASE(LocalHandles) {
3145 TestCase::CreateTestIsolate(); 3089 TestCase::CreateTestIsolate();
3146 Isolate* isolate = Isolate::Current(); 3090 Isolate* isolate = Isolate::Current();
3147 EXPECT(isolate != NULL); 3091 EXPECT(isolate != NULL);
3148 ApiState* state = isolate->api_state(); 3092 ApiState* state = isolate->api_state();
3149 EXPECT(state != NULL); 3093 EXPECT(state != NULL);
(...skipping 4986 matching lines...) Expand 10 before | Expand all | Expand 10 after
8136 NewString("main"), 8080 NewString("main"),
8137 1, 8081 1,
8138 dart_args); 8082 dart_args);
8139 int64_t value = 0; 8083 int64_t value = 0;
8140 result = Dart_IntegerToInt64(result, &value); 8084 result = Dart_IntegerToInt64(result, &value);
8141 EXPECT_VALID(result); 8085 EXPECT_VALID(result);
8142 EXPECT_EQ(6, value); 8086 EXPECT_EQ(6, value);
8143 } 8087 }
8144 8088
8145 } // namespace dart 8089 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/gc_callbacks.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698