)]}'
{
  "log": [
    {
      "commit": "19be18a929c3afa343ac5435dba25f522e294d9b",
      "tree": "ca2b656c0e8d24a9b3f50e482f65cb5fbc0cbf0e",
      "parents": [
        "6bcee414a487024e7865fb29d4e583870406d914"
      ],
      "author": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:55 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@hpe.com",
        "time": "Tue Sep 13 10:36:37 2016 +0100"
      },
      "message": "lib: Abstract fd set operations\n\nAbstract FD set operations so that we can eventually\nchoose what type of select/poll operation that\nwe want to use.\n\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetowkrs.com\u003e\n"
    },
    {
      "commit": "4ab273bb60606ed681bee1be6fb2c8bb31dc26a7",
      "tree": "0742982d0f484826bf983c1789ffb0cd080fe56b",
      "parents": [
        "0744040564ece3f4b9fe39fcf857e466a5f68a72"
      ],
      "author": {
        "name": "Denil Vira",
        "email": "denil@cumulusnetworks.com",
        "time": "Fri Mar 04 15:28:54 2016 -0500"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Jul 20 12:58:33 2016 +0100"
      },
      "message": "lib: Replace lists with arrays to store read and write threads\n\nWith arrays, a thread corresponding to given fd is looked up in constant time\nversus the linear time taken for list traversals.\n\nSigned-off-by: Denil Vira \u003cdenil@cumulusnetworks.com\u003e\nSigned-off-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "76fbc64c5d82c6f540cb4a1ac855f9f098fa6c5f",
      "tree": "ce0d45193a3924fd23851ff81210beb320cf0afb",
      "parents": [
        "1ca8d40f996c0760a1a8931f54044dd7ca9e3f9c"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Tue Nov 10 18:04:41 2015 +0100"
      },
      "committer": {
        "name": "Donald Sharp",
        "email": "sharpd@cumulusnetworks.com",
        "time": "Tue Dec 08 14:12:40 2015 -0500"
      },
      "message": "lib: add function to get precise remaining time of timer thread\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nAcked-by: Donald Sharp \u003csharpd@cumulusnetworks.com\u003e\n"
    },
    {
      "commit": "d8410a0242ab055b96708c5b33358916330bc85a",
      "tree": "5329d38c6e0a5be3517a476fb8a9c8ffa54213e9",
      "parents": [
        "05a49cea19d861ceec67ce6402264d353bb3b290"
      ],
      "author": {
        "name": "Everton Marques",
        "email": "everton.marques@gmail.com",
        "time": "Tue Sep 23 16:14:49 2014 -0300"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Wed Feb 04 06:08:01 2015 +0100"
      },
      "message": "pimd: Remove non-standard copyright line.\n"
    },
    {
      "commit": "50f38b3500a6af6e1b0d1389d65c62d70c41e8c2",
      "tree": "0525b14ce3c53f891cd7f5a00fcf954f4893a99f",
      "parents": [
        "88d37b902bc8127379d3293b9671aa6a11479c23"
      ],
      "author": {
        "name": "Dinesh G Dutt",
        "email": "ddutt@cumulusnetworks.com",
        "time": "Tue Sep 30 12:53:28 2014 -0700"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Nov 11 17:25:09 2014 +0000"
      },
      "message": "Compute and display SPF execution statistics\n\nDetailed SPF statistics, all around time spent executing various pieces of SPF\nsuch as the SPF algorithm itself, installing routes, pruning unreachable networks\netc.\n\nReason codes for firing up SPF are:\nR - Router LSA, N - Network LSA, S - Summary LSA, ABR - ABR status change,\nASBR - ASBR Status Change, AS - ASBR Summary, M - MaxAge\n\nSigned-off-by: Dinesh G Dutt \u003cddutt@cumulusnetworks.com\u003e\nReviewed-by: JR Rivers \u003cjrrivers@cumulusnetworks.com\u003e\nReviewed-by: Scott Feldman \u003csfeldma@cumulusnetworks.com\u003e\nReviewed-by: Ayan Banerjee \u003cayan@cumulusnetworks.com\u003e\nReviewed-by: Paul Jakma \u003cpaul@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "615f9f18fc025757a255f936748fc1e86e922783",
      "tree": "b9cd79ef71984932f4eb5f73437f9593ad2a2604",
      "parents": [
        "3493b7731b750cbc62f00be94b624a08ccccf0b2"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 18 23:52:02 2013 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Sep 15 18:38:56 2014 +0200"
      },
      "message": "lib: include thread information in backtraces\n\nnow that we know what thread we\u0027re currently executing, let\u0027s add that\ninformation to SEGV / assert backtraces.\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "3493b7731b750cbc62f00be94b624a08ccccf0b2",
      "tree": "4ea2444ddc197001b26f0b9b6e7cc2adb2bb29d2",
      "parents": [
        "621e2aaf33d8ab73bf44b0eea3f3900135d34996"
      ],
      "author": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Nov 18 23:04:27 2013 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Mon Sep 15 18:38:48 2014 +0200"
      },
      "message": "lib: unstupidify thread debug information\n\nthe library\u0027s thread scheduling functions keep track of the thread\nfunction\u0027s name, so far so good.  However, copying the compiler-provided\nconstant into a buffer inside the thread structure is plain useless.\nAlso, strip_funcname() was trying to support something that never\nhappens.\n\nInstead, let\u0027s use some bytes here to track where threads are scheduled\nfrom.  Another commit will print that information on crashes.\n\nRipping out useless stuff:  -64 bytes in the thread structure\nRe-add as const ptr:         +8 bytes\nExtra debug info:           +12 bytes\n\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "4becea724ccd87e88f8454622ae227308b5fa3ce",
      "tree": "a1e07f06ae43698a72a15ee801de86ce3d9ffdf4",
      "parents": [
        "514991c76366c2a9f4c644714ad0722df0eed532"
      ],
      "author": {
        "name": "Christian Franke",
        "email": "chris@opensourcerouting.org",
        "time": "Tue Nov 19 14:11:42 2013 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue Apr 22 21:17:00 2014 +0200"
      },
      "message": "lib: use heap to manage timers\n\nSigned-off-by: Christian Franke \u003cchris@opensourcerouting.org\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "22714f99c4ffeb4d1bade7ad6374adeba0e06e4c",
      "tree": "43b6e720bc05ad1bc5748d8d8a08c725a7fe6a90",
      "parents": [
        "64018324d5e5071eea3b3f72f939d91dc7aef029"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:14 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:50:14 2012 +0200"
      },
      "message": "lib: do not allocate/free thread funcnames\n\n  This avoids memory heap fragmentation and imposses less load on the\nsystem memory allocator.\n\n* thread.h: FUNCNAME_LEN defined to 64 (ISO C99 says max 63)\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\n[changed FUNCNAME_LEN to a less arbitrary value]\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "41af338ecd56b9891d996f0fc850e02318b0c01a",
      "tree": "8543da475e3e82e6a63a8e2c8d8f0175bc447c2d",
      "parents": [
        "47d3b6078a6c885e03d28bae3397b71a827473f5"
      ],
      "author": {
        "name": "Jorge Boncompte [DTI2]",
        "email": "jorge@dti2.net",
        "time": "Mon May 07 16:53:12 2012 +0000"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@opensourcerouting.org",
        "time": "Tue May 22 20:35:51 2012 +0200"
      },
      "message": "lib: remove RUSAGE_T from struct thread\n\n* thread.c: It\u0027s only temporarily used in thread_call() to calculate the\n  diffs. Saves 80 bytes per copy.\n\nSigned-off-by: Jorge Boncompte [DTI2] \u003cjorge@dti2.net\u003e\nSigned-off-by: David Lamparter \u003cequinox@opensourcerouting.org\u003e\n"
    },
    {
      "commit": "5734509c0545ebd95a5b8e3f22a911c1a39ffa1b",
      "tree": "2f35ad50d793080db1f858c2de2228cfd2946dfd",
      "parents": [
        "fe67e668881b8b8d71b1570575c913cd287fafcf"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Dec 25 17:52:09 2011 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sun Mar 25 17:06:51 2012 +0100"
      },
      "message": "babeld: Initial import, for Babel routing protocol.\n\n* Initial import of the Babel routing protocol, ported to Quagga.\n* LICENCE: Update the original LICENCE file to include all known potentially\n  applicable copyright claims.  Ask that any future contributors to babeld/\n  grant MIT/X11 licence to their work.\n* *.{c,h}: Add GPL headers, in according with the SFLC guidance on\n  dealing with potentially mixed GPL/other licensed work, at:\n\n  https://www.softwarefreedom.org/resources/2007/gpl-non-gpl-collaboration.html\n"
    },
    {
      "commit": "e854095932260b3e6187902aa9a7baa0e96b9428",
      "tree": "1ee0afa3ad43b610d52bc04f86ea6e2b2e4ad00d",
      "parents": [
        "e6b03b77766dce8009ad7b4a2392e14addf4ab0f"
      ],
      "author": {
        "name": "Everton Marques",
        "email": "everton.marques@gmail.com",
        "time": "Thu Feb 16 06:14:54 2012 +0100"
      },
      "committer": {
        "name": "David Lamparter",
        "email": "equinox@diac24.net",
        "time": "Thu Feb 16 06:17:11 2012 +0100"
      },
      "message": "lib: add THREAD_TIMER_MSEC_ON()\n\n * lib/thread.h: new timer macro, millisecond precision\n\n(this was cherrypicked from pimd to isolate all non-contained changes)\n\nFrom: Everton Marques \u003ceverton.marques@gmail.com\u003e\nSigned-off-by: David Lamparter \u003cequinox@diac24.net\u003e\n"
    },
    {
      "commit": "e276eb82820eb92d221f183496e28da4ffe0fe68",
      "tree": "33f8ab85f1bd68874589ca804049d2ec4958478a",
      "parents": [
        "2613abe64fe48761d798942af8dc0ec90c804b22"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Sat Jan 09 16:15:00 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Dec 08 16:53:09 2010 +0000"
      },
      "message": "lib: Add a command to clear the thread CPU history data\n\n* (general) this can be useful when investigating thread latency problems,\n  when you don\u0027t want to have to restart a daemon between tests.\n* thread.c: (cpu_record_(hash_)clear) wipe the stored thread cpu history\n  data, according to the filter, similar to the vty print code.\n  (clear_thread_cpu_cmd) new command to clear data.\n* thread.h: export new command\n* command.c: install it\n"
    },
    {
      "commit": "8526100eebf9c56ff6fac2b80938b232bb687946",
      "tree": "72b217f80791f29632db0ddefffb97a4943dfb00",
      "parents": [
        "838bbde0426e562132d22fb11932ea413aebf928"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Mon Jan 11 16:30:45 2010 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Wed Dec 08 16:53:09 2010 +0000"
      },
      "message": "lib: thread history funcname shouldn\u0027t be constant, it\u0027s freed\n\n* thread.h: (struct cpu_thread_history.funcname) malloc gets called on this\n  so it should not be const\n* thread.c: (cpu_record_print) cast the (const char *) to (char *), this\n  function knows what it\u0027s doing (free wont be called on it).\n"
    },
    {
      "commit": "41b2373cece77f0cc9a06fba076c99a7be653593",
      "tree": "bed11b842b7a33e78e8c5012bf624946aeaf1edc",
      "parents": [
        "bd2462425205a681d75e04c94a94bf4cea5da58b"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jun 30 16:12:49 2009 +0100"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul@quagga.net",
        "time": "Tue Jun 30 16:12:49 2009 +0100"
      },
      "message": "[lib/cleanup] Use a typedef for the thread type\n\n* lib/thread.{c,h}: As per subject. This will avoid head-scratching for next\n  person who adds a thread-type and gets strange breakage.\n"
    },
    {
      "commit": "db9c0df934e62835bc09604a7ae7932693b4254a",
      "tree": "7e382d6012701e345492756f7716d4f62030e9f8",
      "parents": [
        "f0894cf8c323a25053e1f5e82be3ea5d88c2aacb"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Aug 27 06:44:02 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Sun Aug 27 06:44:02 2006 +0000"
      },
      "message": "[lib] Bug #134: threads should be more robust against backward time jumps\n\n2006-08-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* thread.c: (general) Add support for monotonic clock, it may still\n\t  jump forward by huge amounts, but should be immune to going\n\t  backwards. Fixes bug #134.\n\t  (quagga_gettimeofday_relative_adjust) helper, does what name\n\t  says - adjusts gettimeofday based relative timer.\n\t  (quagga_gettimeofday) helper to keep recent_time up to date.\n\t  (quagga_get_relative) helper, update and getch the relative\n\t  timer using gettimeofday(). POSIX CLOCK_MONOTONIC is also\n\t  supported, but the code is not enabled yet nor tested.\n\t  (quagga_real_stabilised) helper, retrieve absolute time but\n\t  stabilised so as to never decrease.\n\t  (quagga_gettime) Exported interface, analogous to POSIX\n\t  clock_gettime() in interface, supporting several clocks.\n\t  (quagga_time) Exported interface, analogous to traditional\n\t  time(), will never decrease.\n\t  (recent_relative_time) Convenience function to retrieve\n\t  relative_time timeval, similar to existing recent_time absolute\n\t  timeval, for when an approximately recent value will do.\n\t  (remainder) Update to use above helpers.\n\t  (thread_getrusage) Previously was a macro, but needs to be\n\t  a function to twiddle with thread.c private stuff.\n\t* thread.c: Point the GETRUSAGE macro at previous function.\n\t  Export quagga_gettime, quagga_time and recent_relative_time for\n\t  general use.\n"
    },
    {
      "commit": "cc8b13a00bfe7083ae68755e547a39cd762f2963",
      "tree": "9729858115e6862a6bc65a5454f41ce01e059306",
      "parents": [
        "90c33177f53ae36a8765f5f27bf34a90663806d3"
      ],
      "author": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Jul 25 20:40:40 2006 +0000"
      },
      "committer": {
        "name": "Paul Jakma",
        "email": "paul.jakma@sun.com",
        "time": "Tue Jul 25 20:40:40 2006 +0000"
      },
      "message": "[lib] Optimise thread_call by caching pointer to thread history in the thread\n\n2006-07-25 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* thread.h: (struct thread) Add a cache pointer to the struct\n\t  cpu_thread_history, if it is known - saving hash lookup on\n\t  each thread_call.\n\t* thread.c: (thread_call) Cache the pointer to the\n          cpu_thread_history, so that future thread_calls of same\n          thread can avoid the hash_lookup.\n"
    },
    {
      "commit": "dc81807a5b2b3dc8138d74e23ece71402a6c03b4",
      "tree": "7f2850cf793ea8c5241b85b18e971bd763707f14",
      "parents": [
        "a3387a4488c35d322d3c78973c967b2be5967b6e"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 01:30:53 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Thu May 19 01:30:53 2005 +0000"
      },
      "message": "2005-05-19 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* thread.c: (thread_cancel_event) the number of pending events\n\t  cancelled is potentially useful information, dont throw it away,\n\t  pass it back to the caller.\n"
    },
    {
      "commit": "8cc4198f9fabe5f10f5a773de1503d82f33a01fb",
      "tree": "77045da709ff66629bd12029b9ee17700360909b",
      "parents": [
        "e7fe8c88c3d552400e1ae3ae9243319ab95d6f2d"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:25:49 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri May 06 21:25:49 2005 +0000"
      },
      "message": "2005-05-06 Paul Jakma \u003cpaul@dishone.st\u003e\n\n\t* (general) extern and static\u0027ification of functions in code and\n\t  header.\n\t  Cleanup any definitions with unspecified arguments.\n\t  Add casts for callback assignments where the callback is defined,\n\t  typically, as passing void *, but the function being assigned has\n\t  some other pointer type defined as its argument, as gcc complains\n\t  about casts from void * to X* via function arguments.\n\t  Fix some old K\u0026R style function argument definitions.\n\t  Add noreturn gcc attribute to some functions, as appropriate.\n\t  Add unused gcc attribute to some functions (eg ones meant to help\n\t  while debugging)\n\t  Add guard defines to headers which were missing them.\n\t* command.c: (install_node) add const qualifier, still doesnt shut\n\t  up the warning though, because of the double pointer.\n\t  (cmp_node) ditto\n\t* keychain.c: (key_str2time) Add GET_LONG_RANGE() macro, derived\n\t  fromn vty.h ones to fix some of the (long) \u003c 0 warnings.\n\t* thread.c: (various) use thread_empty\n\t  (cpu_record_hash_key) should cast to uintptr_t, a stdint.h type\n\t* vty.h: Add VTY_GET_IPV4_ADDRESS and VTY_GET_IPV4_PREFIX so they\n\t  removed from ospfd/ospf_vty.h\n\t* zebra.h: Move definition of ZEBRA_PORT to here, to remove\n\t  dependence of lib on zebra/zserv.h\n"
    },
    {
      "commit": "8b70d0b04f6bba2f30827d71084dd74fd00808b3",
      "tree": "245969be7b29246bcb5ca39fc6661f0aeea7dd75",
      "parents": [
        "3df537822f594ffefe4d5e121c0b2430c9c12806"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Apr 28 01:31:13 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Thu Apr 28 01:31:13 2005 +0000"
      },
      "message": "2005-04-27 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\tAdd wall-clock timing statistics to \u0027show thread cpu\u0027 output.\n\t* thread.h: Define struct rusage_t to contain wall-clock time\n\t  and cpu time.  Change GETRUSAGE macro to collect both pieces\n\t  of data.  Make appropriate changes to struct cpu_thread_history\n\t  to track CPU time and real time.  Change proto for\n\t  thread_consumed_time to return real and cpu time elapsed.\n\t  And declare a new global variable \u0027struct timeval recent_time\u0027.\n\t* thread.c (struct timeval recent_time): New global timestamp variable.\n\t  (timeval_adjust): If timeout is negative, set to 0 (not 10\n\t  microseconds).  And remove upper bound of 1,000,000 seconds, since\n\t  this does not seem to make any sense (and it breaks\n\t  funcname_thread_add_timer_timeval).\n\t  (timeval_cmp): Should return long, not int.\n\t  (vty_out_cpu_thread_history): Show CPU time and real time.\n\t  (cpu_record_hash_print): Calculate totals for CPU and real time.\n\t  (cpu_record_print): Change \u0027show thread cpu\u0027 title to show CPU and\n\t  real time.\n\t  (thread_timer_remain_second): Put current time in global recent_time.\n\t  (funcname_thread_add_timer_timeval): Fix assert.  Replace 2-case\n\t  switch assignment with a ternary expression.  Use global recent_time\n\t  variable.  Fix use of timeval_adjust (previously, the value was not\n\t  actually being adjusted).\n\t  (thread_cancel): Add missing \"break\" statement in case\n\t  THREAD_BACKGROUND.\n\t  (thread_timer_wait): Use global recent_time value instead of calling\n\t  gettimeofday.  And there\u0027s no need to check for negative timeouts,\n\t  since timeval_subtract already sets these to zero.\n\t  (thread_timer_process): Timers are sorted, so bail out once we\n\t  encounter a timer that has not yet popped.  And remove some\n\t  extraneous asserts.\n\t  (thread_fetch): Do not process foreground timers before calling\n\t  select.  Instead, add them to the ready list just after the select.\n\t  Also, no need to maintain a count of the number of ready threads,\n\t  since we don\u0027t care how many there are, just whether there\u0027s\n\t  one at the head of the ready list (which is easily checked).\n\t  Stick current time in global variable recent_time to reduce\n\t  the number of calls to gettimeofday.  Tighten logic for\n\t  calculating the select timeout.\n\t  (thread_consumed_time): Now returns real time and puts the elapsed\n\t  cpu time in an additional argument.\n\t  (thread_should_yield): Use real (wall-clock) time to decide whether\n\t  to yield.\n\t  (thread_call): Maintain CPU and real time statistics.\n\t* vty.c (vty_command): For slow commands, show real and cpu time.\n"
    },
    {
      "commit": "fb9e46bbb1a639cf365d06a75007e708c278b6bd",
      "tree": "775879c0333b8785ebd436163d3db5d8e955a987",
      "parents": [
        "e1e53ed5d7aaa70e23abac6f7d21ef1646bad123"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 22 14:23:34 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Fri Apr 22 14:23:34 2005 +0000"
      },
      "message": "2005-04-22 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* thread.h: Fix type for struct thread_master add_type: should be\n\t  unsigned char.  Also, add some documentation of thread_add_background\n\t  args.  And remove extraneous declaration of\n\t  show_thread_work_queues_cmd.\n"
    },
    {
      "commit": "17fc128d6422d3c6045ff671973911c17db39276",
      "tree": "9adb150b7215d04151c293d5177b96037468efd9",
      "parents": [
        "1d2c893b61211761a17bb2e51345a2eaed12cf1f"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:57:03 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:57:03 2005 +0000"
      },
      "message": "- fix comment\n"
    },
    {
      "commit": "a48b4e6d074a4e61ce9e8bf78fdb8ea9c57c6e64",
      "tree": "7967366e5c4c650d36fbaa1cf5f9d30584ff9846",
      "parents": [
        "cb0663c41a5c61c6261f6d5607526e56be0ed2d4"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:43:47 2005 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Apr 22 00:43:47 2005 +0000"
      },
      "message": "2005-04-22 Paul Jakma \u003cpaul.jakma@sun.com\u003e\n\n\t* thread.h: Add background thread type and thread_add_background\n\t  macro and accompanying funcname_... function.\n\t  export thread_should_yield, background threads can use it.\n\t  Lower thread yield time to 10ms, 100ms is noticeable lag and\n\t  a thread would only be /starting/ to finish sometime afterward.\n\t* thread.c: (general) Add background thread type and schedule\n\t  nearly all thread types through the ready list for fairness.\n\t  (timeval_adjust) static qualifier missing\n\t  (vty_out_cpu_thread_history) add support for printout of\n\t  background threads\n\t  (show_thread_cpu) ditto.\n\t  (thread_master_debug) add debug of background list\n\t  (thread_master_create) fixup long line\n\t  (thread_add_unuse) add asserts for required state.\n\t  (thread_master_free) free background thread list\n\t  (funcname_thread_add_timer_timeval) make generic, able to\n\t  support arbitrary timer-like thread types.\n\t  (funcname_thread_add_timer) pass thread type to .._add_timer_timeval\n\t  (funcname_thread_add_timer_msec) ditto\n\t  (funcname_thread_add_background) Add a background thread, with an\n\t  optional millisecond delay factor, using .._add_timer_timeval.\n\t  (thread_cancel) Add background thread type.\n\t  Move the thread_list_delete common to all cases to bottom of\n\t  function, after the switch statement..\n\t  (thread_cancel_event) indent\n\t  (thread_timer_wait) Static qualifier, and make it able to cope\n\t  with arbitrary timer-like thread lists, so its of use to\n\t  background threads too.\n\t  (thread_process_fd) static qualifier. Again, make it take a list\n\t  reference rather than thread_master. Fix indentation.\n\t  (thread_timer_process) Check for ready timer-like threads in the\n\t  given list and move them on to the ready list - code originally\n\t  embedded in thread_fetch.\n\t  (thread_fetch) Schedule all threads, other than events, through\n\t  the ready list, to ensure fairness. Timer readying code moved to\n\t  thread_timer_process so it can be reused for background threads.\n\t  Remove the unneeded quagga_sigevent_process, as pointed out by\n\t  John Lin \u003cjohn.ch.lin@gmail.com\u003e.\n\t  (thread_should_yield) make this available.\n"
    },
    {
      "commit": "924b9229717b749e303f3fb161616bebf53b5cdc",
      "tree": "4788cd7cdc18bfc1cd12916ba506c091e9d73fb8",
      "parents": [
        "dc830cbfac8dd9633e070550359a5d6f8dac8fe5"
      ],
      "author": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 16 17:11:24 2005 +0000"
      },
      "committer": {
        "name": "ajs",
        "email": "ajs",
        "time": "Sat Apr 16 17:11:24 2005 +0000"
      },
      "message": "2005-04-16 Andrew J. Schorr \u003cajschorr@alumni.princeton.edu\u003e\n\n\t* configure.ac: Added AC_ARG_ENABLE(time-check).  By default,\n\t  warning messages will now be printed for threads or commands that take\n\t  longer than 5 seconds, but this configure argument can be used\n\t  to disable the checks or change the threshold.\n\t* thread.h (thread_consumed_time): Declare new function to calculate\n\t  elapsed microseconds.\n\t* thread.c (thread_consumed_time): Must be global not static so we\n\t  can call it from lib/vty.c:vty_command.\n\t  (thread_should_yield): Surround with `#if 0\u0027 to make clear that this\n\t  function is not currently being used anywhere.\n\t  (thread_call): If CONSUMED_TIME_CHECK is defined, print a CPU HOG\n\t  warning message if the thread takes more than CONSUMED_TIME_CHECK\n\t  microseconds.\n\t* vty.c (vty_command): If CONSUMED_TIME_CHECK is defined, print a CPU\n\t  HOG warning message if the command takes more than CONSUMED_TIME_CHECK\n\t  microseconds.\n"
    },
    {
      "commit": "8c328f1106cf0498333c2d8a96940e7b4581e316",
      "tree": "9bf24cca6a68a9dd5d4dda586484e497d0c19ca6",
      "parents": [
        "98c91ac6ac085713c00af00a6ac41779be6b50b3"
      ],
      "author": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Oct 05 21:01:23 2004 +0000"
      },
      "committer": {
        "name": "hasso",
        "email": "hasso",
        "time": "Tue Oct 05 21:01:23 2004 +0000"
      },
      "message": "Number of warnings is down to 3 again in lib directory. A lot of const\u0027s\nadded to strings and a lot of int -\u003e unsigned int changes.\n"
    },
    {
      "commit": "9e867fe663c4eb43c36f35067c0dd092e8c83c14",
      "tree": "f29461b6a2dc8c38037dc0cf91e70392f9ed4ab2",
      "parents": [
        "eb5d44eb8dcf25a1b328e57d1eabb1f89e3bc59b"
      ],
      "author": {
        "name": "jardin",
        "email": "jardin",
        "time": "Tue Dec 23 08:56:18 2003 +0000"
      },
      "committer": {
        "name": "jardin",
        "email": "jardin",
        "time": "Tue Dec 23 08:56:18 2003 +0000"
      },
      "message": "Merge isisd into the Quagga\u0027s framework:\n  - add privs support\n  - use misc quagga\u0027s definitions\n  - make it compile\"able\"\n  - fix segfault cases related to hostname()\n  - add debug isis xxx command\n\nThis patch has been approved by Paul Jakma.\n"
    },
    {
      "commit": "e04ab74d17b4f3456bd3eeefe2043584431b4ea2",
      "tree": "154168b7aeb6b4e2fbc1fd04e5f2c96870120272",
      "parents": [
        "a895901b3c4e6a061f56be90f5fe9bc78e6e5c2f"
      ],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jan 17 23:47:00 2003 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Jan 17 23:47:00 2003 +0000"
      },
      "message": "From havanna_moon@gmx.net Fri Jan 17 23:37:49 2003\nDate: Sat, 11 Jan 2003 23:26:28 +0100 (CET)\nFrom: Yon Uriarte \u003chavanna_moon@gmx.net\u003e\nTo: \"the list(tm) Zebra\" \u003czebra@zebra.org\u003e\nSubject: [zebra 17217] [PATCH] show thread CPU\n\nHi,\n\n a little patch from the \u0027stupid preprocessor tricks\u0027 collection to record\nthread statistics.\n\nUsage: \"show thread cpu [r][w][t][e][x]\"\n\nOutput Fields: self explaining I hope. Type is one of RWTEX for:\n   Read, Write (fd threads), Timer, Event, Execute.\n\n Overhead vs. vanilla zebra: almost nothing. Vanilla CVS zebra already\ncollects thread run times.\n\n\n Caveats: Under linux getrusage has a granularity of 10ms, which is almost\nuseless in this case. Run ./configure, edit config.h and comment out\n\"#define HAVE_RUSAGE\",  this way it will use getimeofday which has a much\nbetter granularity. IMHO this is better, as cooperative threads are\neffectively running during all that wall time (dont care if CPU\nutilization was 3% or 99% during the time the thread was running (an\neffective rusage combined with getimeofday could give that info)).\n\n Maybe someone can give tips for other platforms on API granularity.\n\n\nTODO: change some of the calls to thread_add_$KIND to\nfuncname_thread_add_$KIND with a meaningfull funcname, so users will get a\nbetter idea of what\u0027s going on.\n\nF.ex. (AFAIK):\nospf_spf_calculate_timer -\u003e \"Routes Step 1, areas SPF\"\nospf_ase_calculate_timer -\u003e \"Routes Step 2, externals\"\n\n\n\n Could this be added to the unofficial patch collection?\n\nCould someone with BGP keepalive problems run their bgpd with this patch\nand post the results?\n\n\nTIA, HTH, HAND, regards\n yon\n\n\nExample output:\n--------------------------------\nospfd# show thread cpu\n Runtime(ms)    Invoked Avg uSecs   Max uSecs  Type Thread\n      14.829         31       478         585   T   ospf_ase_calculate_timer\n      82.132       9838         8         291    EX ospf_nsm_event\n       0.029          1        29          29    E  ospf_default_originate_timer\n       0.254          9        28          34   T   ospf_db_desc_timer\n       0.026          7         3          11   T   ospf_wait_timer\n     669.015        523      1279      490696 R     vty_read\n       4.415         45        98         173   TE  ospf_network_lsa_refresh_timer\n      15.026         31       484         588   T   ospf_spf_calculate_timer\n      29.478       1593        18         122    E  ospf_ls_upd_send_queue_event\n       0.173          1       173         173   T   vty_timeout\n       4.173        242        17          58    E  ospf_ls_ack_send_event\n     637.767     121223         5          55   T   ospf_ls_ack_timer\n      39.373        244       161        2691 R     zclient_read\n      12.169         98       124         726    EX ospf_ism_event\n       0.226          2       113         125 R     vty_accept\n     537.776      14256        37        3813  W    ospf_write\n       4.967         41       121         250   T   ospf_router_lsa_timer\n       0.672          1       672         672    E  zclient_connect\n       7.901       1658         4          26   T   ospf_ls_req_timer\n       0.459          2       229         266    E  ospf_external_lsa_originate_timer\n       3.203         60        53         305   T   ospf_maxage_lsa_remover\n     108.341       9772        11          65   T   ospf_ls_upd_timer\n      33.302        525        63        8628  W    vty_flush\n       0.101          1       101         101   T   ospf_router_lsa_update_timer\n       0.016          1        16          16   T   ospf_router_id_update_timer\n      26.970        407        66         176   T   ospf_lsa_maxage_walker\n     381.949      12244        31          69   T   ospf_hello_timer\n       0.114         22         5          14   T   ospf_inactivity_timer\n      34.290       1223        28         310   T   ospf_lsa_refresh_walker\n     470.645       6592        71         665 R     ospf_read\n    3119.791     180693        17      490696 RWTEX TOTAL\nospfd#\n\nbgpd# sh t c TeX\n Runtime(ms)    Invoked Avg uSecs   Max uSecs  Type Thread\n      21.504        476        45          71   T   bgp_keepalive_timer\n      17.784       1157        15         131   T   bgp_reuse_timer\n      29.080        193       150         249   T   bgp_scan\n      23.606        995        23         420    E  bgp_event\n     317.734      28572        11          69   T   bgp_routeadv_timer\n       0.084          1        84          84    E  zlookup_connect\n       0.526          1       526         526    E  zclient_connect\n       1.348         13       103         147   T   bgp_start_timer\n      19.443        142       136         420   T   bgp_connect_timer\n      16.032        772        20          27   T   bgp_import\n     447.141      32322        13         526   TEX TOTAL\nbgpd#\nbgpd# show thread cpu rw\n Runtime(ms)    Invoked Avg uSecs   Max uSecs  Type Thread\n     155.043          7     22149      150659 R     bgp_accept\n     129.638        180       720       53844 R     vty_read\n       1.734         56        30         129 R     zclient_read\n       0.255          2       127         148 R     vty_accept\n      58.483        983        59         340 R     bgp_read\n     171.495      29190         5         245  W    bgp_write\n      13.884        181        76        2542  W    vty_flush\n     530.532      30599        17      150659 RW    TOTAL\nbgpd#\n--------------------------------\n"
    },
    {
      "commit": "718e3744195351130f4ce7dbe0613f4b3e23df93",
      "tree": "bac2ad39971cd43f31241ef123bd4e470f695ac9",
      "parents": [],
      "author": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "committer": {
        "name": "paul",
        "email": "paul",
        "time": "Fri Dec 13 20:15:29 2002 +0000"
      },
      "message": "Initial revision\n"
    }
  ]
}
