)]}'
{
  "log": [
    {
      "commit": "270db1ce48377e3d9ca0c3dcec834ac807ca885b",
      "tree": "ffc553c6ff1ad37bdc3caca01ad686fa41ca0688",
      "parents": [
        "42b9c19772542457701d5efea26aae4449dec8c7"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Dec 03 12:20:01 2019 +0000"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Wed Dec 11 18:46:44 2019 +0000"
      },
      "message": "Revert^4 \"Allow structural redefinition on non-final classes.\"\n\nThis reverts commit 664999a12d6fc8a8ef5c0519b12ec1e8a51bb085.\n\nFixed issues with GC and quickened instructions in parent CLs.\n\nReason for revert: Fixed issues with GC CHECK fail and device SEGVs.\n\nTest: ./test.py --host\nTest: ./test.py --target\nBug: 134162467\nBug: 144168550\nChange-Id: Ibacddaf45beb72184f97d53d5d048bd442578658\n"
    },
    {
      "commit": "664999a12d6fc8a8ef5c0519b12ec1e8a51bb085",
      "tree": "f4ae1b0844ac075807229db9695ead7dec07ff8a",
      "parents": [
        "642af13b1b14794d8ab0db5cc82206213e648fa1"
      ],
      "author": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Tue Dec 03 08:47:26 2019 +0000"
      },
      "committer": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Tue Dec 03 08:47:45 2019 +0000"
      },
      "message": "Revert \"Revert^2 \"Allow structural redefinition on non-final classes.\"\"\n\nThis reverts commit f1b809ce611e943f926fff97cefe0930226ffcc2.\n\nReason for revert: Tests still fail\n\nBug: 134162467\nBug: 144168550\nChange-Id: Icdebc826b8630920b716afbfd6f338a29669fcc2\n"
    },
    {
      "commit": "f1b809ce611e943f926fff97cefe0930226ffcc2",
      "tree": "f75675383cf8018f9f333e608df35edbacf1c913",
      "parents": [
        "20b7a9b8aeaf76fc8f3248f211489fd00af73170"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Nov 26 18:52:06 2019 +0000"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Mon Dec 02 18:34:20 2019 +0000"
      },
      "message": "Revert^2 \"Allow structural redefinition on non-final classes.\"\n\nWe were incorrectly racing with the rest of the runtime in a couple of\nplaces. First we would return an ObjPtr of a newly defined class after\nholding it over a suspend point. This could lead to DefineClass\nreturning an obsolete class in some cases.\n\nWe also failed to ensure the class-status was synchronized between the\nold and new classes during structural redefinition. This could lead to\na class appearing to go backwards in status.\n\nThis reverts commit 88b1c83080afcb2bfb6f781ded1c90fe8f9eab4d.\n\nReason for revert: Fixed issues causing test failures.\n\nTest: ./test.py --host\nBug: 134162467\nBug: 144168550\n\nChange-Id: I4d0f7718490532f0ef14a9561b8e7000ef292b12\n"
    },
    {
      "commit": "88b1c83080afcb2bfb6f781ded1c90fe8f9eab4d",
      "tree": "e3ee63ccca83c60c5790e51610349889f44daacf",
      "parents": [
        "8e895008a3e2f2813bb46cb0c6bc76884e46e9ac"
      ],
      "author": {
        "name": "Roland Levillain",
        "email": "rpl@google.com",
        "time": "Tue Nov 26 14:13:44 2019 +0000"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Nov 26 15:55:26 2019 +0000"
      },
      "message": "Revert \"Allow structural redefinition on non-final classes.\"\n\nThis reverts commit c47040d31cbcd8cddd5fadb552b4f0f6c94b5bd0.\n\nReason for revert: Breaks ART tests (see e.g. b/145197371).\n\nBug: 145197371\nBug: 134162467\nBug: 144168550\nChange-Id: Ia8e5788655057e380fc723a38900d26d69cda938\n"
    },
    {
      "commit": "c47040d31cbcd8cddd5fadb552b4f0f6c94b5bd0",
      "tree": "50df569420cd6746daadf1487933719d1f86d66b",
      "parents": [
        "dc540dfffb6863177143d024dd6f491775d77585"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Wed Nov 13 09:33:52 2019 -0800"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Nov 26 02:11:19 2019 +0000"
      },
      "message": "Allow structural redefinition on non-final classes.\n\nThis adds support for structurally redefining non-final,\nnon-finalizable classes. The only restriction is that one cannot\nredefine a class at the same time as any of its supertypes, if a\nstructural redefinition is occurring. The structural redefinition may\nnot remove any fields or methods, change the superclass or change the\nimplemented interfaces. Adding new methods or fields, both static or\nnon-static, public, private, protected, or package-private, is\nsupported.\n\nTest: ./test.py --host\nBug: 134162467\nBug: 144168550\nChange-Id: I32e9e854b3e56270170b10e8f5aba9de8f6bfdfa\n"
    },
    {
      "commit": "c18eba327c4e207ff7b38817f097ee2220b44b39",
      "tree": "1978e64abd3e9fd3df99179f4a2110a724a9565f",
      "parents": [
        "371390f775c90b8b3df11a9890585598a2a39da9"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Sep 24 14:36:27 2019 -0700"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Fri Sep 27 17:08:33 2019 +0000"
      },
      "message": "Consolidate updating of reflective Field/Method references\n\nPreviously we used several different visitors to update Field \u0026\nMethod references for structural redefinition. We also did not visit\nor update JVMTI based references.\n\nThis consolidates all the visitors to a single\nRuntime::VisitReflectiveTargets function with a single\nReflectiveTargetVisitor type. This simplifies the code around\nstructural redefinition and ensures that the reflective value holders\nare in charge of the actual replacement.\n\nSupport was also added for walking internal openjdkjvmti references\nfor things like field-read/modification events.\n\nTest: ./test.py --host\nBug: 134162467\n\nChange-Id: Ic5fc1db7db0a30f947a1a67259dc024e149ebd57\n"
    },
    {
      "commit": "51d5a30592d1e6f6129cf8628178b201d345ce36",
      "tree": "87a652b43454b9fcf941388abfac3623cb19026b",
      "parents": [
        "ecd21be250c434d854833aa368610c879fea9245"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Apr 09 11:22:17 2019 -0700"
      },
      "committer": {
        "name": "Treehugger Robot",
        "email": "treehugger-gerrit@google.com",
        "time": "Tue Apr 09 22:44:09 2019 +0000"
      },
      "message": "Use unique mutex to synchronize runtime_callbacks\n\nInitially we would use the mutator_lock_ to manage changes to the\nruntime_callbacks list. Over time this stopped being sufficent. This\nchanges to using an explicit r/w mutex to manage these lists. Since\nthese callbacks are not modified very often we use a single mutex for\nall of them.\n\nTest: ./test.py --host\nTest: ./art/tools/run-libjdwp-tests.sh --mode\u003dhost\n\nBug: 121052811\nChange-Id: I3ca44402a5f6290701fa8e28d18e6afe8786214c\n"
    },
    {
      "commit": "3f1dcd39e134d994ac88dcc4f30ec8cabcd8decf",
      "tree": "365d20ad6b68ff1dbd4903764b63880324136e4d",
      "parents": [
        "0f0a4e40667c87fbd4ae5480eddbfd701bfabfa2"
      ],
      "author": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Fri Dec 28 09:39:56 2018 -0800"
      },
      "committer": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Wed Jan 02 10:32:25 2019 -0800"
      },
      "message": "ART: Move dex structs into own header\n\nSeparating out the structs from DexFile allows them to be forward-\ndeclared, which reduces the need to include the dex_file header.\n\nBug: 119869270\nTest: m\nChange-Id: I32dde5a632884bca7435cd584b4a81883de2e7b4\n"
    },
    {
      "commit": "5cc0e75552b379e051168d832474f4d3989e9f74",
      "tree": "c06f4bdb02252442fe68c2e978106862a0f93a1c",
      "parents": [
        "a344b8c25a98471d99632a28530b03ed770f8e2e"
      ],
      "author": {
        "name": "Charles Munger",
        "email": "clm@google.com",
        "time": "Fri Nov 09 12:30:46 2018 -0800"
      },
      "committer": {
        "name": "Charles Munger",
        "email": "clm@google.com",
        "time": "Mon Nov 12 17:32:59 2018 +0000"
      },
      "message": "Emit JVMTI events for LockSupport.park\n\nThis restores the behavior from when park was implemented with\nwait/notify, except that the blocker object is used as the monitor\nrather than the Thread that is parking.\n\nBug: 28845097\nTested: ./test/run-test --jvm 1931\n\nChange-Id: I523d719ca3e49a538c06f48f032b322fb91e147e\n"
    },
    {
      "commit": "f28586390b055a5681e50617d729a3fa09792d9c",
      "tree": "f213a9d41709dea55d2c0a9014423ac27d04e952",
      "parents": [
        "30a2d9c61da75359dee4ce90236d19fc6341b07a"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Mon Apr 02 11:28:50 2018 -0700"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Apr 03 15:51:41 2018 +0000"
      },
      "message": "Revert^6 \"Ensure that OSR still is possible with jvmti\"\n\nThe instrumentation uninstall could set methods to non-debuggable\nboot.oat code. This could cause events to be missed due to methods\nbeing inlined. We needed to change the path so that we would only have\nthe JIT/interpreter replace methods. We do this by adding a new\ncallback that can be used to determine if a method needs to be\ndebuggable and being more careful about replacing code when this is\ntrue.\n\nThis reverts commit 5f3005c8844d851d7d218b88b5f90d6c9083ce24.\nThis unreverts commit b9ad26d1ed9146b89555d4333021f44eeb831f05.\n\nReason for revert: Fixed issue causing CTS version of test 993 failure.\n\nTest: cts-tradefed run cts-dev CtsJvmtiRunTest993HostTestCases\nTest: ./test.py --host -j50 --all -t 993\nTest: ./test.py --host\nTest: while ./test/run-test --host --jit 1935; do; done\nTest: while ./test/run-test --host --jit --jvmti-redefine-stress 1935; do; done\nTest: am start --attach-agent -n com.example.android.displayingbitmaps/.ui.ImageGridActivity\n      Run blur filter.\nBug: 76226464\nBug: 77306669\n\nChange-Id: I5068201a03f7613787c66981405499b6499c24e1\n"
    },
    {
      "commit": "403207107da7f11525c4d305184c56b35ec1c17a",
      "tree": "f97f080fcfa8051df18536e97a33582ee4bbbc6a",
      "parents": [
        "ba3a790338725a37ecd4cb314c4a6147e29aef38"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Thu Dec 14 11:52:04 2017 -0800"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Dec 19 09:26:11 2017 -0800"
      },
      "message": "Add support for selecting alternate JDWP implementations\n\nChange JDWP options parsing to take place later and add a\n-XjdwpProvider:_ option that can be used by the runtime to select an\nappropriate JDWP provider. The argument is a string.\n\nIf \u0027none\u0027 is given JDWP will be totally disabled.\n\nIf \u0027internal\u0027 is given the current internal JDWP implementation is\nused.\n\nIf \u0027default\u0027 is given the \u0027internal\u0027 JDWP implementation will\ncurrently be used.\n\nOther values will be added in the future.\n\nAlso adds a runtime callback that will be invoked when the runtime\nwants to start or stop the debugger (namely at the post-zygote fork\nand just before exit) and check if a debugger is availible.\n\nAlso add \u0027-XjdwpOptions:_\u0027 in preparation for the eventual removal of\nthe existing -Xrunjdwp\u003d_ and -Xagentlib:jdwp\u003d_ as top-level options.\nAll of these options now store their arguments as a std::string to be\ninterpreted by the JDWP implementation as it sees fit. Also change the\njdwpOptions to default to transport\u003ddt_android_adb if there is not one\nspecified and it is available. This will make changing the default\ntransport based on the JDWP provider easier.\n\nThese new options are needed to allow us to support both the old,\ninternal, JDWP implementation as its replacement is tested and\nverified. This lets us switch between them with little difficulty.\n\nWe will probably remove one or both of these options once we have\nconfidence that the new jdwp implementation has stuck.\n\nTest: ./test.py --host -j50\nTest: ./test/run-test --host --debug 001-HelloWorld\nTest: Manual, flash walleye, debug app\n\nBug: 62821960\n\nChange-Id: Ie31db6b6f7d76a03d4ab8e178fcf298ed0eec203\n"
    },
    {
      "commit": "8c2b929696cac235e8fd8bf4cae0ca751603b570",
      "tree": "ef280c4ff76d44ba867d65564ec192ba4a90e874",
      "parents": [
        "a16fec549253638268dda3d83e6e34a500cbfc1c"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Thu Nov 09 13:21:01 2017 -0800"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Nov 14 17:09:35 2017 -0800"
      },
      "message": "Add JVMTI DDMS extension method and event.\n\nAdd a new jvmti extension method\n\u0027com.android.art.internal.ddm.process_chunk\u0027 that can be used to\nrequest that the system process a DDMS chunk with a given type and\ndata payload. It returns the processed chunk type and data. Agents can\nuse this to interact with DDMS.\n\nAlso add a new jvmti extension event\n\u0027com.android.art.internal.ddm.publish_chunk\u0027 that will be called\nwhenever the system wishes to send an unrequested chunk of data to be\nprocessed. This is triggered by code executing \u0027DdmServer#sendChunk\u0027\nor by other internal mechanisms.\n\nBoth of these extensions are provided mainly to aid in the maintenence\nof backwards compatibility with existing DDMS applications.  Generally\nagents should prefer to use the normal JVMTI events and controls over\ninterpreting DDMS data or calling DDMS functions.\n\nBug: 62821960\nTest: ./test.py --host -j50\nTest: ./art/tools/run-jdwp-tests.sh --mode\u003dhost \\\n            --test org.apache.harmony.jpda.tests.jdwp.DDM.DDMTest\nChange-Id: I39f22d3d096d12b59713ec7b8b0c08d0d68ff422\n"
    },
    {
      "commit": "0fa1786bdcc333873ed65a1f77a4669d5701ac5e",
      "tree": "3ee1a5ead68150d60c0a72efa4c85b7db5b3e689",
      "parents": [
        "0d2b2ad6cd9ca650d7a3f85a42afaf518cbfa4e0"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Oct 24 13:43:05 2017 -0700"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Mon Oct 30 09:43:57 2017 -0700"
      },
      "message": "Avoid JVMTI global deoptimization when possible\n\nThis changes the openjdkjvmti plugin to be more controlled about the\nsituations that it will deoptimize everything. Most notably this makes\nthe plugin deoptimize only individual methods for breakpoints instead\nof doing a full deoptimization. It also doesn\u0027t deoptimize for the\nJVMTI_EVENT_EXCEPTION method, since our throwing code will always send\nthe appropriate event.\n\nImpact:\n    Exoplayer benchmark with breakpointlogger setting a breakpoint on\n    a method that is never called.\n\n    The agent is the tools/breakpoint-logger agent.\n\n    \u0027art\u0027 options are for all runs were:\n        --64\n        -Xusejit:true\n        -Xcompiler-option --debuggable\n    \u0027art\u0027 options for \u0027Pre change\u0027 and \u0027Post change\u0027 runs included:\n        -Xplugin:libopenjdkjvmti.so\n        \u0027-agentpath:libbreakpointlogger.so\u003dLbenchmarks/common/java/BenchmarkBase;-\u003erun()V@0\u0027\n\n    Clean run (no agent loaded):\n        Running FMP4 x 1 : 53\n        Running TS x 1 : 144\n        Running FMP4 x 2500 : 3309\n        Running TS x 100 : 3584\n        ExoPlayerBench(RunTime): 6977000.0 us.\n    Pre change:\n        Running FMP4 x 1 : 159\n        Running TS x 1 : 9395\n        Running FMP4 x 2500 : 298591\n        Running TS x 100 : 944447\n        ExoPlayerBench(RunTime): 1.243226E9 us.\n    Post change:\n        Running FMP4 x 1 : 87\n        Running TS x 1 : 495\n        Running FMP4 x 2500 : 2939\n        Running TS x 100 : 3947\n        ExoPlayerBench(RunTime): 6979000.0 us.\n\n    Post change vs clean run is well within margin of error for this\n    benchmark.\n\nTest: ./test.py --host -j50\nTest: ./art/tools/run-prebuild-libjdwp-tests.sh\n\nBug: 62821960\nBug: 67958496\n\nChange-Id: I63ef04f71c36c34d8534651d0c075921a836ec08\n"
    },
    {
      "commit": "2161193652e925a2b450514f4e445ccd2fb660b3",
      "tree": "0fdbb54879de0b7b98509bede399cccfb0d4b34c",
      "parents": [
        "8b96c164a11284c07886fca9e4a4a0e15d33e816"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Sep 26 13:07:39 2017 -0700"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Wed Sep 27 14:32:20 2017 +0000"
      },
      "message": "Ensure that OSR doesn\u0027t break local-variable get/set\n\nWe had a bug where we would on-stack replace a method with a modified\nlocal variable. Thanks to inlining \u0026 load-store elimination of local\nvariable values this could cause the change to the variable to be lost.\nWe fixed this by giving plugins a way to notify the runtime they are\ninterested in a particular method.\n\nBug: 66959663\nBug: 66933582\n\nTest: while ./test/run-test --host --prebuild -O --jit 1935; do; done\nTest: ./test.py --host -j50\nChange-Id: Ic001b8a9d8d0bd9ce292e807752c86a505f85d36\n"
    },
    {
      "commit": "77fee87b262e969b29a9ac121a8bcbf87b68d9ce",
      "tree": "3280ba8d887045217bfbcb81eb624f571eeee7d0",
      "parents": [
        "ec995142998f6c7371734e6df95b5e2c80b18d27"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Sep 05 14:51:49 2017 -0700"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Thu Sep 14 09:57:03 2017 -0700"
      },
      "message": "Add support for JVMTI monitor events.\n\nAdds support for the JVMTI can_generate_monitor_events capability and\nall associated events. This adds support for the\nJVMTI_EVENT_MONITOR_WAIT, JVMTI_EVENT_MONITOR_WAITED,\nJVMTI_EVENT_MONITOR_CONTENDED_ENTER, and\nJVMTI_EVENT_MONITOR_CONTENDED_ENTERED events.\n\nBug: 65558434\nBug: 62821960\nBug: 34415266\n\nTest: ./test.py --host -j50\n\nChange-Id: I0fe8038e6c4249e77d37a67e5056b5d2a94b6f48\n"
    },
    {
      "commit": "d78ddec5f8eaf1f27e9043f6f42be90149ccb966",
      "tree": "e3c21f93e419ba35486cf8f641d816523a06b9a3",
      "parents": [
        "66f43b988ad84568a46c1760b314723e9229e6d0"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Tue Apr 18 15:20:38 2017 -0700"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Wed Apr 19 09:44:25 2017 -0700"
      },
      "message": "Implement can_generate_native_method_bind capability\n\nThis capability lets one observe and even replace the implementations\nof native methods when they are bound.\n\nTest: ./test.py --host -j40\n\nBug: 37432636\nChange-Id: I2432a8e4da1a677e8011ce495296f4ab9f42eb3e\n"
    },
    {
      "commit": "b0f1192bfac159008e1f2367751083740ba05698",
      "tree": "4b5d4385c27b600f5488962d0f7f6f00d9836843",
      "parents": [
        "a7e38d8aaacfca85b40b5df654f85c0979968672"
      ],
      "author": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Mon Jan 23 14:25:17 2017 -0800"
      },
      "committer": {
        "name": "Alex Light",
        "email": "allight@google.com",
        "time": "Mon Jan 23 14:44:23 2017 -0800"
      },
      "message": "Add ClassPreDefine hook.\n\nThis hook is called prior to defining a class for the first time. It\nallows callbacks to modify the dex-file used to load the class if they\nwish. The event handler is responsible for ensuring that the returned\ndex-file is set-up correctly.\n\nBug: 31684920\nTest: mma -j40 test-art-host\nChange-Id: Iaed79c1597913148ead795e033a0a10a4ebe6b2b\n"
    },
    {
      "commit": "4886411a81077e893a6e38c56938a252888ddd0e",
      "tree": "62f6effd04ae42206c76510ab64b5000b9c45a96",
      "parents": [
        "2c19ea93088d7cd187524f49137417279e99096d"
      ],
      "author": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Thu Jan 19 17:23:17 2017 -0800"
      },
      "committer": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Thu Jan 19 19:35:49 2017 -0800"
      },
      "message": "ART: Add runtime phase callback\n\nAdd callback that describes the current runtime phase, one of\nstarting, initialized and death. Add test.\n\nBug: 31684920\nTest: m test-art-host-gtest-runtime_callbacks_test\nChange-Id: I08ae7c45851572f8b3e446c07f0498f66bb032d3\n"
    },
    {
      "commit": "a5814f9de6009cc1763523109f50aae6bd1ff99e",
      "tree": "4b09ef54cd9db04dbf87ec8374d5cfc336f9c6ef",
      "parents": [
        "ac30fa2151095d2b5fe42f169a02ed09fea312b4"
      ],
      "author": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Wed Jan 18 21:43:16 2017 -0800"
      },
      "committer": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Thu Jan 19 16:09:02 2017 -0800"
      },
      "message": "ART: Add SigQuit Callback\n\nAdd callback being triggered when the runtime handles SigQuit.\n\nBug: 31684920\nTest: m test-art-host-gtest-runtime_callbacks_test\nChange-Id: I23e3b256c654b6078c79b3897439d893ea79d96e\n"
    },
    {
      "commit": "0f01b583c3952d0219696480654a0db8fac4b661",
      "tree": "33184022e0c9bc0a6af4d89b21864fd460f32df4",
      "parents": [
        "04bbb5be5b9c0f0b3a72116353d23ea63c8bc5e9"
      ],
      "author": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Wed Jan 18 15:22:37 2017 -0800"
      },
      "committer": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Thu Jan 19 15:12:12 2017 -0800"
      },
      "message": "ART: Add ClassLoadCallback\n\nAdd callback for class-load and class-prepare events. Move Dbg\nover. Add tests.\n\nBug: 31684920\nTest: m test-art-host-gtest-runtime_callbacks_test\nTest: art/tools/run-jdwp-tests.sh --mode\u003dhost\nChange-Id: I871f6b3c54448fd6ece8d9a7571b2042be50d525\n"
    },
    {
      "commit": "04bbb5be5b9c0f0b3a72116353d23ea63c8bc5e9",
      "tree": "51ee41e14d6bfccc88ccde91938cac901c0e39a9",
      "parents": [
        "a58bc2e74441ac89cb706b49c5a6d096df97080b"
      ],
      "author": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Thu Jan 19 17:49:03 2017 +0000"
      },
      "committer": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Thu Jan 19 15:12:06 2017 -0800"
      },
      "message": "Revert \"Revert \"ART: Start RuntimeCallbacks\"\"\n\nThis reverts commit bf6331a45f730e1f1044af2ce43bceda660ae6fc.\n\nSwitch to using the mutator lock.\n\nBug: 31684920\nTest: m test-art-host-gtest-runtime_callbacks_test\nTest: art/tools/run-jdwp-tests.sh --mode\u003dhost --debug\nChange-Id: I6ce0f71de2aa9f90cd23cfca7723a793b560b16b\n"
    },
    {
      "commit": "bf6331a45f730e1f1044af2ce43bceda660ae6fc",
      "tree": "66013474dc85b2a868d5fad2506c8674a086fa1a",
      "parents": [
        "13093d455b8266338fd713b04261c58e9dc2b164"
      ],
      "author": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Thu Jan 19 09:02:50 2017 +0000"
      },
      "committer": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Thu Jan 19 09:02:50 2017 +0000"
      },
      "message": "Revert \"ART: Start RuntimeCallbacks\"\n\njdwp tests failing with:\n    STDERR\u003e dalvikvm32 E 01-18 23:14:50 12180 12198 thread-inl.h:137] holding \"runtime callbacks lock\" at point where thread suspension is expected\n\nBug: 31684920\n\nThis reverts commit 13093d455b8266338fd713b04261c58e9dc2b164.\n\nChange-Id: I94e4154e273d006eecdd485607dcfd96392d6a00\n"
    },
    {
      "commit": "13093d455b8266338fd713b04261c58e9dc2b164",
      "tree": "b4c5e54ce8a74af2f8929df089133967ea7f7274",
      "parents": [
        "3a5e34b65727d2c9e7e6ebe45c337dae0d0398a4"
      ],
      "author": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Tue Jan 17 21:40:35 2017 -0800"
      },
      "committer": {
        "name": "Andreas Gampe",
        "email": "agampe@google.com",
        "time": "Wed Jan 18 19:48:37 2017 +0000"
      },
      "message": "ART: Start RuntimeCallbacks\n\nAdd a central RuntimeCallbacks structure to handle certain interesting\nruntime events.\n\nIn a first iteration, add ThreadLifecycleCallback with ThreadStart and\nThreadStop. Move Dbg over to ThreadLifecycleCallback.\n\nAdd a test.\n\nBug: 31684920\nTest: m test-art-host-gtest-runtime_callbacks_test\nTest: art/tools/run-jdwp-tests.sh --mode\u003dhost\nChange-Id: Ie0f77739a563207bfb4f04374e72dc6935c40b4f\n"
    }
  ]
}
