)]}'
{
  "commit": "4d38fdb421ee04430ac2f4d4e8ef4a4e27c1020b",
  "tree": "a7bdb41cd18be9f612c54531efef5a5ccaab36f1",
  "parents": [
    "8b70d0b04f6bba2f30827d71084dd74fd00808b3"
  ],
  "author": {
    "name": "paul",
    "email": "paul",
    "time": "Thu Apr 28 17:35:14 2005 +0000"
  },
  "committer": {
    "name": "paul",
    "email": "paul",
    "time": "Thu Apr 28 17:35:14 2005 +0000"
  },
  "message": "2005-04-28 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* rib.h: (struct rib) Add lock field for refcounting.\n\t* zserv.h: (struct zebra_t) Add a ribq workqueue to the zebra\n\t  \u0027master\u0027 struct.\n\t* zserv.c: (zread_ipv4_add) XMALLOC then memset should be XCALLOC.\n\t* zebra_rib.c: Clean up refcounting of route_node, make struct rib\n\t  refcounted and convert rib_process to work-queue. In general,\n\t  rib\u0027s should be rib_addnode\u0027d and delnode\u0027d to route_nodes, and\n\t  these symmetrical functions will manage the locking of referenced\n\t  route_node and freeing of struct rib - rather than having users\n\t  manage each seperately - with much scope for bugs..\n\t  (newrib_free) removed and replaced with rib_lock\n\t  (rib_lock) new function, check state of lock and increment.\n\t  (rib_unlock) new function, check lock state and decrement. Free\n\t  struct rib if refcount hits 0, freeing struct nexthop\u0027s, as\n\t  newrib_free did.\n\t  (rib_addnode) Add RIB to route_node, locking both.\n\t  (rib_delnode) Delete RIB from route_node, unlocking each.\n\t  (rib_process) Converted to a work-queue work function.\n\t  Functional changes are minimal, just arguments, comments and\n\t  whitespace.\n\t  (rib_queue_add_qnode) Helper function to setup a ribq item.\n\t  (rib_queue_add) Helper function, same arguments as old\n\t  rib_process, to replace in callers of rib_process.\n\t  (rib_queue_qnode_del) ribq deconstructor.\n\t  (rib_queue_init) Create the ribq.\n\t  (rib_init) call rib_queue_init.\n\t  (remainder) Sanitise refcounting of route_node\u0027s. Convert to\n\t  rib_queue_add, rib_addnode and rib_delnode. Change XMALLOC/memset\n\t  to XCALLOC. Remove calls to nexthop_delete and nexthop_free.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "7210c7a8a18f6a836f71a5ad4126b91f45b2f57f",
      "old_mode": 33188,
      "old_path": "zebra/ChangeLog",
      "new_id": "4ddf101fd1132562c0760aa09001fd0498826cd4",
      "new_mode": 33188,
      "new_path": "zebra/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "b21e087f24098e291256fe838801a3fb6be33205",
      "old_mode": 33188,
      "old_path": "zebra/rib.h",
      "new_id": "1e6393e6ae13bb49e0bde1d15363981f50b7a733",
      "new_mode": 33188,
      "new_path": "zebra/rib.h"
    },
    {
      "type": "modify",
      "old_id": "8eb80619c3759ce559a0711cb156f4ebc0e5eb5d",
      "old_mode": 33188,
      "old_path": "zebra/zebra_rib.c",
      "new_id": "a8aaef3eb665c7e71726032596c5e733f662ed4b",
      "new_mode": 33188,
      "new_path": "zebra/zebra_rib.c"
    },
    {
      "type": "modify",
      "old_id": "e90fe0194a101f8da509b8f834bd5fc135e96af5",
      "old_mode": 33188,
      "old_path": "zebra/zserv.c",
      "new_id": "c02eac89211a61a2540c013c72de3817f34fc05d",
      "new_mode": 33188,
      "new_path": "zebra/zserv.c"
    },
    {
      "type": "modify",
      "old_id": "445dc766577e788021654b90b2aeaec073ba906e",
      "old_mode": 33188,
      "old_path": "zebra/zserv.h",
      "new_id": "db822a9b9770deefb745bb44f0a0fbb94de0e31a",
      "new_mode": 33188,
      "new_path": "zebra/zserv.h"
    }
  ]
}
