)]}'
{
  "commit": "28971c8cb1138700e87dc7da673e59b5596bb51b",
  "tree": "0e55c3f830681449cd96bb36eb04a6a1293d8b44",
  "parents": [
    "67174041d2d9d8908f8b2c915bc0d186d8442c68"
  ],
  "author": {
    "name": "Avneesh Sachdev",
    "email": "avneesh@opensourcerouting.org",
    "time": "Fri Aug 17 08:19:50 2012 -0700"
  },
  "committer": {
    "name": "David Lamparter",
    "email": "equinox@opensourcerouting.org",
    "time": "Wed Sep 26 21:50:48 2012 +0200"
  },
  "message": "lib/table: add route_table_get_next() and iterator\n\n  * lib/table.[ch]\n\n    - Add a function (route_table_get_next()) to get the route_node in\n      a tree that succeeds a given prefix in iteration order.\n\n      This allows one to reliably walk nodes in a tree while allowing\n      modifications, and is useful for achieving scale and\n      performance. Other approaches are also possible -- the main plus\n      point of this one is that it does not require any state about\n      the walk to be maintained in the table data structures.\n\n    - Add an iterator for walking the nodes in a tree. This introduces\n      a new structure (route_table_iter_t) and the following main\n      functions.\n\n        route_table_iter_init()\n        route_table_iter_pause()\n        route_table_iter_next()\n        route_table_iter_cleanup()\n\n      The iterator normally uses node pointers and the existing\n      route_next() function to walk nodes efficiently. When an\n      iteration is \u0027paused\u0027 with route_table_iter_pause(), it stores\n      the last prefix processed. The next call to\n      route_table_iter_next() transparently invokes\n      route_table_get_next() with the prefix to resume iteration.\n\n  * bgpd/bgp_table.[ch]\n\n    Add wrappers for the new table features described above.\n\n  * tests/table_test.c\n\n    Add tests for the new table code.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "ff42399f1a463c0d3954f2bf4dffb698fd430c6b",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_table.h",
      "new_id": "04a1d379e55f9681ca2205c299be328304a601ca",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_table.h"
    },
    {
      "type": "modify",
      "old_id": "6bbc9c621c495e58c1cf3d4ba4975b2b87765672",
      "old_mode": 33188,
      "old_path": "lib/table.c",
      "new_id": "19b5d1b18e060c8ad88a5948084411fae273f813",
      "new_mode": 33188,
      "new_path": "lib/table.c"
    },
    {
      "type": "modify",
      "old_id": "4d3eddb1d0764c061c7f8406b239c8536c0ada33",
      "old_mode": 33188,
      "old_path": "lib/table.h",
      "new_id": "ab357a074589f0a1d3c52440551bad5bf22ce691",
      "new_mode": 33188,
      "new_path": "lib/table.h"
    },
    {
      "type": "modify",
      "old_id": "ca0859438c40aab6e9cc1f8cc8f5ca992b764488",
      "old_mode": 33188,
      "old_path": "tests/.gitignore",
      "new_id": "e6ab706c0234e711faab3aea3ae0308d3093c424",
      "new_mode": 33188,
      "new_path": "tests/.gitignore"
    },
    {
      "type": "modify",
      "old_id": "0c262a4abca1851133ea1354c6cec112fa9648c7",
      "old_mode": 33188,
      "old_path": "tests/Makefile.am",
      "new_id": "e510a1588288a57d49f87ce4f160857ac3f7ac92",
      "new_mode": 33188,
      "new_path": "tests/Makefile.am"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fc9cc3dd9d977add551dc8349d5c7368cde0782c",
      "new_mode": 33188,
      "new_path": "tests/table_test.c"
    }
  ]
}
