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

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

Issue 9605033: Implement a garbage collection prologue and epilogue callback mechanism. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: fix grammar Created 8 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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 #include "platform/assert.h" 6 #include "platform/assert.h"
7 #include "platform/utils.h" 7 #include "platform/utils.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/dart_api_state.h" 10 #include "vm/dart_api_state.h"
(...skipping 1628 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 1639
1640 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 1640 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1641 } 1641 }
1642 1642
1643 // All weak references except weak3 should be preserved. 1643 // All weak references except weak3 should be preserved.
1644 EXPECT(!Dart_IsNull(weak1)); 1644 EXPECT(!Dart_IsNull(weak1));
1645 EXPECT(!Dart_IsNull(weak2)); 1645 EXPECT(!Dart_IsNull(weak2));
1646 EXPECT(Dart_IsNull(weak3)); 1646 EXPECT(Dart_IsNull(weak3));
1647 } 1647 }
1648 1648
1649
1650 static int global_prologue_callback_status;
1651
1652
1653 static void PrologueCallbackTimes2() {
1654 global_prologue_callback_status *= 2;
1655 }
1656
1657
1658 static void PrologueCallbackTimes3() {
1659 global_prologue_callback_status *= 3;
1660 }
1661
1662
1663 static int global_epilogue_callback_status;
1664
1665
1666 static void EpilogueCallbackTimes4() {
1667 global_epilogue_callback_status *= 4;
1668 }
1669
1670
1671 static void EpilogueCallbackTimes5() {
1672 global_epilogue_callback_status *= 5;
1673 }
1674
1675
1676 TEST_CASE(AddGarbageCollectionCallbacks) {
1677 // Add a prologue callback.
1678 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
1679
1680 // Add the same prologue callback again. This is an error.
1681 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2)));
1682
1683 // Add another prologue callback.
1684 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
1685
1686 // Add the same prologue callback again. This is an error.
1687 EXPECT(Dart_IsError(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3)));
1688
1689 // Add an epilogue callback.
1690 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
1691
1692 // Add the same epilogue callback again. This is an error.
1693 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4)));
1694
1695 // Add annother epilogue callback.
1696 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
1697
1698 // Add the same epilogue callback again. This is an error.
1699 EXPECT(Dart_IsError(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5)));
1700 }
1701
1702
1703 TEST_CASE(RemoveGarbageCollectionCallbacks) {
1704 // Remove a prologue callback that has not been added. This is an error.
1705 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)));
1706
1707 // Add a prologue callback.
1708 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
1709
1710 // Remove a prologue callback.
1711 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
1712
1713 // Remove a prologue callback again. This is an error.
1714 EXPECT(Dart_IsError(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2)));
1715
1716 // Add two prologue callbacks.
1717 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
1718 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
1719
1720 // Remove two prologue callbacks.
1721 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3));
1722 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
1723
1724 // Remove epilogue callbacks again. This is an error.
1725 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
1726 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
1727
1728 // Remove a epilogue callback that has not been added. This is an error.
1729 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
1730
1731 // Add a epilogue callback.
1732 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
1733
1734 // Remove a epilogue callback.
1735 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
1736
1737 // Remove a epilogue callback again. This is an error.
1738 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
1739
1740 // Add two epilogue callbacks.
1741 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
1742 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
1743
1744 // Remove two epilogue callbacks.
1745 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5));
1746 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
1747
1748 // Remove epilogue callbacks again. This is an error.
1749 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4)));
1750 EXPECT(Dart_IsError(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5)));
1751 }
1752
1753
1754 TEST_CASE(SingleGarbageCollectionCallback) {
1755 // Add a prologue callback.
1756 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
1757
1758 // Garbage collect new space. This should not invoke the prologue
1759 // callback. No status values should change.
1760 global_prologue_callback_status = 3;
1761 global_epilogue_callback_status = 7;
1762 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
1763 EXPECT_EQ(3, global_prologue_callback_status);
1764 EXPECT_EQ(7, global_epilogue_callback_status);
1765
1766 // Garbage collect old space. This should invoke the prologue
1767 // callback. The prologue status value should change.
1768 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1769 EXPECT_EQ(6, global_prologue_callback_status);
1770 EXPECT_EQ(7, global_epilogue_callback_status);
1771
1772 // Garbage collect old space again. Callbacks are persistent so the
1773 // prolog status value should change again.
1774 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1775 EXPECT_EQ(12, global_prologue_callback_status);
1776 EXPECT_EQ(7, global_epilogue_callback_status);
1777
1778 // Add an epilogue callback.
1779 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
1780
1781 // Garbage collect new space. This should not invoke the prologue
1782 // or the epilogue callback. No status values should change.
1783 global_prologue_callback_status = 3;
1784 global_epilogue_callback_status = 7;
1785 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
1786 EXPECT_EQ(3, global_prologue_callback_status);
1787 EXPECT_EQ(7, global_epilogue_callback_status);
1788
1789 // Garbage collect old space. This should invoke the prologue and
1790 // the epilogue callbacks. The prologue and epilogue status values
1791 // should change.
1792 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1793 EXPECT_EQ(6, global_prologue_callback_status);
1794 EXPECT_EQ(28, global_epilogue_callback_status);
1795
1796 // Garbage collect old space again. Callbacks are persistent so the
1797 // prologue and epilogue status values should change again.
1798 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1799 EXPECT_EQ(12, global_prologue_callback_status);
1800 EXPECT_EQ(112, global_epilogue_callback_status);
1801
1802 // Remove the prologue and epilogue callbacks
1803 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
1804 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
1805
1806 // Garbage collect old space. No callbacks should be invoked. No
1807 // status values should change.
1808 global_prologue_callback_status = 3;
1809 global_epilogue_callback_status = 7;
1810 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1811 EXPECT_EQ(3, global_prologue_callback_status);
1812 EXPECT_EQ(7, global_epilogue_callback_status);
1813 }
1814
1815 TEST_CASE(MultipleGarbageCollectionCallbacks) {
1816 // Add prologue callbacks.
1817 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes2));
1818 EXPECT_VALID(Dart_AddGcPrologueCallback(&PrologueCallbackTimes3));
1819
1820 // Add an epilogue callback.
1821 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes4));
1822
1823 // Garbage collect new space. This should not invoke the prologue
1824 // or epilogue callbacks. No status values should change.
1825 global_prologue_callback_status = 3;
1826 global_epilogue_callback_status = 7;
1827 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
1828 EXPECT_EQ(3, global_prologue_callback_status);
1829 EXPECT_EQ(7, global_epilogue_callback_status);
1830
1831 // Garbage collect old space. This should invoke both prologue
1832 // callbacks and the epilogue callback. The prologue and epilogue
1833 // status values should change.
1834 global_prologue_callback_status = 3;
1835 global_epilogue_callback_status = 7;
1836 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1837 EXPECT_EQ(18, global_prologue_callback_status);
1838 EXPECT_EQ(28, global_epilogue_callback_status);
1839
1840 // Add another GC epilogue callback.
1841 EXPECT_VALID(Dart_AddGcEpilogueCallback(&EpilogueCallbackTimes5));
1842
1843 // Garbage collect old space. This should invoke both prologue
1844 // callbacks and both epilogue callbacks. The prologue and epilogue
1845 // status values should change.
1846 global_prologue_callback_status = 3;
1847 global_epilogue_callback_status = 7;
1848 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1849 EXPECT_EQ(18, global_prologue_callback_status);
1850 EXPECT_EQ(140, global_epilogue_callback_status);
1851
1852 // Remove an epilogue callback.
1853 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes4));
1854
1855 // Garbage collect old space. This should invoke both prologue
1856 // callbacks and the remaining epilogue callback. The prologue and
1857 // epilogue status values should change.
1858 global_prologue_callback_status = 3;
1859 global_epilogue_callback_status = 7;
1860 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1861 EXPECT_EQ(18, global_prologue_callback_status);
1862 EXPECT_EQ(35, global_epilogue_callback_status);
1863
1864 // Remove the remaining epilogue callback.
1865 EXPECT_VALID(Dart_RemoveGcEpilogueCallback(&EpilogueCallbackTimes5));
1866
1867 // Garbage collect old space. This should invoke both prologue
1868 // callbacks. The prologue status value should change.
1869 global_prologue_callback_status = 3;
1870 global_epilogue_callback_status = 7;
1871 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1872 EXPECT_EQ(18, global_prologue_callback_status);
1873 EXPECT_EQ(7, global_epilogue_callback_status);
1874
1875 // Remove a prologue callback.
1876 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes3));
1877
1878 // Garbage collect old space. This should invoke the remaining
1879 // prologue callback. The prologue status value should change.
1880 global_prologue_callback_status = 3;
1881 global_epilogue_callback_status = 7;
1882 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1883 EXPECT_EQ(6, global_prologue_callback_status);
1884 EXPECT_EQ(7, global_epilogue_callback_status);
1885
1886 // Remove the remaining prologue callback.
1887 EXPECT_VALID(Dart_RemoveGcPrologueCallback(&PrologueCallbackTimes2));
1888
1889 // Garbage collect old space. No callbacks should be invoked. No
1890 // status values should change.
1891 global_prologue_callback_status = 3;
1892 global_epilogue_callback_status = 7;
1893 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1894 EXPECT_EQ(3, global_prologue_callback_status);
1895 EXPECT_EQ(7, global_epilogue_callback_status);
1896 }
1897
1649 #endif 1898 #endif
1650 1899
1651 1900
1652 // Unit test for creating multiple scopes and local handles within them. 1901 // Unit test for creating multiple scopes and local handles within them.
1653 // Ensure that the local handles get all cleaned out when exiting the 1902 // Ensure that the local handles get all cleaned out when exiting the
1654 // scope. 1903 // scope.
1655 UNIT_TEST_CASE(LocalHandles) { 1904 UNIT_TEST_CASE(LocalHandles) {
1656 TestCase::CreateTestIsolate(); 1905 TestCase::CreateTestIsolate();
1657 Isolate* isolate = Isolate::Current(); 1906 Isolate* isolate = Isolate::Current();
1658 EXPECT(isolate != NULL); 1907 EXPECT(isolate != NULL);
(...skipping 2343 matching lines...) Expand 10 before | Expand all | Expand 10 after
4002 // We should have received the expected number of interrupts. 4251 // We should have received the expected number of interrupts.
4003 EXPECT_EQ(kInterruptCount, interrupt_count); 4252 EXPECT_EQ(kInterruptCount, interrupt_count);
4004 4253
4005 // Give the spawned thread enough time to properly exit. 4254 // Give the spawned thread enough time to properly exit.
4006 Isolate::SetInterruptCallback(saved); 4255 Isolate::SetInterruptCallback(saved);
4007 } 4256 }
4008 4257
4009 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 4258 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
4010 4259
4011 } // namespace dart 4260 } // 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