)]}'
{
  "commit": "200df115ea0ba6f54151d60fe5e9a7f6948de7c3",
  "tree": "2aedc0af80d2e805cdf2cefd50432423d2871216",
  "parents": [
    "b31b813671d96ea9e96801508442a90f0ef503fa"
  ],
  "author": {
    "name": "paul",
    "email": "paul",
    "time": "Wed Jun 01 11:17:05 2005 +0000"
  },
  "committer": {
    "name": "paul",
    "email": "paul",
    "time": "Wed Jun 01 11:17:05 2005 +0000"
  },
  "message": "2005-06-01 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* bgpd/(general) refcount struct peer and bgp_info, hence allowing us\n\t  add work_queues for bgp_process.\n\t* bgpd/bgp_route.h: (struct bgp_info) Add \u0027lock\u0027 field for refcount.\n\t  Add bgp_info_{lock,unlock} helper functions.\n\t  Add bgp_info_{add,delete} helpers, to remove need for\n\t  users managing locking/freeing of bgp_info and bgp_node\u0027s.\n\t* bgpd/bgp_table.h: (struct bgp_node) Add a flags field, and\n\t  BGP_NODE_PROCESS_SCHEDULED to merge redundant processing of\n\t  nodes.\n\t* bgpd/bgp_fsm.h: Make the ON/OFF/ADD/REMOVE macros lock and unlock\n\t  peer reference as appropriate.\n\t* bgpd/bgp_damp.c: Remove its internal prototypes for\n\t  bgp_info_delete/free. Just use bgp_info_delete.\n\t* bgpd/bgpd.h: (struct bgp_master) Add work_queue pointers.\n\t  (struct peer) Add reference count \u0027lock\u0027\n\t  (peer_lock,peer_unlock) New helpers to take/release reference\n\t  on struct peer.\n\t* bgpd/bgp_advertise.c: (general) Add peer and bgp_info refcounting\n\t  and balance how references are taken and released.\n\t  (bgp_advertise_free) release bgp_info reference, if appropriate\n\t  (bgp_adj_out_free) unlock peer\n\t  (bgp_advertise_clean) leave the adv references alone, or else\n\t  call bgp_advertise_free cant unlock them.\n\t  (bgp_adj_out_set) lock the peer on new adj\u0027s, leave the reference\n\t  alone otherwise. lock the new bgp_info reference.\n\t  (bgp_adj_in_set) lock the peer reference\n\t  (bgp_adj_in_remove) and unlock it here\n\t  (bgp_sync_delete) make hash_free on peer conditional, just in\n\t  case.\n\t* bgpd/bgp_fsm.c: (general) document that the timers depend on\n\t  bgp_event to release a peer reference.\n\t  (bgp_fsm_change_status) moved up the file, unchanged.\n\t  (bgp_stop) Decrement peer lock as many times as cancel_event\n\t  canceled - shouldnt be needed but just in case.\n\t  stream_fifo_clean of obuf made conditional, just in case.\n\t  (bgp_event) always unlock the peer, regardless of return value\n\t  of bgp_fsm_change_status.\n\t* bgpd/bgp_packet.c: (general) change several bgp_stop\u0027s to BGP_EVENT\u0027s.\n\t  (bgp_read) Add a mysterious extra peer_unlock for ACCEPT_PEERs\n\t  along with a comment on it.\n\t* bgpd/bgp_route.c: (general) Add refcounting of bgp_info, cleanup\n\t  some of the resource management around bgp_info. Refcount peer.\n\t  Add workqueues for bgp_process and clear_table.\n\t  (bgp_info_new) make static\n\t  (bgp_info_free) Ditto, and unlock the peer reference.\n\t  (bgp_info_lock,bgp_info_unlock) new exported functions\n\t  (bgp_info_add) Add a bgp_info to a bgp_node in correct fashion,\n\t  taking care of reference counts.\n\t  (bgp_info_delete) do the opposite of bgp_info_add.\n\t  (bgp_process_rsclient) Converted into a work_queue work function.\n\t  (bgp_process_main) ditto.\n\t  (bgp_processq_del) process work queue item deconstructor\n\t  (bgp_process_queue_init) process work queue init\n\t  (bgp_process) call init function if required, set up queue item\n\t  and add to queue, rather than calling process functions directly.\n\t  (bgp_rib_remove) let bgp_info_delete manage bgp_info refcounts\n\t  (bgp_rib_withdraw) ditto\n\t  (bgp_update_rsclient) let bgp_info_add manage refcounts\n\t  (bgp_update_main) ditto\n\t  (bgp_clear_route_node) clear_node_queue work function, does\n\t  per-node aspects of what bgp_clear_route_table did previously\n\t  (bgp_clear_node_queue_del) clear_node_queue item delete function\n\t  (bgp_clear_node_complete) clear_node_queue completion function,\n\t  it unplugs the process queues, which have to be blocked while\n\t  clear_node_queue is being processed to prevent a race.\n\t  (bgp_clear_node_queue_init) init function for clear_node_queue\n\t  work queues\n\t  (bgp_clear_route_table) Sets up items onto a workqueue now, rather\n\t  than clearing each node directly. Plugs both process queues to\n\t  avoid potential race.\n\t  (bgp_static_withdraw_rsclient) let bgp_info_{add,delete} manage\n\t  bgp_info refcounts.\n\t  (bgp_static_update_rsclient) ditto\n\t  (bgp_static_update_main) ditto\n\t  (bgp_static_update_vpnv4) ditto, remove unneeded cast.\n\t  (bgp_static_withdraw) see bgp_static_withdraw_rsclient\n\t  (bgp_static_withdraw_vpnv4) ditto\n\t  (bgp_aggregate_{route,add,delete}) ditto\n\t  (bgp_redistribute_{add,delete,withdraw}) ditto\n\t* bgpd/bgp_vty.c: (peer_rsclient_set_vty) lock rsclient list peer\n\t  reference\n\t  (peer_rsclient_unset_vty) ditto, but unlock same reference\n\t* bgpd/bgpd.c: (peer_free) handle frees of info to be kept for lifetime\n\t  of struct peer.\n\t  (peer_lock,peer_unlock) peer refcount helpers\n\t  (peer_new) add initial refcounts\n\t  (peer_create,peer_create_accept) lock peer as appropriate\n\t  (peer_delete) unlock as appropriate, move out some free\u0027s to\n\t  peer_free.\n\t  (peer_group_bind,peer_group_unbind) peer refcounting as\n\t  appropriate.\n\t  (bgp_create) check CALLOC return value.\n\t  (bgp_terminate) free workqueues too.\n\t* lib/memtypes.c: Add MTYPE_BGP_PROCESS_QUEUE and\n\t  MTYPE_BGP_CLEAR_NODE_QUEUE\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5f8456746671e3d5eaab7fc2c24328faf66273e0",
      "old_mode": 33188,
      "old_path": "bgpd/ChangeLog",
      "new_id": "254d5aff68c5cc982504001b9ae4a8d82bc71cff",
      "new_mode": 33188,
      "new_path": "bgpd/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "4778a9773d9f8a973cfb111ea35fa7a5d1b5f6a2",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_advertise.c",
      "new_id": "da06cb96a70fc97dac0bdf83259ee37073d68df8",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_advertise.c"
    },
    {
      "type": "modify",
      "old_id": "9b7b5dae022d7cff32aca762595db867c81fdedc",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_damp.c",
      "new_id": "e3ccbfbac3a1d3b87cd279063ae20742bc1bb27b",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_damp.c"
    },
    {
      "type": "modify",
      "old_id": "6368ff47ad170ea34b6aa439476efb1e78d8b5fa",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_fsm.c",
      "new_id": "fc7654f0c1e8d930491d53ceedbfd8e316a2d8b6",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_fsm.c"
    },
    {
      "type": "modify",
      "old_id": "db4a915aecc09cfe23a9e25348108cd4fe96b647",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_fsm.h",
      "new_id": "e90f3b433c97eba851cea200fe2602240cef635a",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_fsm.h"
    },
    {
      "type": "modify",
      "old_id": "a5fc749902363bd7f346d072499a0e7ba885f19a",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_packet.c",
      "new_id": "959cc3fd4022e96c76e5bfb2bc0f4ac08647da39",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_packet.c"
    },
    {
      "type": "modify",
      "old_id": "8d99249569beae7d30961b4a908d5d64d86130db",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_route.c",
      "new_id": "07fa139d2d3a1b1b0e28479759dff9a318730586",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_route.c"
    },
    {
      "type": "modify",
      "old_id": "0c96a79c94766113be271b6ee04289202318d51d",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_route.h",
      "new_id": "03567ecc7cc43d6e62fe3f84ddb58e0161072122",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_route.h"
    },
    {
      "type": "modify",
      "old_id": "b964079800b89ae9aa9050a455e1f2a10a6e2c71",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_table.h",
      "new_id": "9033f98e3843e426df46c04334c72621304c01ec",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_table.h"
    },
    {
      "type": "modify",
      "old_id": "06c4abdbc69f6124c2235b1b74a6a18864440b14",
      "old_mode": 33188,
      "old_path": "bgpd/bgp_vty.c",
      "new_id": "afa5fed1298151213536187e1553acaeb3f62237",
      "new_mode": 33188,
      "new_path": "bgpd/bgp_vty.c"
    },
    {
      "type": "modify",
      "old_id": "e3033959479f45701b0d6c3f78a9063d2ea6fcec",
      "old_mode": 33188,
      "old_path": "bgpd/bgpd.c",
      "new_id": "83cf9a8dfda7c0d100e34bfd493151dd05121d6d",
      "new_mode": 33188,
      "new_path": "bgpd/bgpd.c"
    },
    {
      "type": "modify",
      "old_id": "f2b75dea7336938070f3329396165d30f06e3a51",
      "old_mode": 33188,
      "old_path": "bgpd/bgpd.h",
      "new_id": "aacbd3a4c104ffb8d77d871fade662292f6a247b",
      "new_mode": 33188,
      "new_path": "bgpd/bgpd.h"
    },
    {
      "type": "modify",
      "old_id": "6495b405004a1eddeb32ba7deeeb21b0fc0e99e3",
      "old_mode": 33188,
      "old_path": "lib/ChangeLog",
      "new_id": "d1ac77833854bbcaf8431f147a97aef525733e6a",
      "new_mode": 33188,
      "new_path": "lib/ChangeLog"
    },
    {
      "type": "modify",
      "old_id": "f1bec8b284fde425a8724504221a9c10c3ea679c",
      "old_mode": 33188,
      "old_path": "lib/memtypes.c",
      "new_id": "9b4ba71c4299af6e09a753ee14cb5bdb87a71cd9",
      "new_mode": 33188,
      "new_path": "lib/memtypes.c"
    }
  ]
}
