)]}'
{
  "log": [
    {
      "commit": "5450f86b31287173278513eb8b4c8e73b9fdd3ae",
      "tree": "adfd4a7a9cd2fb1d5ef7dbf724b12bbd6f0baeb5",
      "parents": [
        "cdf19c84e8c10f5afa079790e5a2b0a55a3599e9"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Mar 07 23:05:08 2017 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Mar 07 23:24:50 2017 -0800"
      },
      "message": "Fix leak of bionic TLS when threads are detached.\n\n__pthread_internal_free doesn\u0027t happen on threads that are detached,\ncausing the bionic TLS allocation (and guard pages) to be leaked.\n\nFix the leak, and name the allocations to make things apparent if this\never happens again.\n\nBug: http://b/36045112\nTest: manually ran a program that detached empty threads\nChange-Id: Id1c7852b7384474244f7bf5a0f7da54ff962e0a1\n"
    },
    {
      "commit": "5e2285d3ccdbb64a49ad2e5e521f50c897a3954d",
      "tree": "cd56c251f1710652fad3b84121248a12071b42e0",
      "parents": [
        "c9a840ac76c7cdbe6028ac91cdb8eb6698f0a854"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Feb 22 12:19:05 2017 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Feb 22 16:05:03 2017 -0800"
      },
      "message": "Allocate thread local buffers in __init_tls.\n\nThread local buffers were using pthread_setspecific for storage with\nlazy initialization. pthread_setspecific shares TLS slots between the\nlinker and libc.so, so thread local buffers being initialized in a\ndifferent order between libc.so and the linker meant that bad things\nwould happen (manifesting as snprintf not working because the\nlocale was mangled)\n\nBug: http://b/20464031\nTest: /data/nativetest64/bionic-unit-tests/bionic-unit-tests\n      everything passes\nTest: /data/nativetest/bionic-unit-tests/bionic-unit-tests\n      thread_local tests are failing both before and after (KUSER_HELPERS?)\nTest: /data/nativetest64/bionic-unit-tests-static/bionic-unit-tests-static\n      no additional failures\nChange-Id: I9f445a77c6e86979f3fa49c4a5feecf6ec2b0c3f\n"
    },
    {
      "commit": "11859d467c035081f8acafeaf0184b670cd41c48",
      "tree": "36afb3b9c9bbff69d83945e7ab08b7687908f74c",
      "parents": [
        "132768084e24119c337e56fd110b97a23e5593c2"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 13 17:59:29 2017 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Feb 13 17:59:29 2017 -0800"
      },
      "message": "Be more strict about using invalid `pthread_t`s.\n\nAnother release, another attempt to remove the global thread list.\n\nBut this time, let\u0027s admit that it\u0027s not going away. We can switch to using\na read/write lock for the global thread list, and to aborting rather than\nquietly returning ESRCH if we\u0027re given an invalid pthread_t.\n\nThis change affects pthread_detach, pthread_getcpuclockid,\npthread_getschedparam/pthread_setschedparam, pthread_join, and pthread_kill:\ninstead of returning ESRCH when passed an invalid pthread_t, if you\u0027re\ntargeting O or above, they\u0027ll abort with the message \"attempt to use\ninvalid pthread_t\".\n\nNote that this doesn\u0027t change behavior as much as you might think: the old\nlookup only held the global thread list lock for the duration of the lookup,\nso there was still a race between that and the dereference in the caller,\ngiven that callers actually need the tid to pass to some syscall or other,\nand sometimes update fields in the pthread_internal_t struct too.\n\n(This patch replaces such users with calls to pthread_gettid_np, which\nat least makes the TOCTOU window smaller.)\n\nWe can\u0027t check thread-\u003etid against 0 to see whether a pthread_t is still\nvalid because a dead thread gets its thread struct unmapped along with its\nstack, so the dereference isn\u0027t safe.\n\nTaking the affected functions one by one:\n\n    * pthread_getcpuclockid and pthread_getschedparam/pthread_setschedparam\n      should be fine. Unsafe calls to those seem highly unlikely.\n\n    * Unsafe pthread_detach callers probably want to switch to\n      pthread_attr_setdetachstate instead, or using\n      pthread_detach(pthread_self()) from the new thread\u0027s start routine\n      rather than doing the detach in the parent.\n\n    * pthread_join calls should be safe anyway, because a joinable thread\n      won\u0027t actually exit and unmap until it\u0027s joined. If you\u0027re joining an\n      unjoinable thread, the fix is to stop marking it detached. If you\u0027re\n      joining an already-joined thread, you need to rethink your design.\n\n    * Unsafe pthread_kill calls aren\u0027t portably fixable. (And are obviously\n      inherently non-portable as-is.) The best alternative on Android is to\n      use pthread_gettid_np at some point that you know the thread to be\n      alive, and then call kill/tgkill directly.\n\n      That\u0027s still not completely safe because if you\u0027re too late, the tid\n      may have been reused, but then your code is inherently unsafe anyway.\n\nBug: http://b/19636317\nTest: ran tests\nChange-Id: I0372c4428e8a7f1c3af5c9334f5d9c25f2c73f21\n"
    },
    {
      "commit": "7484c21c4c352a2200d94939fabc10d1bd3f0723",
      "tree": "fe089ec40970a76f11107534632b1fc5789660ed",
      "parents": [
        "b0e8c565a622b5519e03d4416b0b5b1a5f20d7f5"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 02 02:41:38 2017 +0000"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 02 02:41:38 2017 +0000"
      },
      "message": "Revert \"Remove the global thread list.\"\n\nThis reverts commit b0e8c565a622b5519e03d4416b0b5b1a5f20d7f5.\n\nBreaks swiftshader (http:/b/34883464).\n\nChange-Id: I7b21193ba8a78f07d7ac65e41d0fe8516940a83b\n"
    },
    {
      "commit": "b0e8c565a622b5519e03d4416b0b5b1a5f20d7f5",
      "tree": "8362f2754276b72e79a652885be7379127ca6e07",
      "parents": [
        "fb07c36bc061db4ca5d8348ff6bc1e60b6c53191"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 04 14:12:54 2017 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Sat Jan 07 14:16:46 2017 -0800"
      },
      "message": "Remove the global thread list.\n\nAnother release, another attempt to fix this bug.\n\nThis change affects pthread_detach, pthread_getcpuclockid,\npthread_getschedparam/pthread_setschedparam, pthread_join, and pthread_kill:\ninstead of returning ESRCH when passed an invalid pthread_t, they\u0027ll now SEGV.\n\nNote that this doesn\u0027t change behavior as much as you might think: the old\nlookup only held the global thread list lock for the duration of the lookup,\nso there was still a race between that and the dereference in the caller,\ngiven that callers actually need the tid to pass to some syscall or other,\nand sometimes update fields in the pthread_internal_t struct too.\n\nWe can\u0027t check thread-\u003etid against 0 to see whether a pthread_t is still\nvalid because a dead thread gets its thread struct unmapped along with its\nstack, so the dereference isn\u0027t safe.\n\nTaking the affected functions one by one:\n\n* pthread_getcpuclockid and pthread_getschedparam/pthread_setschedparam\n  should be fine. Unsafe calls to those seem highly unlikely.\n\n* Unsafe pthread_detach callers probably want to switch to\n  pthread_attr_setdetachstate instead, or using pthread_detach(pthread_self())\n  from the new thread\u0027s start routine rather than doing the detach in the\n  parent.\n\n* pthread_join calls should be safe anyway, because a joinable thread won\u0027t\n  actually exit and unmap until it\u0027s joined. If you\u0027re joining an\n  unjoinable thread, the fix is to stop marking it detached. If you\u0027re\n  joining an already-joined thread, you need to rethink your design.\n\n* Unsafe pthread_kill calls aren\u0027t portably fixable. (And are obviously\n  inherently non-portable as-is.) The best alternative on Android is to\n  use pthread_gettid_np at some point that you know the thread to be alive,\n  and then call kill/tgkill directly. That\u0027s still not completely safe\n  because if you\u0027re too late, the tid may have been reused, but then your\n  code is inherently unsafe anyway.\n\nIf we find too much code is still broken, we can come back and disable\nthe global thread list lookups for anything targeting \u003e\u003d O and then have\nanother go at really removing this in P...\n\nBug: http://b/19636317\nTest: N6P boots, bionic tests pass\nChange-Id: Ia92641212f509344b99ee2a9bfab5383147fcba6\n"
    },
    {
      "commit": "cb728e6f63e90405223e2a72f119967368f78b7a",
      "tree": "2b43dfd6050c9858c98bc3428e4207b417274fc3",
      "parents": [
        "b36efa4343d79e3fb548d12d039193850246b892"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 15 13:56:37 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 15 14:21:28 2016 -0700"
      },
      "message": "Fix instances of \u0027#if __i386__\u0027.\n\nTriggers -Wundef, which is on in -Weverything.\n\nBug: http://b/31496165\nChange-Id: Ie2241b19abd6257bebf68baa3ecc4de8066c722e\n"
    },
    {
      "commit": "b36efa4343d79e3fb548d12d039193850246b892",
      "tree": "727ac48a5341d8d50d6a297fe67f6067005befd3",
      "parents": [
        "56228373014e5ee0a3ff32930df9cfa05fef7389"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 15 13:55:41 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 15 14:21:28 2016 -0700"
      },
      "message": "Fix instances of \u0027#if __LP64__\u0027.\n\nTriggers -Wundef, which is on in -Weverything.\n\nBug: http://b/31496165\nChange-Id: Ib06107073f7dd1d584c19c222d0430da9d35630b\n"
    },
    {
      "commit": "4159e866ab7b2397e714d7a1b309c5e6719c4620",
      "tree": "82b27430fff08a08a81d94d9b5283fdc1d6d63fe",
      "parents": [
        "bfad958982a6b1c8c957c0eb951826d0c369eedd"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Sep 01 22:58:44 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Tue Sep 06 12:12:19 2016 -0700"
      },
      "message": "Initialize main thread TLS before the global stack guard.\n\nThe GCE breakage caused by 78a52f19bb207d1c736f1d5362e01f338d78645 was\ndue to TLS_SLOT_SELF being uninitialized before the use of errno by\nsyscall. Separate stack guard initialization from TLS initialization so\nthat stack guard initialization can make syscalls.\n\nBug: http://b/29622562\nBug: http://b/31251721\nChange-Id: Id0e4379e0efb7194a2df7bd16211ff11c6598033\n"
    },
    {
      "commit": "b6453c52ac55f85d7f88f04db6e320825cea9bf7",
      "tree": "b1ecbacb334303b5e0e0c2773700977eeb97b574",
      "parents": [
        "1089afb744de588d841ffdeed158dbcd113a8e02"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Wed Jun 29 16:47:53 2016 -0700"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Jun 30 12:58:32 2016 -0700"
      },
      "message": "Only initialize the global stack protector once.\n\nBefore, dynamic executables would initialize the global stack protector\ntwice, once for the linker, and once for the executable. This worked\nbecause the result was the same for both initializations, because it\nused getauxval(AT_RANDOM), which won\u0027t be the case once arc4random gets\nused for it.\n\nBug: http://b/29622562\nChange-Id: I7718b1ba8ee8fac7127ab2360cb1088e510fef5c\nTest: ran the stack protector tests on angler (32/64bit, static/dynamic)\n"
    },
    {
      "commit": "01b85d5df3744449471b327d7afd6c1d5854bd11",
      "tree": "826bb1a5645bcfc2198815af06e35bd0573c4260",
      "parents": [
        "4c3cf4ad4d0b04d36b9e2ec3efeb0147f9c02dd3"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Feb 09 22:44:16 2016 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Feb 09 22:44:16 2016 -0800"
      },
      "message": "Set x86 TLS limit to 0xfffff, not PAGE_SIZE.\n\nNot least because we set limit_in_pages to 1. PAGE_SIZE pages was never\nanyone\u0027s intention.\n\nChange-Id: Ide867f44a2fb20d4d5d0cd67ced468e8665a0193\n"
    },
    {
      "commit": "304348af197f30b3bf0e0764b97eb9699a376c68",
      "tree": "5a20f5c4c690072b852144b7e502bca4270f26cb",
      "parents": [
        "22dca83e1c37d3b465b9fa432bbf7cb4bd0df868"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Dec 03 13:01:42 2015 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Dec 03 16:51:20 2015 -0800"
      },
      "message": "Clear pthread_internal_t allocated on user provided stack.\n\nSeveral parts in pthread_internal_t should be initialized\nto zero, like tls, key_data and thread_local_dtors. So\njust clear the whole pthread_internal_t is more convenient.\n\nBug: 25990348\nChange-Id: Ibb6d1200ea5e6e1afbc77971f179197e8239f6ea\n"
    },
    {
      "commit": "d26e780df66b9add4cf7e7ebb2f6c6749d1c5050",
      "tree": "117eec6a39195e7edd7ead370513436698734abc",
      "parents": [
        "5edf077c5b92f0db212e45ed5402339a6e4c7334"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Oct 22 20:07:56 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Oct 22 20:14:33 2015 -0700"
      },
      "message": "Use bionic lock in pthread_internal_t.\n\nIt removes calling to pthread_mutex_lock() at the beginning of new\nthread, which helps to support thread sanitizer.\n\nChange-Id: Ia3601c476de7976a9177b792bd74bb200cee0e13\n"
    },
    {
      "commit": "eeb6b57e750220edc0b489fae11837bc73fa7a45",
      "tree": "37501ce3a57a038a4b36324bf3dbc32194b0d429",
      "parents": [
        "77455f85ab46bed6dc5f7246b474ede44ae9ede2"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 01 23:48:39 2015 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 01 23:48:39 2015 -0700"
      },
      "message": "Name the thread stack and signal stack guard pages.\n\nBug: http://b/22228722\nChange-Id: I1dae672e386e404fb304a34496a29fe21134c784\n"
    },
    {
      "commit": "ef115003012f61cf5539fdfeb201b98e4a92f610",
      "tree": "d546925be11de056c9c2611fb75d91273cd10303",
      "parents": [
        "8225ad63fac7c5cc298884c101a344959b87dc39"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Mon Mar 30 20:03:57 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Mon Mar 30 20:51:39 2015 -0700"
      },
      "message": "Revert \"Revert \"add guard pages to the internal signal stacks\"\"\n\nThis reverts commit a3125fd1396a09a7fc4872dc4653f342150a3deb.\nAnd Fix the prctl() problem that cause system crash.\n\nChange-Id: Icc8d12d848cfba881a7984ca2827fd81be41f9fd\n"
    },
    {
      "commit": "a3125fd1396a09a7fc4872dc4653f342150a3deb",
      "tree": "5042f453214b2d176c601710c87350c30c7f3944",
      "parents": [
        "595752f623ae88f7e4193a6e531a0805f1c6c4dc"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Mar 31 02:42:39 2015 +0000"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Mar 31 02:42:39 2015 +0000"
      },
      "message": "Revert \"add guard pages to the internal signal stacks\"\n\nThis reverts commit 595752f623ae88f7e4193a6e531a0805f1c6c4dc.\n\nChange-Id: Iefa66e9049ca0424e53cd5fc320d161b93556dcb\n"
    },
    {
      "commit": "595752f623ae88f7e4193a6e531a0805f1c6c4dc",
      "tree": "2a8d25e25b042f04146725c7a287619e2892940c",
      "parents": [
        "203082b8217cd853eee510ad371b382701960610"
      ],
      "author": {
        "name": "Daniel Micay",
        "email": "danielmicay@gmail.com",
        "time": "Sun Mar 29 00:03:55 2015 -0400"
      },
      "committer": {
        "name": "Daniel Micay",
        "email": "danielmicay@gmail.com",
        "time": "Mon Mar 30 17:13:20 2015 -0400"
      },
      "message": "add guard pages to the internal signal stacks\n\nSignal handlers tend to be lean, but can still overflow the (tiny)\nstack.\n\nChange-Id: Ia21c6453d92a9f8d1536ad01ff26a1a84c05f8fb\n"
    },
    {
      "commit": "799cb35f45a161de96b272de38724f77e988f5f3",
      "tree": "2bb1b0a74646c3295d8b862019431e78e08f975f",
      "parents": [
        "0c3b632bd6570064bab1055d2b8a51cfb85e60bb"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Mar 25 16:18:21 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Mar 25 16:18:21 2015 -0700"
      },
      "message": "Fix in error handling in pthread_create.cpp.\n\nIt is due to a previous change \"Let g_thread_list_lock only protect g_thread_list\".\nWe need to add the newly created thread to thread_list even if\n__init_thread fails, so the thread can exit successfully.\n\nChange-Id: I0332df11acfdd181350bcc092b12d90d679057a4\n"
    },
    {
      "commit": "93d44ff2a6e0febe18d42d5690e85023545318b4",
      "tree": "0145c42a21091f0a160129bd2978e9a7baefe543",
      "parents": [
        "32b039e46eee4d40b9979eab873a957e86fbf969",
        "673b15e4ee2c6d99b150aedddc0f389e29f98e1b"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Mar 24 02:39:50 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Mar 24 02:39:51 2015 +0000"
      },
      "message": "Merge \"Let g_thread_list_lock only protect g_thread_list.\""
    },
    {
      "commit": "673b15e4ee2c6d99b150aedddc0f389e29f98e1b",
      "tree": "edc101b54c689960bdf1262e6378b21082d3e277",
      "parents": [
        "4149dc944bbe3c5f1c14fc998106975e68bdd6bf"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Mar 19 14:19:19 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Mon Mar 23 19:03:49 2015 -0700"
      },
      "message": "Let g_thread_list_lock only protect g_thread_list.\n\nAs glibc/netbsd don\u0027t protect access to thread struct members by a global\nlock, we don\u0027t want to do it either. This change reduces the\nresponsibility of g_thread_list_lock to only protect g_thread_list.\n\nBug: 19636317\nChange-Id: I897890710653dac165d8fa4452c7ecf74abdbf2b\n"
    },
    {
      "commit": "a2db50d5d7fa67b297eddd1c0549f08ea4b6a950",
      "tree": "e3b0bb4b01b2b7caf8f5f0ad5be05517592915fb",
      "parents": [
        "4149dc944bbe3c5f1c14fc998106975e68bdd6bf"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Fri Mar 20 10:58:04 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Fri Mar 20 14:41:52 2015 -0700"
      },
      "message": "Fix alignment error for pthread_internal_t/pthread stack.\n\naligned attribute can only control compiler\u0027s behavior, but we\nare manually allocating pthread_internal_t. So we need to make\nsure of alignment manually.\n\nChange-Id: Iea4c46eadf10dfd15dc955c5f41cf6063cfd8536\n"
    },
    {
      "commit": "58cf31b50699ed9f523de38c8e943f3bbd1ced9e",
      "tree": "258ba808074bd047a94df452a4e465db66136797",
      "parents": [
        "e86a86f9f24df7028d2596c69ff008cf88e039e4"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Fri Mar 06 17:23:53 2015 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Mar 12 21:39:49 2015 -0700"
      },
      "message": "Make pthread join_state not protected by g_thread_list_lock.\n\n1. Move the representation of thread join_state from pthread.attr.flag\n   to pthread.join_state. This clarifies thread state change.\n2. Use atomic operations for pthread.join_state. So we don\u0027t need to\n   protect it by g_thread_list_lock. g_thread_list_lock will be reduced\n   to only protect g_thread_list or even removed in further changes.\n\nBug: 19636317\nChange-Id: I31fb143a7c69508c7287307dd3b0776993ec0f43\n"
    },
    {
      "commit": "5e2bd719d7dd19afe55f8d4f24366c0230e0e6c7",
      "tree": "14589a831046110c8cc6221cd1ee90226e899b4b",
      "parents": [
        "04bbef377b9941bf6d67d9c515b6640a314fb032"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Fri Feb 20 16:15:33 2015 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Mar 03 15:46:53 2015 -0800"
      },
      "message": "Refactor pthread_key.cpp to be lock-free.\n\nChange-Id: I20dfb9d3cdc40eed10ea12ac34f03caaa94f7a49\n"
    },
    {
      "commit": "05fc1d7050d5451aea08dc5f504d2670287b2d43",
      "tree": "fa1d81b61b303ee8ed94c511cc08b8f40ed6624b",
      "parents": [
        "43606bc1ce974e4ba42d7d2c3682ad5182e6fc96"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 28 18:02:33 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 28 19:23:11 2015 -0800"
      },
      "message": "Add missing includes.\n\nChange-Id: Ibf549266a19a67eb9158d341a69dddfb654be669\n"
    },
    {
      "commit": "8b5df3920f2843c9cdf04160517c1e8b77c992f5",
      "tree": "a0a678ee8f107e5c25f937f444a970a0539d2af7",
      "parents": [
        "2a8c929aaf8d34d2b6e89ed9c8b6da163316143e"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 21 16:19:07 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jan 21 17:09:58 2015 -0800"
      },
      "message": "Turn on -Wold-style-cast and fix the errors.\n\nA couple of dodgy cases where we cast away const, but otherwise pretty boring.\n\nChange-Id: Ibc39ebd525377792b5911464be842121c20f03b9\n"
    },
    {
      "commit": "917d390510e442b9b030d54992ebf41cc1e7f853",
      "tree": "fd11b414b2b5f550c20944d916b07533d125b061",
      "parents": [
        "b5e508cfee2355bad0502587e4fce8f4173584d6"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Jan 08 12:32:42 2015 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Jan 08 14:27:24 2015 -0800"
      },
      "message": "Make pthread stack size match real range.\n\nBug: 18908062\nChange-Id: I7037ac8273ebe54dd19b1561c7a376819049124c\n"
    },
    {
      "commit": "ba8dfc2669d658dc340eb8f9c9b40ca074f05047",
      "tree": "d8e34d3dd322641c80c2605457378afd60d0bdfb",
      "parents": [
        "597800f1d71590fc9ad51ce5227280586b2ceda5"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Jan 06 09:31:00 2015 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Jan 06 17:11:23 2015 -0800"
      },
      "message": "Remove PTHREAD_ATTR_FLAG_USER_ALLOCATED_STACK.\n\nPatch for https://android-review.googlesource.com/#/c/120844/.\n\nChange-Id: Idca5ccd7b28e8f07f1d2d1b6e3bba6781b62f0e0\n"
    },
    {
      "commit": "6a7aaf46759db32c6ed0eb953a4a230dc96af0d9",
      "tree": "89b9cbd40571d38d60c19730224c90efd0fb4ebf",
      "parents": [
        "a2177c6ccb65104659543c895b753458abfadcab"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Mon Dec 22 19:17:33 2014 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Fri Jan 02 14:33:48 2015 -0800"
      },
      "message": "Reserve enough user request stack space in pthread_create.\n\nBug: 18830897\nChange-Id: I1ba4aaeaf66a7ff99c5d82ad45469011171b0a3b\n"
    },
    {
      "commit": "8cf1b305670123aed7638d984ca39bfd22388440",
      "tree": "f8fc12a882822ca1ba41b68d84414e252faade9c",
      "parents": [
        "c631bb215e29981222f19c092ded49c7c1f15845"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Dec 03 21:36:24 2014 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Fri Dec 19 16:05:29 2014 -0800"
      },
      "message": "Use mmap to create the pthread_internal_t\n\nAdd name to mmaped regions.\nAdd pthread benchmark code.\nAllocate pthread_internal_t on regular stack.\n\nBug: 16847284\nChange-Id: Id60835163bb0d68092241f1a118015b5a8f85069\n"
    },
    {
      "commit": "6c238f2926e69a950f0671ae5519584c20d84196",
      "tree": "a3593ca9ef0940c7518e47632c67047ad89cad40",
      "parents": [
        "6d634f9baaf804a91c97e019c832c1e9611a903a"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Dec 11 20:50:41 2014 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Fri Dec 12 17:00:08 2014 -0800"
      },
      "message": "Fix pthread key num calculation.\n\nBug: 18723085\nChange-Id: Iba2c834b350e4cdba0b2d771b221560a3e5df952\n"
    },
    {
      "commit": "8574a0670bf698b8d2f817098f9d825c4be03a68",
      "tree": "f01c1cd0cab5ff4bad74f9be90cd1dc0cc822513",
      "parents": [
        "46d0b81a9465bf74fe44a881365c332dc6173f2f"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Mon Dec 01 22:37:56 2014 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Dec 02 10:39:25 2014 -0800"
      },
      "message": "Use mmap to create the pthread_internal_t.\n\nBug: 16847284\nChange-Id: I488fa236f57aa3acb29b4ffbbab2fab51b0653be\n"
    },
    {
      "commit": "5b8ceff5f87889e781c13305767e140afd28eb76",
      "tree": "ad95ccbfbc12b6a75ef56e6646cea4aee94b675c",
      "parents": [
        "cc5f6543e3f91385b9a912438965b7e8265df54a"
      ],
      "author": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Wed Nov 26 11:53:44 2014 +0000"
      },
      "committer": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Wed Nov 26 11:56:54 2014 +0000"
      },
      "message": "Revert \"Use mmap to create the pthread_internal_t.\"\n\nUnfortunately, this change provokes random crashes for ART, and\nI have seen libc crashes on the device that might be related to it.\n\nReverting it fixes the ART crashes. there is unfortunately no\nstack trace for the crashes, but just a \"Segmentation fault\" message.\n\n\nThis reverts commit cc5f6543e3f91385b9a912438965b7e8265df54a.\n\nChange-Id: I68dca8e1e9b9edcce7eb84596e8db619e40e8052"
    },
    {
      "commit": "cc5f6543e3f91385b9a912438965b7e8265df54a",
      "tree": "5176225b4d6b6f62ab590563022901042de44d8e",
      "parents": [
        "eb3a5e026e65ea80b17580a71f4451f5cf5d6612"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Nov 25 14:18:12 2014 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Nov 25 15:25:06 2014 -0800"
      },
      "message": "Use mmap to create the pthread_internal_t.\n\nBug: 16847284\nChange-Id: Ic8c85f95afac1d8422ecb69674c688d1fecb6a44\n"
    },
    {
      "commit": "40a521744825b6060960c296d5fb3da4c6593d94",
      "tree": "b9736886f5ca89daf4bf6cca05e090315a006dcd",
      "parents": [
        "4ad5066e1de326e5db46df18eeade9a88bc11bec"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 30 14:48:10 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 30 14:49:40 2014 -0700"
      },
      "message": "Only wipe TLS for user-supplied stacks.\n\nBug: 16667988\nChange-Id: Id180ab2bc6713e1612386120a306db5bbf1d6046\n"
    },
    {
      "commit": "e959a3b3157e38ebda4ce6f86efb5644faa4988b",
      "tree": "3e8e0aec84c044d4471cf76b0348aaccce7df1f8",
      "parents": [
        "cd23370ca737dffc49166f8aacd19a025e72266f"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jul 10 10:25:26 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jul 10 10:25:26 2014 -0700"
      },
      "message": "Remove the global lock around thread stack creation.\n\nThis lock has been here since the original commits, but as far as I can tell\nit never served any purpose. We\u0027ve never had a free list of cached stacks or\nanything like that.\n\nChange-Id: I9d665c7eaa9c699ce0659ffb111402a0239fe1f5\n"
    },
    {
      "commit": "e0f25dda3f38a70e5689e785597c5cf2b68bdcf8",
      "tree": "bacde97e2513770b1d9c9bfe76792f1e7c0d7d57",
      "parents": [
        "d028b6209cde7929e6d0613cbd92cc7b766d3d09"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 09 22:13:55 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 09 22:13:55 2014 -0700"
      },
      "message": "Remove the obsolete _thread_created_hook.\n\ngdb won\u0027t even try to use this on Android because it knows we don\u0027t\nsupport old enough kernels to need it.\n\nBug: 15470251\nChange-Id: Ia6d54585d888bbab8ee0490a148a1586b25437b9\n"
    },
    {
      "commit": "7086ad6919feb2415c6027163f5c63323bcca27c",
      "tree": "f32c06d513e90ba1fcb8fe56f9cd055cccc7d01b",
      "parents": [
        "d1bf37780d0bcaca3e6046171f958ebfea34bde1"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jun 19 16:39:01 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Jun 20 09:06:57 2014 -0700"
      },
      "message": "Cache getpid.\n\nIn practice, with this implementation we never need to make a system call.\nWe get the main thread\u0027s tid (which is the same as our pid) back from\nthe set_tid_address system call we have to make during initialization.\nA new pthread will have the same pid as its parent, and a fork child\u0027s\nmain (and only) thread will have a pid equal to its tid, which we get for\nfree from the kernel before clone returns.\n\nThe only time we\u0027d actually have to make a getpid system call now is if\nwe take a signal during fork and the signal handler calls getpid. (That,\nor we call getpid in the dynamic linker while it\u0027s still dealing with its\nown relocations and hasn\u0027t even set up the main thread yet.)\n\nBug: 15387103\nChange-Id: I6d4718ed0a5c912fc75b5f738c49a023dbed5189\n"
    },
    {
      "commit": "03eebcb6e8762e668a0d3af6bb303cccb88c5b81",
      "tree": "3c5053d90eb3d1fac8c21fa390367a911e188191",
      "parents": [
        "64dfbd242cddc3ef95576e27e3940d68b89b5fce"
      ],
      "author": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Fri Jun 13 13:57:51 2014 -0700"
      },
      "committer": {
        "name": "Christopher Ferris",
        "email": "cferris@google.com",
        "time": "Wed Jun 18 14:23:46 2014 -0700"
      },
      "message": "Move common macros into bionic_macros.h.\n\nBug: 15590152\nChange-Id: I730636613ef3653f68c5ab1d43b53beaf8e0dc25\n"
    },
    {
      "commit": "b30aff405a220495941f1673b0a5e66c4fa8b84c",
      "tree": "3bf667c009cf468c040ccaae6e81d468b4fd0254",
      "parents": [
        "52f74322b1d72d57146107f32ee2c76c421bf4b1"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed May 28 19:35:33 2014 +0000"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed May 28 18:31:15 2014 -0700"
      },
      "message": "Revert \"Revert \"Lose the hand-written futex assembler.\"\"\n\nThe problem with the original patch was that using syscall(3) means that\nerrno can be set, but pthread_create(3) was abusing the TLS errno slot as\na pthread_mutex_t for the thread startup handshake.\n\nThere was also a mistake in the check for syscall failures --- it should\nhave checked against -1 instead of 0 (not just because that\u0027s the default\nidiom, but also here because futex(2) can legitimately return values \u003e 0).\n\nThis patch stops abusing the TLS errno slot and adds a pthread_mutex_t to\npthread_internal_t instead. (Note that for LP64 sizeof(pthread_mutex_t) \u003e\nsizeof(uintptr_t), so we could potentially clobber other TLS slots too.)\n\nI\u0027ve also rewritten the LP32 compatibility stubs to directly reuse the\ncode from the .h file.\n\nThis reverts commit 75c55ff84ebfa686c7ae2cc8ee431c6a33bd46b4.\n\nBug: 15195455\nChange-Id: I6ffb13e5cf6a35d8f59f692d94192aae9ab4593d\n"
    },
    {
      "commit": "cd46104cf81aef14f9554bb4d9bced534a121471",
      "tree": "cc26d6481805b1d4d96089d57020976daa0b662d",
      "parents": [
        "15c13bd6cc0ce44d8f083f75d0bfa926a88cc169"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed May 14 10:58:58 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed May 14 10:58:58 2014 -0700"
      },
      "message": "Fix a typo in the big g_ search/replace.\n\nChange-Id: I79261de70d225236d0eadff288220258d697437f\n"
    },
    {
      "commit": "1728b2396591853345507a063ed6075dfd251706",
      "tree": "7083cd234073afa5179b94b3d978550c890af90c",
      "parents": [
        "bac795586bbc5dcbe886d8d781710f60c4c19d9b"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed May 14 10:02:03 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed May 14 10:02:03 2014 -0700"
      },
      "message": "Switch to g_ for globals.\n\nThat\u0027s what the Google style guide recommends, and we\u0027re starting\nto get a mix.\n\nChange-Id: Ib0c53a890bb5deed5c679e887541a715faea91fc\n"
    },
    {
      "commit": "0d236aa3f1e6d31b0c729448ae9d3ed1cad23fb4",
      "tree": "1370d62648bdbe2be69259ed593274d23851c8c6",
      "parents": [
        "8fa5c2528c04df00f9f9a3dc4047ae88d3f13524"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 09 14:42:16 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri May 09 17:06:51 2014 -0700"
      },
      "message": "Align the child stack in clone(2).\n\nAlso let clone(2) set the TLS for x86.\n\nAlso ensure we initialize the TLS before we clone(2) for all architectures.\n\nChange-Id: Ie5fa4466e1c9ee116a281dfedef574c5ba60c0b5\n"
    },
    {
      "commit": "b676aafad04f88e36658d4468054375158dbd3c1",
      "tree": "ba44c6f2c480d3078c2c7b5508f39848009af668",
      "parents": [
        "b64868a50715cfdb5c71d97144ba00acf78e2a76"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Apr 10 17:50:06 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Apr 10 17:50:06 2014 -0700"
      },
      "message": "Remove unnecessary #includes.\n\nChange-Id: Ie7e0c9ea03f35517c7dcf09fc808c12e55262bc1\n"
    },
    {
      "commit": "f2cea021ab2c6d7d7feeb40cca098aa132605876",
      "tree": "119daf06820264a62bf3290bbbf8839dcb0196e3",
      "parents": [
        "6ece7fc33a389ef9bcbe78a83a6633e4cb4e4743"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Mar 13 14:54:53 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Mar 13 14:54:53 2014 -0700"
      },
      "message": "Clean up \u003cstdio.h\u003e macros.\n\nAlso neuter __isthreaded.\n\nWe should come back to try to hide struct FILE\u0027s internals for LP64.\n\nBug: 3453512\nBug: 3453550\nChange-Id: I7e115329fb4579246a72fea367b9fc8cb6055d18\n"
    },
    {
      "commit": "af8aebebb52d73ea38c604525a6a5857618861cf",
      "tree": "b38fcd81c0a7b3c06f50767a571243d5b4fcc6fa",
      "parents": [
        "d971f7290529310df6f8d4ba8b3a30f629ba2946"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jan 14 17:16:18 2014 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jan 14 17:16:18 2014 -0800"
      },
      "message": "Move _thread_created_hook to where it belongs.\n\nChange-Id: I643d761c78ccaae25270aeffa2afb811c4e2fcd7\n"
    },
    {
      "commit": "80906141f79be8be63fc915bfab467029b442ca1",
      "tree": "791a682ab1dcb29efd3eeeac1f8eb3af0144466c",
      "parents": [
        "1c057607d89229f5effaf1acf2ecde24ece41389"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Nov 26 13:57:21 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Nov 26 13:57:21 2013 -0800"
      },
      "message": "Work around CLONE_SETTLS being weird on x86.\n\nUnlike other architectures, on x86 (but not x86-64), CLONE_SETTLS\ntakes a pointer to a struct user_desc instead of a pointer to the\nTLS itself. Rather than have to deal with this here, let\u0027s just use\nthe old __set_tls mechanism we used to use (and still use for the\nmain thread on all architectures, so it\u0027s not going away any time\nsoon).\n\nBug: 11826724\nChange-Id: I02a27939a73ae6cea1134a3f4c1dd7eafea479da\n"
    },
    {
      "commit": "cef3faec0ea40fdfe58e425fd0be64f00de6a26d",
      "tree": "1f33cbb2de225d0d76d3eb53ef8857b9ecc79bbe",
      "parents": [
        "1b2d214b62ad7bf46f37c79442a69d930aa29027"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Nov 19 16:52:24 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Nov 19 17:22:22 2013 -0800"
      },
      "message": "Clean up pthread_internal_t.\n\nBug: 11755300\nChange-Id: Ib509e8c5ec6b23513aa78b5ac5141d7c34ce2dc8\n"
    },
    {
      "commit": "877ec6d90418ff1d6597147d355a2229fdffae7e",
      "tree": "e475221a7fbff1564ad37548e920333c49cc5873",
      "parents": [
        "f246c589d66e5dc0e3cddc3c37261fb0e3fc67e9"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Nov 15 17:40:18 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Nov 18 19:48:11 2013 -0800"
      },
      "message": "Fix pthread_join.\n\nLet the kernel keep pthread_internal_t::tid updated, including\nacross forks and for the main thread. This then lets us fix\npthread_join to only return after the thread has really exited.\n\nAlso fix the thread attributes of the main thread so we don\u0027t\nunmap the main thread\u0027s stack (which is really owned by the\ndynamic linker and contains things like environment variables),\nwhich fixes crashes when joining with an exited main thread\nand also fixes problems reported publicly with accessing environment\nvariables after the main thread exits (for which I\u0027ve added a new\nunit test).\n\nIn passing I also fixed a bug where if the clone(2) inside\npthread_create(3) fails, we\u0027d unmap the child\u0027s stack and TLS (which\ncontains the mutex) and then try to unlock the mutex. Boom! It wasn\u0027t\nuntil after I\u0027d uploaded the fix for this that I came across a new\npublic bug reporting this exact failure.\n\nBug: 8206355\nBug: 11693195\nBug: https://code.google.com/p/android/issues/detail?id\u003d57421\nBug: https://code.google.com/p/android/issues/detail?id\u003d62392\nChange-Id: I2af9cf6e8ae510a67256ad93cad891794ed0580b\n"
    },
    {
      "commit": "e48b68570d872ef7ece1d873c0ea298ea76393f3",
      "tree": "8c6d8721af2bfddd2c649a0d887a4a905358da04",
      "parents": [
        "e39e3a77d6e8cf681718a572bc754fd64dfc87ff"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Nov 15 14:57:45 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Nov 15 14:57:45 2013 -0800"
      },
      "message": "Clean up the pthread_create trampoline.\n\nBug: 8206355\nBug: 11693195\nChange-Id: I35cc024d5b6ebd19d1d2e45610db185addaf45df\n"
    },
    {
      "commit": "70b24b1cc2a1a4436b1fea3f8b76616fdcb27224",
      "tree": "70c8e04ccd256eaeda3c7e516776f4c9bca25628",
      "parents": [
        "05ec00bf62ac168c9787a3d0640879ab3e502fe5"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Nov 15 11:51:07 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Nov 15 14:41:19 2013 -0800"
      },
      "message": "Switch pthread_create over to __bionic_clone.\n\nBug: 8206355\nBug: 11693195\nChange-Id: I04aadbc36c87e1b7e33324b9a930a1e441fbfed6\n"
    },
    {
      "commit": "c3f114037dbf028896310609fd28cf2b3da99c4d",
      "tree": "e463aeb3604177cd93cea8a58936a8dce4b34ee5",
      "parents": [
        "d0d0b52da375bfa85947a4257198791f615f18a8"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Oct 30 14:40:09 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Oct 31 12:31:16 2013 -0700"
      },
      "message": "\u003cpthread.h\u003e fixes and pthread cleanup.\n\n\u003cpthread.h\u003e was missing nonnull attributes, noreturn on pthread_exit,\nand had incorrect cv qualifiers for several standard functions.\n\nI\u0027ve also marked the non-standard stuff (where I count glibc rather\nthan POSIX as \"standard\") so we can revisit this cruft for LP64 and\ntry to ensure we\u0027re compatible with glibc.\n\nI\u0027ve also broken out the pthread_cond* functions into a new file.\n\nI\u0027ve made the remaining pthread files (plus ptrace) part of the bionic code\nand fixed all the warnings.\n\nI\u0027ve added a few more smoke tests for chunks of untested pthread functionality.\n\nWe no longer need the libc_static_common_src_files hack for any of the\npthread implementation because we long since stripped out the rest of\nthe armv5 support, and this hack was just to ensure that __get_tls in libc.a\nwent via the kernel if necessary.\n\nThis patch also finishes the job of breaking up the pthread.c monolith, and\nadds a handful of new tests.\n\nChange-Id: Idc0ae7f5d8aa65989598acd4c01a874fe21582c7\n"
    },
    {
      "commit": "2b6e43e00ece68b3aba26d8f95f07cd9d9294ab4",
      "tree": "7a27d206fb0f2ef7b702c0c785827d607dd7216a",
      "parents": [
        "8e6e7cdadbb4efdeefaa73fe94f7a9a1722745a7"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Oct 29 16:11:06 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Oct 29 16:11:06 2013 -0700"
      },
      "message": "Explain the sigprocmask in pthread_exit.\n\nAlso remove the SIGSEGV special case, which was probably because\nhand-written __exit_with_stack_teardown stubs used to try to cause\nSIGSEGV if the exit system call returned (which it never does, so\nthat dead code disappeared).\n\nAlso move the sigprocmask into the only case where it\u0027s necessary ---\nthe one where we unmap the stack that would be used by a signal\nhandler.\n\nChange-Id: Ie40d20c1ae2f5e7125131b6b492cba7a2c6d08e9\n"
    },
    {
      "commit": "98624c374646a050556bdc402b55b792fefa7e55",
      "tree": "a55bf0e44ee1613a4e0765482c77e5eb16368ac2",
      "parents": [
        "dc9d8d050a43e1cd32f1337e79187124bb15d938"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Oct 15 16:51:17 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Oct 15 16:51:17 2013 -0700"
      },
      "message": "Make pthread_create report sched_setscheduler failures on LP64.\n\nWe couldn\u0027t fix this for 32-bit because there\u0027s too much broken\ncode out there. (Pretty much everyone asks for real-time\nscheduling for all their threads, and the kernel says \"don\u0027t be\nstupid\".)\n\nChange-Id: I43c5271e6b6bb91278b9a19eec08cbf05391e3c4\n"
    },
    {
      "commit": "eb847bc8666842a3cfc9c06e8458ad1abebebaf0",
      "tree": "15e070fb706ba7599d5f402a8f934a7399541a6a",
      "parents": [
        "0c17099a71cb5d1b36b7aab66fd7341b3fc9106d"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Oct 09 15:50:50 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Oct 09 16:00:17 2013 -0700"
      },
      "message": "Fix x86_64 build, clean up intermediate libraries.\n\nThe x86_64 build was failing because clone.S had a call to __thread_entry which\nwas being added to a different intermediate .a on the way to making libc.so,\nand the linker couldn\u0027t guarantee statically that such a relocation would be\npossible.\n\n  ld: error: out/target/product/generic_x86_64/obj/STATIC_LIBRARIES/libc_common_intermediates/libc_common.a(clone.o): requires dynamic R_X86_64_PC32 reloc against \u0027__thread_entry\u0027 which may overflow at runtime; recompile with -fPIC\n\nThis patch addresses that by ensuring that the caller and callee end up in the\nsame intermediate .a. While I\u0027m here, I\u0027ve tried to clean up some of the mess\nthat led to this situation too. In particular, this removes libc/private/ from\nthe default include path (except for the DNS code), and splits out the DNS\ncode into its own library (since it\u0027s a weird special case of upstream NetBSD\ncode that\u0027s diverged so heavily it\u0027s unlikely ever to get back in sync).\n\nThere\u0027s more cleanup of the DNS situation possible, but this is definitely a\nstep in the right direction, and it\u0027s more than enough to get x86_64 building\ncleanly.\n\nChange-Id: I00425a7245b7a2573df16cc38798187d0729e7c4\n"
    },
    {
      "commit": "2a0b873065edb304fa2d1c54f8de663ea638b8ab",
      "tree": "4753b74b87e713379965bb051482036e6726afb1",
      "parents": [
        "777a4ee6771e6fe3362ef4f24244a44fcd0aabe4"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Oct 08 18:50:24 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Oct 09 13:39:13 2013 -0700"
      },
      "message": "Fix __errno for LP64 and clean up __get_tls.\n\nIf __get_tls has the right type, a lot of confusing casting can disappear.\n\nIt was probably a mistake that __get_tls was exposed as a function for mips\nand x86 (but not arm), so let\u0027s (a) ensure that the __get_tls function\nalways matches the macro, (b) that we have the function for arm too, and\n(c) that we don\u0027t have the function for any 64-bit architecture.\n\nChange-Id: Ie9cb989b66e2006524ad7733eb6e1a65055463be\n"
    },
    {
      "commit": "84114c8dd5b17efecf7988f263ce431208d7be5a",
      "tree": "81d4ae4e6a40c4255b2e76adeb2b68dab5932058",
      "parents": [
        "40e7a87864fee75f7af2caf8e1972d0d764135cd"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 17 13:33:19 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jul 17 13:33:19 2013 -0700"
      },
      "message": "Improve stack overflow diagnostics (take 2).\n\nThis reverts commits eb1b07469f2b5a392dc1bfd8adc211aea8c72bc5 and\nd14dc3b87fbf80553f1cafa453816b7f11366627, and fixes the bug where\nwe were calling mmap (which might cause errno to be set) before\n__set_tls (which is required to implement errno).\n\nBug: 8557703\nChange-Id: I2c36d00240c56e156e1bb430d8c22a73a068b70c\n"
    },
    {
      "commit": "d14dc3b87fbf80553f1cafa453816b7f11366627",
      "tree": "b1a26c875f451b79888f60cf73504aab799874e1",
      "parents": [
        "aa754dca90487356cabf07ade0e8d88c2630b784"
      ],
      "author": {
        "name": "Guang Zhu",
        "email": "guangzhu@google.com",
        "time": "Wed Jul 17 03:17:05 2013 +0000"
      },
      "committer": {
        "name": "Guang Zhu",
        "email": "guangzhu@google.com",
        "time": "Wed Jul 17 03:17:05 2013 +0000"
      },
      "message": "Revert \"Improve stack overflow diagnostics.\"\n\nThis reverts commit aa754dca90487356cabf07ade0e8d88c2630b784.\n\nChange-Id: Ifa76eee31f7f44075eb3a48554315b2693062f44\n"
    },
    {
      "commit": "aa754dca90487356cabf07ade0e8d88c2630b784",
      "tree": "b4cda0d4fa3935abd85b3ee178d35d0738e8a744",
      "parents": [
        "9562d38df1e4aba941b3433cfd0922fee5ea258b"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 16 13:14:24 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jul 16 13:14:24 2013 -0700"
      },
      "message": "Improve stack overflow diagnostics.\n\nWe notify debuggerd of problems by installing signal handlers. That\u0027s\nfine except for when the signal is caused by us running off the end of\na thread\u0027s stack and into the guard page.\n\nBug: 8557703\nChange-Id: I1ef65b4bb3bbca7e9a9743056177094921e60ed3\n"
    },
    {
      "commit": "b95cf0d23a1db3b7c37bd98b0c86196796c9b029",
      "tree": "f9e43cf229b0bfe58029dd5adbac739d18df6742",
      "parents": [
        "59ed029b286a1564f635377296e4f088e0fd2afa"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jul 15 14:51:07 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Mon Jul 15 14:51:07 2013 -0700"
      },
      "message": "Fix pthread_getattr_np, pthread_attr_setguardsize, and pthread_attr_setstacksize.\n\npthread_getattr_np was reporting the values supplied to us, not the values we\nactually used, which is kinda the whole point of pthread_getattr_np.\n\npthread_attr_setguardsize and pthread_attr_setstacksize were reporting EINVAL\nfor any size that wasn\u0027t a multiple of the system page size. This is\nunnecessary. We can just round like POSIX suggests and glibc already does.\n\nAlso improve the error reporting for pthread_create failures.\n\nChange-Id: I7ebc518628a8a1161ec72e111def911d500bba71\n"
    },
    {
      "commit": "0f020d18b138e24b1fe34074808e07ac412f35a4",
      "tree": "75e84d43c82a0e8013d7b1c34d4da1fec64e116c",
      "parents": [
        "6a44d2271f372d0c65b05a5d3377bd00ce92824e"
      ],
      "author": {
        "name": "msg555",
        "email": "msg555@gmail.com",
        "time": "Thu Jun 06 14:59:28 2013 -0400"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jun 12 17:30:58 2013 -0700"
      },
      "message": "Handles spurious wake-ups in pthread_join()\n\nRemoved \u0027join_count\u0027 from pthread_internal_t and switched to using the flag\nPTHREAD_ATTR_FLAG_JOINED to indicate if a thread is being joined. Combined with\na switch to a while loop in pthread_join, this fixes spurious wake-ups but\nprevents a thread from being joined multiple times. This is fine for\ntwo reasons:\n\n1) The pthread_join specification allows for undefined behavior when multiple\n   threads try to join a single thread.\n\n2) There is no thread safe way to allow multiple threads to join a single\n   thread with the pthread interface.  The second thread calling pthread_join\n   could be pre-empted until the thread is destroyed and its handle reused for\n   a different thread.  Therefore multi-join is always an error.\n\nBug: https://code.google.com/p/android/issues/detail?id\u003d52255\nChange-Id: I8b6784d47620ffdcdbfb14524e7402e21d46c5f7\n"
    },
    {
      "commit": "cfa089df23ff50fcd5ed3854c54991d30be5fc7e",
      "tree": "c64519db5533b9324efe7e4a712ba327860bbb9d",
      "parents": [
        "74b324ac09db35d29d16695e9b9c1f0601599812"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 29 16:35:00 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 29 16:35:00 2013 -0700"
      },
      "message": "Extra logging in pthread_create.\n\npthread_create returns EAGAIN when it can\u0027t allocate a pthread_internal_t,\nwhen it can\u0027t allocate a stack for the new thread, or when clone(2) fails\nbecause there are too many threads. It\u0027s useful to be able to know why your\npthread_create just failed, so add some logging.\n\nBug: 8470684\nChange-Id: I1bb4497d4f7528eacce0db35c2014771cba64569\n"
    },
    {
      "commit": "8f2a5a0b40fc82126c691d5c30131d908772aab7",
      "tree": "0b29a5dc82395c076387edb5af9ca271a91264c0",
      "parents": [
        "e23ed8c6441389a79c6504295184f7249e01a197"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 15 15:30:25 2013 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Mar 15 16:12:58 2013 -0700"
      },
      "message": "Clean up internal libc logging.\n\nWe only need one logging API, and I prefer the one that does no\nallocation and is thus safe to use in any context.\n\nAlso use O_CLOEXEC when opening the /dev/log files.\n\nMove everything logging-related into one header file.\n\nChange-Id: Ic1e3ea8e9b910dc29df351bff6c0aa4db26fbb58\n"
    },
    {
      "commit": "40eabe24e4e3ae8ebe437f1f4e43cf39cbba2e9e",
      "tree": "19eef7fcbba616a52bd37f4c83ece3e918b25445",
      "parents": [
        "3e3b239d2be0c5a92e91385f4f10b8f7da8d2837"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Feb 14 18:59:37 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Feb 15 12:08:59 2013 -0800"
      },
      "message": "Fix the pthread_setname_np test.\n\nFix the pthread_setname_np test to take into account that emulator kernels are\nso old that they don\u0027t support setting the name of other threads.\n\nThe CLONE_DETACHED thread is obsolete since 2.5 kernels.\n\nRename kernel_id to tid.\n\nFix the signature of __pthread_clone.\n\nClean up the clone and pthread_setname_np implementations slightly.\n\nChange-Id: I16c2ff8845b67530544bbda9aa6618058603066d\n"
    },
    {
      "commit": "4b4a8824289c48c823cd38bc63289d121aae3d67",
      "tree": "a1eaf7bd03b0588ada6dc30950f6f57a9164f8ea",
      "parents": [
        "991ee7d89574e8d04c8863a2850613073a2f96b3"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Feb 12 17:15:59 2013 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Feb 12 17:15:59 2013 -0800"
      },
      "message": "Clean up pthread_create.\n\nBug: 3461078\nChange-Id: I082122a86d7692cd58f4145539241be026258ee0\n"
    }
  ]
}
