)]}'
{
  "log": [
    {
      "commit": "4956c372cf320328952665629b2626e7cbc84c54",
      "tree": "7a02304c6c2eadc93b1b7a357fb31a143b661a89",
      "parents": [
        "e592dacfa254f59bb097c98d118d0c860b181da1"
      ],
      "author": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Dec 19 16:35:51 2019 -0800"
      },
      "committer": {
        "name": "Josh Gao",
        "email": "jmgao@google.com",
        "time": "Thu Jan 02 14:09:50 2020 -0800"
      },
      "message": "Move bionic_macros.h from private to platform.\n\nTest: treehugger\nChange-Id: Ie473914f4c8924c7240b3ac22093a9daf42fc948\n"
    },
    {
      "commit": "aca110173fc26eb107a4d9055d8a65e1fa3b46c7",
      "tree": "348af3f8a0430695b03f1af73c07a73daff82d42",
      "parents": [
        "9586c0f4f421e63342074eeae9806cf11d622703"
      ],
      "author": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Thu Apr 18 17:50:22 2019 -0700"
      },
      "committer": {
        "name": "Ryan Prichard",
        "email": "rprichard@google.com",
        "time": "Fri Apr 19 17:16:25 2019 -0700"
      },
      "message": "Comment about lock destruction and unlocking\n\nAdd a couple of comments explaining that a mutex can be freed during\nthe unlock call, immediately after the unlock\u0027s atomic exchange call but\nbefore its futex wakeup call.\n\nBug: http://b/129744706\nTest: bionic unit tests\nChange-Id: I2d290ebde880f46866098d022720896039e7022e\n"
    },
    {
      "commit": "8c1a14d4f358a8135e0c0632da6d40c37192c0c2",
      "tree": "af9be5a543c0192df1cccedaac674d06bc809f5e",
      "parents": [
        "b656d4a1da35eac817950f906ce1c26259c05e82"
      ],
      "author": {
        "name": "Adrian-CJ Hung",
        "email": "adrian-cj.hung@mediatek.com",
        "time": "Wed Apr 03 10:39:15 2019 +0800"
      },
      "committer": {
        "name": "JeiFeng Lee",
        "email": "linger.lee@mediatek.com",
        "time": "Wed Apr 03 11:50:33 2019 +0800"
      },
      "message": "Workaround potential access to unmapped stack\n\nIssue:\nProcess is crashed near the end (startup_handshake_lock.unlock()) in\npthread_create().\n\nThe newly created child thread passes this handshake_lock unexpectedly\n\u003d\u003e its stack is unmapped \u0026 its associated pthread_internal_t data\nstructure can’t be accessed.\n\nAnalysis:\nThe created child thread should be blocked by startup_handshake_lock.lock()\nand enter __futex_wait_ex()\n\nBut if the parent thread is in the middle of startup_handshake_lock.unlock():\n\n  void unlock() {\n    if (atomic_exchange_explicit(\u0026state, Unlocked, memory_order_seq_cst) \u003d\u003d LockedWithWaiter) {  // \u003d\u003e the state is modified to Unlocked\n\n    // (a) if the child thread is back to running and pass the while() check in Lock::lock()\n    // (b) the child thread executes its start_routine and then pthread_exit\n    // (c) the stack of the child thread (where its pthread_internal_t (so the startup_handshake_lock) is located) will be unmapped\n\n     __futex_wake_ex(\u0026state, process_shared, 1);   // \u003d\u003e when the parent thread is back to running\n                                                   // the “state” \u0026 “process_shared” of startup_handshake_lock can’t be accessed (unmapped)\n                                                   // so the process will be crashed\n    }\n  }\n\nBug: 129744706\nTest: Monkey\nChange-Id: I55175e8c7ebc2b3b52de8a5602def0667076b974\n"
    },
    {
      "commit": "770032ddfa31f6ed18e6ec85013b7939cd291eb0",
      "tree": "28dc26ae8a6b3623e79d1bb2b19fd5362477843c",
      "parents": [
        "7bd54ade8d12762ef6bdb0096f3838261f14eee5"
      ],
      "author": {
        "name": "Chih-Hung Hsieh",
        "email": "chh@google.com",
        "time": "Wed Jan 02 10:59:48 2019 -0800"
      },
      "committer": {
        "name": "Chih-Hung Hsieh",
        "email": "chh@google.com",
        "time": "Wed Jan 02 11:04:05 2019 -0800"
      },
      "message": "Fix/suppress bionic google-explicit-constructor warnings\n\n* Add explicit to conversion constructors/operators\n\nBug: 28341362\nTest: make with WITH_TIDY\u003d1 DEFAULT_GLOBAL_TIDY_CHECKS\u003d-*,google-explicit-constructor\nChange-Id: Id1ad0327c1b8c6f094bcbb3ae599bc1f716b3f2f\n"
    },
    {
      "commit": "5e62b34c0d6fa545b487b9b64fb4a04a0589bc13",
      "tree": "e08ee44067b3b636ace11b21ec8d63a08d4d2a19",
      "parents": [
        "c89a3971e94c30611c885e4c440eae2fd9937948"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Oct 25 11:00:00 2018 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Oct 25 11:00:00 2018 -0700"
      },
      "message": "Clean up bionic_macros.h a bit.\n\nUse \u003candroid-base/macros.h\u003e instead where possible, and move the bionic\nmacros out of the way of the libbase ones. Yes, there are folks who manage\nto end up with both included at once (thanks OpenGL!), and cleaning that\nup doesn\u0027t seem nearly as practical as just making this change.\n\nBug: N/A\nTest: builds\nChange-Id: I23fc544f39d5addf81dc61471771a5438778895b\n"
    },
    {
      "commit": "6034ef85d86675d063d6b1920e85e4c471b95904",
      "tree": "717a7dfe7c2778a81919f04cccd1cbaf43f9297d",
      "parents": [
        "4cd3550d50cb14efe3d86ab9732ce75def5b85bd"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Feb 02 16:10:07 2018 -0800"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Feb 08 12:38:57 2018 -0800"
      },
      "message": "Add ability to read /etc/passwd and /etc/group\n\nAdd the capability to read /etc/passwd and /etc/group for getpw* and\ngetgr* functions.\n\nBug: 27999086\nTest: pwd, grp, grp_pwd_file unit tests\nTest: Read in custom users/groups from /etc/{passwd,group}\nChange-Id: Idc1f054af8a7ca34743a90493495f0ccc775a0d8\n"
    },
    {
      "commit": "ac49cedc7e2bab2073a0895ef01e31dac84f590b",
      "tree": "49713323bcf5e81e429e669e359bd99021d771e6",
      "parents": [
        "30438e4cea83628bcacbedff37a35398bb8b40e7"
      ],
      "author": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Thu Aug 17 13:18:52 2017 -0700"
      },
      "committer": {
        "name": "Tom Cherry",
        "email": "tomcherry@google.com",
        "time": "Fri Aug 18 09:11:05 2017 -0700"
      },
      "message": "Always use CLOCK_MONOTONIC for pthreads and semaphores\n\npthread\u0027s and semaphore\u0027s default behavior is to use CLOCK_REALTIME,\nhowever this behavior is essentially never intended, as that clock is\nprone to change discontinuously.\n\nWhat users really intend is to use CLOCK_MONOTONIC, however only\npthread_cond_timedwait() provides this as an option and even there, a\nlarge amount of existing code does not opt into CLOCK_MONOTONIC.\n\nWe have seen numerous bugs directly attributable to this difference.\nTherefore, we provide this general workaround to always use\nCLOCK_MONOTONIC for waiting, regardless of what the input timespec\nis.\n\nSpecifically this impacts the below APIs:\npthread_mutex_timedlock()\npthread_cond_timedwait()\npthread_rwlock_timedrdlock()\npthread_rwlock_timedwrlock()\nsem_timedwait()\n\nTest: boot bullhead, boot sailfish\nTest: bionic pthread/semaphore unit tests\nTest: check that pthread_cond_timedwait() timeouts are uneffected by\n      CLOCK_REALTIME time changes\n\nBug: 64694413\nBug: 64623895\nBug: 35756266\nBug: 35678943\nChange-Id: Ibba98f5d88be1c306d14e9b9366302ecbef6d534\n"
    },
    {
      "commit": "74ed96d59731aa3661494330804d866e825209d3",
      "tree": "fcb3c951345fcbd19e528bce9d7579077b9130b9",
      "parents": [
        "fb3219fbd1dbb0a369d52cbd0200330fd8852bc1",
        "c9a659c57b256001fd63f9825bde69e660c2655b"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Sat Nov 21 01:50:29 2015 +0000"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Sat Nov 21 01:50:29 2015 +0000"
      },
      "message": "Merge \"Use FUTEX_WAIT_BITSET to avoid converting timeouts.\""
    },
    {
      "commit": "c9a659c57b256001fd63f9825bde69e660c2655b",
      "tree": "74de618379f38c2726cc41956144f560dd6be9ea",
      "parents": [
        "b804b9d67b9e3a8c63471ff9892f6abea2a58684"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Nov 05 15:36:08 2015 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Thu Nov 19 13:42:03 2015 -0800"
      },
      "message": "Use FUTEX_WAIT_BITSET to avoid converting timeouts.\n\nAdd unittests for pthread APIs with timeout parameter.\n\nBug: 17569991\n\nChange-Id: I6b3b9b2feae03680654cd64c3112ce7644632c87\n"
    },
    {
      "commit": "fe3a83a9343f0e4ff654f09ef8ffc8a773c7c105",
      "tree": "092ca0be892463bc543eaaabc9feda130ad37fb1",
      "parents": [
        "b804b9d67b9e3a8c63471ff9892f6abea2a58684"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Nov 17 16:03:18 2015 -0800"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Nov 18 17:51:21 2015 -0800"
      },
      "message": "Implement pthread spin.\n\nIn order to run tsan unit tests, we need to support pthread spin APIs.\n\nBug: 18623621\nBug: 25392375\nChange-Id: Icbb4a74e72e467824b3715982a01600031868e29\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": "76615dae93c18ac890e167c547a08c0228709a33",
      "tree": "12a7e87c6fb332bebc087f43bcf29b2f7827571e",
      "parents": [
        "4bd8f9637daaada333ff35945b00cfe6cb822376"
      ],
      "author": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Tue Mar 17 14:22:09 2015 -0700"
      },
      "committer": {
        "name": "Yabin Cui",
        "email": "yabinc@google.com",
        "time": "Wed Apr 08 13:11:13 2015 -0700"
      },
      "message": "Provide writer preference option in rwlock.\n\nPrevious implementation of rwlock contains four atomic variables, which\nis hard to maintain and change. So I make following changes in this CL:\n\n1. Add pending flags in rwlock.state, so we don\u0027t need to synchronize\nbetween different atomic variables. Using compare_and_swap operations\non rwlock.state is enough for all state change.\n\n2. Add pending_lock to protect readers/writers waiting and wake up\noperations. As waiting/wakeup is not performance critical, using a\nlock is easier to maintain.\n\n3. Add writer preference option.\n\n4. Add unit tests for rwlock.\n\nBug: 19109156\n\nChange-Id: Idcaa58d695ea401d64445610b465ac5cff23ec7c\n"
    }
  ]
}
