)]}'
{
  "log": [
    {
      "commit": "454775d3cef84fa37045b2e9ea9891291853fc3b",
      "tree": "4c3154480681e9b49a2162d05fe93094d673e7f5",
      "parents": [
        "0e4f9a9b0b738187b8f8743ce2eed4e4468736e9"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Thu May 29 07:12:46 2014"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Thu May 29 07:13:11 2014"
      },
      "message": "Force use of version branch.\n"
    },
    {
      "commit": "0e4f9a9b0b738187b8f8743ce2eed4e4468736e9",
      "tree": "f4f365662f7be8aa2219f3b1861ff6a547007b18",
      "parents": [
        "29b2433e426b81be08e9834e0dbe7234add950db"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Fri May 31 00:38:18 2013"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Fri May 31 00:38:18 2013"
      },
      "message": "Fix race found by race detector, and reported by Dave Cheney.\n\nHere is more information than you\u0027ll want to know:\n\nIf goroutine 1 is doing:\n\n    t.Kill(nil)\n    t.Wait()\n\nand goroutine 2 is doing:\n\n    t.Wait()\n\nand goroutine 3 is doing:\n\n    t.Done()\n\nThere is a race, because goroutine 3 could finish first, and then\ngoroutine 1 might run, and the memory model won\u0027t guarantee that\ngoroutine 2 actually sees t.reason recorded by the Kill(nil) of\ngoroutine 1.\n\nThis specific case is more of a theoretical problem than a real one,\nfor the following reasons:\n\n- The memory model guarantees that the close(t.done) performed\n  by t.Done() will Happen Before the \u003c-t.done done by either t.Wait,\n  which means both goroutine 1 and 2 will always necessarily see a\n  real error coming out of the goroutine(s) being monitored by t.\n\n- The Kill(nil) performed by goroutine 1 won\u0027t affect the value\n  of t.reason due to the logic in the Kill method (although,\n  observing the memory model pedantically means goroutine 1 might\n  do whatever it pleases with the memory region, due to lack of\n  synchronization).\n\nIn a different scenario, though, t.Kill in goroutine 1 might be\nperformed with a non-nil error, and goroutine 2 would see either\nnil or the error, and t.reason might be in an intermediate unknown\nstate, so the race is in fact real. Solving this specific race via\na mutex, as done in this change, still won\u0027t mean that this\nbehavior is sane, though: what t.Wait() in goroutine 2 observes\nwill be either the prior error value, or the new error value,\nbased purely on timing of the two Wait calls.\n\nThe change introduced protects t.reason with the tomb\u0027s mutex,\nwhich silents the race detector, and makes the logic entirely\nmemory-model friendly.\n"
    },
    {
      "commit": "29b2433e426b81be08e9834e0dbe7234add950db",
      "tree": "ac8276a01a9643a87196cd885441fda277ad51c4",
      "parents": [
        "644a315bd4789da325ee86ba9964089947e22b2b"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Wed Apr 04 03:22:16 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Wed Apr 04 03:22:16 2012"
      },
      "message": "Added link to Roger\u0027s multi-goroutine example.\n"
    },
    {
      "commit": "644a315bd4789da325ee86ba9964089947e22b2b",
      "tree": "09d89b0b0d8eb8b737be88db2651a61b09d4f098",
      "parents": [
        "ec6cc4cb462b738b6223e2551b8678c7e7e52a9c"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 20:08:49 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 20:08:49 2012"
      },
      "message": "Fixed a couple of typos.\n"
    },
    {
      "commit": "ec6cc4cb462b738b6223e2551b8678c7e7e52a9c",
      "tree": "e2608fe2a8b597143f1bef1e892904162e8bc686",
      "parents": [
        "f45c1e0c477e9e6c8fe9d4e617ff8e653bbacb5d",
        "b44f4aac35cebee844cdf21b5f34b02fbd438f12"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 19:46:55 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 19:46:55 2012"
      },
      "message": "Added ErrDying. Renamed ErrStillRunning to ErrStillAlive.\n\nR\u003dTheMue\nCC\u003d\nhttps://codereview.appspot.com/5981052\n"
    },
    {
      "commit": "b44f4aac35cebee844cdf21b5f34b02fbd438f12",
      "tree": "e2608fe2a8b597143f1bef1e892904162e8bc686",
      "parents": [
        "b31da7ca6a2567dab66b9aad248b078ae3c20d22"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 18:56:01 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 18:56:01 2012"
      },
      "message": "Use a defer in Kill, as suggested by Frank.\n"
    },
    {
      "commit": "b31da7ca6a2567dab66b9aad248b078ae3c20d22",
      "tree": "561cc8b867963b0562064068bf1d5ad08c16c9e5",
      "parents": [
        "4079bec0b41e7f82e2755c28a925722abcf5f257"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 17:55:15 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 17:55:15 2012"
      },
      "message": "Added .lbox.\n"
    },
    {
      "commit": "4079bec0b41e7f82e2755c28a925722abcf5f257",
      "tree": "a970b47608b952e495a8e1a54ff23635427e0ecd",
      "parents": [
        "f45c1e0c477e9e6c8fe9d4e617ff8e653bbacb5d"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 17:53:18 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Apr 03 17:53:18 2012"
      },
      "message": "Added ErrDying. Renamed ErrStillRunning to ErrStillAlive.\n"
    },
    {
      "commit": "f45c1e0c477e9e6c8fe9d4e617ff8e653bbacb5d",
      "tree": "d7435de38bf38a79136c4dc9ea569fc386e415ee",
      "parents": [
        "0322ba0125990d07bf12461f2f20d0108c8e8f09",
        "6a2852086e1b61e7c0c52d2c3250c58dcd54e218"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "",
        "time": "Tue Mar 06 18:35:38 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Tue Mar 06 18:35:38 2012"
      },
      "message": "tomb: update API\n\n- Rename Fatal and Fatalf to Kill and Killf.\n\n- The Stop error value is gone. Use nil now.\n\n- Err will now return ErrStillRunning if the goroutine isn\u0027t dead\n  yet, which means a nil return reflects an actual nil Kill call.\n\n- Make zero-value of Tomb good to use, and as a consequence, make\n  Dead and Dying into methods rather than fields.\n\nR\u003dniemeyer\nCC\u003d\nhttps://codereview.appspot.com/5755055\n"
    },
    {
      "commit": "6a2852086e1b61e7c0c52d2c3250c58dcd54e218",
      "tree": "d7435de38bf38a79136c4dc9ea569fc386e415ee",
      "parents": [
        "b90c2b1ba2dfbe88cd62f85a745975f2d98b9c87"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 17:16:14 2012"
      },
      "committer": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 17:16:14 2012"
      },
      "message": "trivials for review"
    },
    {
      "commit": "b90c2b1ba2dfbe88cd62f85a745975f2d98b9c87",
      "tree": "4800fbd6e46a75771acec7a6b5c3490ca39c5f39",
      "parents": [
        "01009a0faeaeaa3744f5817fcd3735bb0a12f025"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 16:29:23 2012"
      },
      "committer": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 16:29:23 2012"
      },
      "message": "modify comment\n"
    },
    {
      "commit": "01009a0faeaeaa3744f5817fcd3735bb0a12f025",
      "tree": "2f872e4124fceed0f497a34610076a0083823a44",
      "parents": [
        "07afef72503fba229204dc83cc8f081e15d77fff"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 16:26:53 2012"
      },
      "committer": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 16:26:53 2012"
      },
      "message": "simplifications for review"
    },
    {
      "commit": "07afef72503fba229204dc83cc8f081e15d77fff",
      "tree": "52c1ae8da7561da6f345c3856bf9ddc96253a038",
      "parents": [
        "a054b84212b43f4867e48d2c3fbc714ffd5bbe09"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 15:49:19 2012"
      },
      "committer": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 15:49:19 2012"
      },
      "message": "remove references to stop"
    },
    {
      "commit": "a054b84212b43f4867e48d2c3fbc714ffd5bbe09",
      "tree": "3a76f1926e820cb63f3d009d11adc4a631800f72",
      "parents": [
        "2991a64742271573cdfefe83d55ea5655c7e1c07"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 15:42:39 2012"
      },
      "committer": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 15:42:39 2012"
      },
      "message": "minor comment change"
    },
    {
      "commit": "2991a64742271573cdfefe83d55ea5655c7e1c07",
      "tree": "1ff35d25361e49907c6b7977c85839248cd9558b",
      "parents": [
        "0322ba0125990d07bf12461f2f20d0108c8e8f09"
      ],
      "author": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 15:40:17 2012"
      },
      "committer": {
        "name": "Roger Peppe",
        "email": "roger.peppe@canonical.com",
        "time": "Tue Mar 06 15:40:17 2012"
      },
      "message": "rename Fatal -\u003e Kill.\nmake zero-value good to use.\nmake Dead and Dying into methods.\n"
    },
    {
      "commit": "0322ba0125990d07bf12461f2f20d0108c8e8f09",
      "tree": "1501a8aea73ad7454e48584fe01a5c34fe2f7b7b",
      "parents": [
        "36cf9247f3cfa1080192c6ff44cafcb042514d4c"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Wed Jan 18 00:28:24 2012"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Wed Jan 18 00:28:24 2012"
      },
      "message": "Ported to current weekly.\n"
    },
    {
      "commit": "36cf9247f3cfa1080192c6ff44cafcb042514d4c",
      "tree": "09486f7175c1f7f494d4169886d4304c1e3ca3dd",
      "parents": [
        "f3a0b6a94093f63a0efeaf62851e9873608a9f5b"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 20:09:54 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 20:09:54 2011"
      },
      "message": "Fixed typo in Done doc.\n"
    },
    {
      "commit": "f3a0b6a94093f63a0efeaf62851e9873608a9f5b",
      "tree": "fe15e4eebcd19cc7d520c062d094936eb1623091",
      "parents": [
        "73332a18720ddce1f8d90eb18962632f279bb478"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 20:08:16 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 20:08:16 2011"
      },
      "message": "Clarified doc for Fatal.\n"
    },
    {
      "commit": "73332a18720ddce1f8d90eb18962632f279bb478",
      "tree": "17a3944d809a4aeb384330c091c3deeed92861af",
      "parents": [
        "121ae4fc8ca9c4922f67cf70619a7e744d30b8cc"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 20:05:34 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 20:05:34 2011"
      },
      "message": "Simplified doc for Err.\n"
    },
    {
      "commit": "121ae4fc8ca9c4922f67cf70619a7e744d30b8cc",
      "tree": "1ec4ad8ad4121ebe4fea39da9ac2837ddd637e75",
      "parents": [
        "b4ce730395f3ca8cf39c7fadff4c1835010d9e04"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 19:23:06 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 23 19:23:06 2011"
      },
      "message": "Simplified interface after some real use.\n"
    },
    {
      "commit": "b4ce730395f3ca8cf39c7fadff4c1835010d9e04",
      "tree": "6326ad2455d7fd1699090bd9b2eedc21f8547664",
      "parents": [
        "6f37969f499d3e762f5a9739c0d7bb42d659f34b"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Wed Oct 19 21:32:31 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Wed Oct 19 21:32:31 2011"
      },
      "message": "s/nothing/struct{}/.\n"
    },
    {
      "commit": "6f37969f499d3e762f5a9739c0d7bb42d659f34b",
      "tree": "aaa475b67695ab06dc95aad6c8d1e1f8447bbc54",
      "parents": [
        "bd20235444c29ed305b3f3d981cead5996064569"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Mon Oct 10 00:02:50 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Mon Oct 10 00:02:50 2011"
      },
      "message": "Another doc tweak.\n"
    },
    {
      "commit": "bd20235444c29ed305b3f3d981cead5996064569",
      "tree": "b73cbf5e4b1164792bf91a9174b17f03ecb763b5",
      "parents": [
        "34543f5da7c668e793e831379e0b0370746a7700"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 21:00:21 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 21:00:21 2011"
      },
      "message": "s/puts/informs/ in documentation. More proper.\n"
    },
    {
      "commit": "34543f5da7c668e793e831379e0b0370746a7700",
      "tree": "155a3be3dcbd4d3d9436c3a7f251e405defd8b84",
      "parents": [
        "b20417b49fb0e77e2723bafe8d6f9abd3938499f"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:57:32 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:57:32 2011"
      },
      "message": "Mentioned the blog post in docs.\n"
    },
    {
      "commit": "b20417b49fb0e77e2723bafe8d6f9abd3938499f",
      "tree": "a11d72a95e0371657cc032d6d8cc4297a2b1f245",
      "parents": [
        "0d2508d93dfb406ca2797e3d799529f1b0244035"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:51:41 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:51:41 2011"
      },
      "message": "Tweaked documentation further.\n"
    },
    {
      "commit": "0d2508d93dfb406ca2797e3d799529f1b0244035",
      "tree": "725eacbdef00a53c48e8fa886d5ae231a11b57ad",
      "parents": [
        "e5e498ba76bce4132ff41e5bde622f9243bca9a1"
      ],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:35:19 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:35:19 2011"
      },
      "message": "Minor tweak in the package tag line.\n"
    },
    {
      "commit": "e5e498ba76bce4132ff41e5bde622f9243bca9a1",
      "tree": "c8eb57207f35b91d3a00bc0b8c5a4bcfdc127b63",
      "parents": [],
      "author": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:30:59 2011"
      },
      "committer": {
        "name": "Gustavo Niemeyer",
        "email": "gustavo@niemeyer.net",
        "time": "Sun Oct 09 19:30:59 2011"
      },
      "message": "Implemented it. :-)\n"
    }
  ]
}
