From c50443ba7fdb6fe107198163524ba47c09be9cab Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Thu, 25 Feb 2016 11:04:45 +0000 Subject: [PATCH] Add online documentation for v1.0rc3 --- 1.0rc3/1.0rc2_to_1.0rc3.html | 593 +++++ 1.0rc3/Changelog.txt | 205 ++ 1.0rc3/doxygen/annotated.html | 81 + 1.0rc3/doxygen/classes.html | 71 + 1.0rc3/doxygen/deprecated.html | 68 + 1.0rc3/doxygen/doxygen.css | 498 ++++ 1.0rc3/doxygen/doxygen.png | Bin 0 -> 1281 bytes 1.0rc3/doxygen/examples.html | 71 + 1.0rc3/doxygen/files.html | 84 + 1.0rc3/doxygen/functions.html | 291 +++ 1.0rc3/doxygen/functions_func.html | 81 + 1.0rc3/doxygen/functions_vars.html | 281 ++ 1.0rc3/doxygen/globals.html | 97 + 1.0rc3/doxygen/globals_0x61.html | 95 + 1.0rc3/doxygen/globals_0x68.html | 94 + 1.0rc3/doxygen/globals_0x6c.html | 94 + 1.0rc3/doxygen/globals_0x71.html | 1147 +++++++++ 1.0rc3/doxygen/globals_defs.html | 322 +++ 1.0rc3/doxygen/globals_enum.html | 107 + 1.0rc3/doxygen/globals_eval.html | 243 ++ 1.0rc3/doxygen/globals_func.html | 639 +++++ 1.0rc3/doxygen/globals_type.html | 201 ++ 1.0rc3/doxygen/globals_vars.html | 90 + 1.0rc3/doxygen/graph_legend.dot | 22 + 1.0rc3/doxygen/graph_legend.html | 125 + 1.0rc3/doxygen/graph_legend.png | Bin 0 -> 20601 bytes 1.0rc3/doxygen/index.html | 78 + 1.0rc3/doxygen/installdox | 117 + 1.0rc3/doxygen/ipcclient_8c-example.html | 303 +++ 1.0rc3/doxygen/ipcserver_8c-example.html | 464 ++++ 1.0rc3/doxygen/mainpage_8h.html | 69 + 1.0rc3/doxygen/pages.html | 65 + 1.0rc3/doxygen/qb_array_overview.html | 74 + 1.0rc3/doxygen/qb_atomic_overview.html | 67 + 1.0rc3/doxygen/qb_hdb_overview.html | 67 + 1.0rc3/doxygen/qb_ipc_overview.html | 85 + 1.0rc3/doxygen/qb_list_overview.html | 68 + 1.0rc3/doxygen/qb_log_overview.html | 167 ++ 1.0rc3/doxygen/qb_loop_overview.html | 67 + 1.0rc3/doxygen/qb_map_overview.html | 95 + 1.0rc3/doxygen/qb_rb_overview.html | 90 + 1.0rc3/doxygen/qb_util_overview.html | 127 + 1.0rc3/doxygen/qbarray_8h.html | 409 +++ 1.0rc3/doxygen/qbarray_8h__dep__incl.map | 5 + 1.0rc3/doxygen/qbarray_8h__dep__incl.md5 | 1 + 1.0rc3/doxygen/qbarray_8h__dep__incl.png | Bin 0 -> 5878 bytes 1.0rc3/doxygen/qbarray_8h__incl.map | 3 + 1.0rc3/doxygen/qbarray_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbarray_8h__incl.png | Bin 0 -> 6528 bytes 1.0rc3/doxygen/qbatomic_8h.html | 566 ++++ 1.0rc3/doxygen/qbatomic_8h__incl.map | 4 + 1.0rc3/doxygen/qbatomic_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbatomic_8h__incl.png | Bin 0 -> 7419 bytes 1.0rc3/doxygen/qbconfig_8h.html | 106 + 1.0rc3/doxygen/qbconfig_8h__dep__incl.map | 5 + 1.0rc3/doxygen/qbconfig_8h__dep__incl.md5 | 1 + 1.0rc3/doxygen/qbconfig_8h__dep__incl.png | Bin 0 -> 6566 bytes 1.0rc3/doxygen/qbdefs_8h.html | 466 ++++ 1.0rc3/doxygen/qbdefs_8h__dep__incl.map | 10 + 1.0rc3/doxygen/qbdefs_8h__dep__incl.md5 | 1 + 1.0rc3/doxygen/qbdefs_8h__dep__incl.png | Bin 0 -> 14514 bytes 1.0rc3/doxygen/qbhdb_8h.html | 606 +++++ 1.0rc3/doxygen/qbhdb_8h__dep__incl.map | 4 + 1.0rc3/doxygen/qbhdb_8h__dep__incl.md5 | 1 + 1.0rc3/doxygen/qbhdb_8h__dep__incl.png | Bin 0 -> 4173 bytes 1.0rc3/doxygen/qbhdb_8h__incl.map | 4 + 1.0rc3/doxygen/qbhdb_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbhdb_8h__incl.png | Bin 0 -> 14739 bytes 1.0rc3/doxygen/qbipc__common_8h.html | 217 ++ .../doxygen/qbipc__common_8h__dep__incl.map | 4 + .../doxygen/qbipc__common_8h__dep__incl.md5 | 1 + .../doxygen/qbipc__common_8h__dep__incl.png | Bin 0 -> 4721 bytes 1.0rc3/doxygen/qbipc__common_8h__incl.map | 2 + 1.0rc3/doxygen/qbipc__common_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbipc__common_8h__incl.png | Bin 0 -> 2700 bytes 1.0rc3/doxygen/qbipcc_8h.html | 704 +++++ 1.0rc3/doxygen/qbipcc_8h__incl.map | 7 + 1.0rc3/doxygen/qbipcc_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbipcc_8h__incl.png | Bin 0 -> 33063 bytes 1.0rc3/doxygen/qbipcs_8h.html | 1382 ++++++++++ 1.0rc3/doxygen/qbipcs_8h__incl.map | 7 + 1.0rc3/doxygen/qbipcs_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbipcs_8h__incl.png | Bin 0 -> 30899 bytes 1.0rc3/doxygen/qblist_8h.html | 922 +++++++ 1.0rc3/doxygen/qblist_8h__incl.map | 3 + 1.0rc3/doxygen/qblist_8h__incl.md5 | 1 + 1.0rc3/doxygen/qblist_8h__incl.png | Bin 0 -> 4993 bytes 1.0rc3/doxygen/qblog_8h.html | 1953 ++++++++++++++ 1.0rc3/doxygen/qblog_8h__incl.map | 5 + 1.0rc3/doxygen/qblog_8h__incl.md5 | 1 + 1.0rc3/doxygen/qblog_8h__incl.png | Bin 0 -> 29503 bytes 1.0rc3/doxygen/qbloop_8h.html | 1037 ++++++++ 1.0rc3/doxygen/qbloop_8h__dep__incl.map | 3 + 1.0rc3/doxygen/qbloop_8h__dep__incl.md5 | 1 + 1.0rc3/doxygen/qbloop_8h__dep__incl.png | Bin 0 -> 2466 bytes 1.0rc3/doxygen/qbloop_8h__incl.map | 2 + 1.0rc3/doxygen/qbloop_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbloop_8h__incl.png | Bin 0 -> 4377 bytes 1.0rc3/doxygen/qbmap_8h.html | 860 +++++++ 1.0rc3/doxygen/qbmap_8h__incl.map | 2 + 1.0rc3/doxygen/qbmap_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbmap_8h__incl.png | Bin 0 -> 4374 bytes 1.0rc3/doxygen/qbrb_8h.html | 908 +++++++ 1.0rc3/doxygen/qbrb_8h__incl.map | 2 + 1.0rc3/doxygen/qbrb_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbrb_8h__incl.png | Bin 0 -> 4895 bytes 1.0rc3/doxygen/qbutil_8h.html | 861 +++++++ 1.0rc3/doxygen/qbutil_8h__dep__incl.map | 3 + 1.0rc3/doxygen/qbutil_8h__dep__incl.md5 | 1 + 1.0rc3/doxygen/qbutil_8h__dep__incl.png | Bin 0 -> 2336 bytes 1.0rc3/doxygen/qbutil_8h__incl.map | 3 + 1.0rc3/doxygen/qbutil_8h__incl.md5 | 1 + 1.0rc3/doxygen/qbutil_8h__incl.png | Bin 0 -> 8487 bytes 1.0rc3/doxygen/search/all_5f.html | 44 + 1.0rc3/doxygen/search/all_61.html | 35 + 1.0rc3/doxygen/search/all_63.html | 65 + 1.0rc3/doxygen/search/all_64.html | 44 + 1.0rc3/doxygen/search/all_65.html | 35 + 1.0rc3/doxygen/search/all_66.html | 62 + 1.0rc3/doxygen/search/all_68.html | 38 + 1.0rc3/doxygen/search/all_69.html | 38 + 1.0rc3/doxygen/search/all_6a.html | 26 + 1.0rc3/doxygen/search/all_6c.html | 32 + 1.0rc3/doxygen/search/all_6d.html | 31 + 1.0rc3/doxygen/search/all_6e.html | 26 + 1.0rc3/doxygen/search/all_70.html | 32 + 1.0rc3/doxygen/search/all_71.html | 2274 +++++++++++++++++ 1.0rc3/doxygen/search/all_72.html | 53 + 1.0rc3/doxygen/search/all_73.html | 41 + 1.0rc3/doxygen/search/all_74.html | 32 + 1.0rc3/doxygen/search/classes_71.html | 80 + 1.0rc3/doxygen/search/close.png | Bin 0 -> 273 bytes 1.0rc3/doxygen/search/defines_68.html | 26 + 1.0rc3/doxygen/search/defines_6c.html | 26 + 1.0rc3/doxygen/search/defines_71.html | 458 ++++ 1.0rc3/doxygen/search/enums_71.html | 74 + 1.0rc3/doxygen/search/enumvalues_71.html | 332 +++ 1.0rc3/doxygen/search/files_6d.html | 25 + 1.0rc3/doxygen/search/files_71.html | 90 + 1.0rc3/doxygen/search/functions_5f.html | 32 + 1.0rc3/doxygen/search/functions_71.html | 1124 ++++++++ 1.0rc3/doxygen/search/nomatches.html | 12 + 1.0rc3/doxygen/search/search.css | 198 ++ 1.0rc3/doxygen/search/search.js | 742 ++++++ 1.0rc3/doxygen/search/search.png | Bin 0 -> 527 bytes 1.0rc3/doxygen/search/typedefs_71.html | 248 ++ 1.0rc3/doxygen/search/variables_5f.html | 32 + 1.0rc3/doxygen/search/variables_61.html | 35 + 1.0rc3/doxygen/search/variables_63.html | 65 + 1.0rc3/doxygen/search/variables_64.html | 44 + 1.0rc3/doxygen/search/variables_65.html | 35 + 1.0rc3/doxygen/search/variables_66.html | 62 + 1.0rc3/doxygen/search/variables_68.html | 32 + 1.0rc3/doxygen/search/variables_69.html | 38 + 1.0rc3/doxygen/search/variables_6a.html | 26 + 1.0rc3/doxygen/search/variables_6c.html | 26 + 1.0rc3/doxygen/search/variables_6d.html | 26 + 1.0rc3/doxygen/search/variables_6e.html | 26 + 1.0rc3/doxygen/search/variables_70.html | 32 + 1.0rc3/doxygen/search/variables_72.html | 53 + 1.0rc3/doxygen/search/variables_73.html | 41 + 1.0rc3/doxygen/search/variables_74.html | 32 + 1.0rc3/doxygen/simplelog_8c-example.html | 318 +++ 1.0rc3/doxygen/structqb__hdb.html | 146 ++ 1.0rc3/doxygen/structqb__hdb__handle.html | 132 + .../structqb__ipc__request__header.html | 118 + .../structqb__ipc__response__header.html | 137 + .../structqb__ipcs__connection__stats.html | 192 ++ .../structqb__ipcs__connection__stats__2.html | 202 ++ .../structqb__ipcs__poll__handlers.html | 136 + .../structqb__ipcs__service__handlers.html | 150 ++ 1.0rc3/doxygen/structqb__ipcs__stats.html | 108 + 1.0rc3/doxygen/structqb__list__head.html | 113 + .../structqb__list__head__coll__graph.map | 2 + .../structqb__list__head__coll__graph.md5 | 1 + .../structqb__list__head__coll__graph.png | Bin 0 -> 4654 bytes 1.0rc3/doxygen/structqb__log__callsite.html | 186 ++ 1.0rc3/doxygen/tab_b.gif | Bin 0 -> 35 bytes 1.0rc3/doxygen/tab_l.gif | Bin 0 -> 706 bytes 1.0rc3/doxygen/tab_r.gif | Bin 0 -> 2585 bytes 1.0rc3/doxygen/tabs.css | 105 + 1.0rc3/doxygen/tcpserver_8c-example.html | 215 ++ .../doxygen/unionqb__log__ctl2__arg__t.html | 104 + 183 files changed, 28042 insertions(+) create mode 100644 1.0rc3/1.0rc2_to_1.0rc3.html create mode 100644 1.0rc3/Changelog.txt create mode 100644 1.0rc3/doxygen/annotated.html create mode 100644 1.0rc3/doxygen/classes.html create mode 100644 1.0rc3/doxygen/deprecated.html create mode 100644 1.0rc3/doxygen/doxygen.css create mode 100644 1.0rc3/doxygen/doxygen.png create mode 100644 1.0rc3/doxygen/examples.html create mode 100644 1.0rc3/doxygen/files.html create mode 100644 1.0rc3/doxygen/functions.html create mode 100644 1.0rc3/doxygen/functions_func.html create mode 100644 1.0rc3/doxygen/functions_vars.html create mode 100644 1.0rc3/doxygen/globals.html create mode 100644 1.0rc3/doxygen/globals_0x61.html create mode 100644 1.0rc3/doxygen/globals_0x68.html create mode 100644 1.0rc3/doxygen/globals_0x6c.html create mode 100644 1.0rc3/doxygen/globals_0x71.html create mode 100644 1.0rc3/doxygen/globals_defs.html create mode 100644 1.0rc3/doxygen/globals_enum.html create mode 100644 1.0rc3/doxygen/globals_eval.html create mode 100644 1.0rc3/doxygen/globals_func.html create mode 100644 1.0rc3/doxygen/globals_type.html create mode 100644 1.0rc3/doxygen/globals_vars.html create mode 100644 1.0rc3/doxygen/graph_legend.dot create mode 100644 1.0rc3/doxygen/graph_legend.html create mode 100644 1.0rc3/doxygen/graph_legend.png create mode 100644 1.0rc3/doxygen/index.html create mode 100755 1.0rc3/doxygen/installdox create mode 100644 1.0rc3/doxygen/ipcclient_8c-example.html create mode 100644 1.0rc3/doxygen/ipcserver_8c-example.html create mode 100644 1.0rc3/doxygen/mainpage_8h.html create mode 100644 1.0rc3/doxygen/pages.html create mode 100644 1.0rc3/doxygen/qb_array_overview.html create mode 100644 1.0rc3/doxygen/qb_atomic_overview.html create mode 100644 1.0rc3/doxygen/qb_hdb_overview.html create mode 100644 1.0rc3/doxygen/qb_ipc_overview.html create mode 100644 1.0rc3/doxygen/qb_list_overview.html create mode 100644 1.0rc3/doxygen/qb_log_overview.html create mode 100644 1.0rc3/doxygen/qb_loop_overview.html create mode 100644 1.0rc3/doxygen/qb_map_overview.html create mode 100644 1.0rc3/doxygen/qb_rb_overview.html create mode 100644 1.0rc3/doxygen/qb_util_overview.html create mode 100644 1.0rc3/doxygen/qbarray_8h.html create mode 100644 1.0rc3/doxygen/qbarray_8h__dep__incl.map create mode 100644 1.0rc3/doxygen/qbarray_8h__dep__incl.md5 create mode 100644 1.0rc3/doxygen/qbarray_8h__dep__incl.png create mode 100644 1.0rc3/doxygen/qbarray_8h__incl.map create mode 100644 1.0rc3/doxygen/qbarray_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbarray_8h__incl.png create mode 100644 1.0rc3/doxygen/qbatomic_8h.html create mode 100644 1.0rc3/doxygen/qbatomic_8h__incl.map create mode 100644 1.0rc3/doxygen/qbatomic_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbatomic_8h__incl.png create mode 100644 1.0rc3/doxygen/qbconfig_8h.html create mode 100644 1.0rc3/doxygen/qbconfig_8h__dep__incl.map create mode 100644 1.0rc3/doxygen/qbconfig_8h__dep__incl.md5 create mode 100644 1.0rc3/doxygen/qbconfig_8h__dep__incl.png create mode 100644 1.0rc3/doxygen/qbdefs_8h.html create mode 100644 1.0rc3/doxygen/qbdefs_8h__dep__incl.map create mode 100644 1.0rc3/doxygen/qbdefs_8h__dep__incl.md5 create mode 100644 1.0rc3/doxygen/qbdefs_8h__dep__incl.png create mode 100644 1.0rc3/doxygen/qbhdb_8h.html create mode 100644 1.0rc3/doxygen/qbhdb_8h__dep__incl.map create mode 100644 1.0rc3/doxygen/qbhdb_8h__dep__incl.md5 create mode 100644 1.0rc3/doxygen/qbhdb_8h__dep__incl.png create mode 100644 1.0rc3/doxygen/qbhdb_8h__incl.map create mode 100644 1.0rc3/doxygen/qbhdb_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbhdb_8h__incl.png create mode 100644 1.0rc3/doxygen/qbipc__common_8h.html create mode 100644 1.0rc3/doxygen/qbipc__common_8h__dep__incl.map create mode 100644 1.0rc3/doxygen/qbipc__common_8h__dep__incl.md5 create mode 100644 1.0rc3/doxygen/qbipc__common_8h__dep__incl.png create mode 100644 1.0rc3/doxygen/qbipc__common_8h__incl.map create mode 100644 1.0rc3/doxygen/qbipc__common_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbipc__common_8h__incl.png create mode 100644 1.0rc3/doxygen/qbipcc_8h.html create mode 100644 1.0rc3/doxygen/qbipcc_8h__incl.map create mode 100644 1.0rc3/doxygen/qbipcc_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbipcc_8h__incl.png create mode 100644 1.0rc3/doxygen/qbipcs_8h.html create mode 100644 1.0rc3/doxygen/qbipcs_8h__incl.map create mode 100644 1.0rc3/doxygen/qbipcs_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbipcs_8h__incl.png create mode 100644 1.0rc3/doxygen/qblist_8h.html create mode 100644 1.0rc3/doxygen/qblist_8h__incl.map create mode 100644 1.0rc3/doxygen/qblist_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qblist_8h__incl.png create mode 100644 1.0rc3/doxygen/qblog_8h.html create mode 100644 1.0rc3/doxygen/qblog_8h__incl.map create mode 100644 1.0rc3/doxygen/qblog_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qblog_8h__incl.png create mode 100644 1.0rc3/doxygen/qbloop_8h.html create mode 100644 1.0rc3/doxygen/qbloop_8h__dep__incl.map create mode 100644 1.0rc3/doxygen/qbloop_8h__dep__incl.md5 create mode 100644 1.0rc3/doxygen/qbloop_8h__dep__incl.png create mode 100644 1.0rc3/doxygen/qbloop_8h__incl.map create mode 100644 1.0rc3/doxygen/qbloop_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbloop_8h__incl.png create mode 100644 1.0rc3/doxygen/qbmap_8h.html create mode 100644 1.0rc3/doxygen/qbmap_8h__incl.map create mode 100644 1.0rc3/doxygen/qbmap_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbmap_8h__incl.png create mode 100644 1.0rc3/doxygen/qbrb_8h.html create mode 100644 1.0rc3/doxygen/qbrb_8h__incl.map create mode 100644 1.0rc3/doxygen/qbrb_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbrb_8h__incl.png create mode 100644 1.0rc3/doxygen/qbutil_8h.html create mode 100644 1.0rc3/doxygen/qbutil_8h__dep__incl.map create mode 100644 1.0rc3/doxygen/qbutil_8h__dep__incl.md5 create mode 100644 1.0rc3/doxygen/qbutil_8h__dep__incl.png create mode 100644 1.0rc3/doxygen/qbutil_8h__incl.map create mode 100644 1.0rc3/doxygen/qbutil_8h__incl.md5 create mode 100644 1.0rc3/doxygen/qbutil_8h__incl.png create mode 100644 1.0rc3/doxygen/search/all_5f.html create mode 100644 1.0rc3/doxygen/search/all_61.html create mode 100644 1.0rc3/doxygen/search/all_63.html create mode 100644 1.0rc3/doxygen/search/all_64.html create mode 100644 1.0rc3/doxygen/search/all_65.html create mode 100644 1.0rc3/doxygen/search/all_66.html create mode 100644 1.0rc3/doxygen/search/all_68.html create mode 100644 1.0rc3/doxygen/search/all_69.html create mode 100644 1.0rc3/doxygen/search/all_6a.html create mode 100644 1.0rc3/doxygen/search/all_6c.html create mode 100644 1.0rc3/doxygen/search/all_6d.html create mode 100644 1.0rc3/doxygen/search/all_6e.html create mode 100644 1.0rc3/doxygen/search/all_70.html create mode 100644 1.0rc3/doxygen/search/all_71.html create mode 100644 1.0rc3/doxygen/search/all_72.html create mode 100644 1.0rc3/doxygen/search/all_73.html create mode 100644 1.0rc3/doxygen/search/all_74.html create mode 100644 1.0rc3/doxygen/search/classes_71.html create mode 100644 1.0rc3/doxygen/search/close.png create mode 100644 1.0rc3/doxygen/search/defines_68.html create mode 100644 1.0rc3/doxygen/search/defines_6c.html create mode 100644 1.0rc3/doxygen/search/defines_71.html create mode 100644 1.0rc3/doxygen/search/enums_71.html create mode 100644 1.0rc3/doxygen/search/enumvalues_71.html create mode 100644 1.0rc3/doxygen/search/files_6d.html create mode 100644 1.0rc3/doxygen/search/files_71.html create mode 100644 1.0rc3/doxygen/search/functions_5f.html create mode 100644 1.0rc3/doxygen/search/functions_71.html create mode 100644 1.0rc3/doxygen/search/nomatches.html create mode 100644 1.0rc3/doxygen/search/search.css create mode 100644 1.0rc3/doxygen/search/search.js create mode 100644 1.0rc3/doxygen/search/search.png create mode 100644 1.0rc3/doxygen/search/typedefs_71.html create mode 100644 1.0rc3/doxygen/search/variables_5f.html create mode 100644 1.0rc3/doxygen/search/variables_61.html create mode 100644 1.0rc3/doxygen/search/variables_63.html create mode 100644 1.0rc3/doxygen/search/variables_64.html create mode 100644 1.0rc3/doxygen/search/variables_65.html create mode 100644 1.0rc3/doxygen/search/variables_66.html create mode 100644 1.0rc3/doxygen/search/variables_68.html create mode 100644 1.0rc3/doxygen/search/variables_69.html create mode 100644 1.0rc3/doxygen/search/variables_6a.html create mode 100644 1.0rc3/doxygen/search/variables_6c.html create mode 100644 1.0rc3/doxygen/search/variables_6d.html create mode 100644 1.0rc3/doxygen/search/variables_6e.html create mode 100644 1.0rc3/doxygen/search/variables_70.html create mode 100644 1.0rc3/doxygen/search/variables_72.html create mode 100644 1.0rc3/doxygen/search/variables_73.html create mode 100644 1.0rc3/doxygen/search/variables_74.html create mode 100644 1.0rc3/doxygen/simplelog_8c-example.html create mode 100644 1.0rc3/doxygen/structqb__hdb.html create mode 100644 1.0rc3/doxygen/structqb__hdb__handle.html create mode 100644 1.0rc3/doxygen/structqb__ipc__request__header.html create mode 100644 1.0rc3/doxygen/structqb__ipc__response__header.html create mode 100644 1.0rc3/doxygen/structqb__ipcs__connection__stats.html create mode 100644 1.0rc3/doxygen/structqb__ipcs__connection__stats__2.html create mode 100644 1.0rc3/doxygen/structqb__ipcs__poll__handlers.html create mode 100644 1.0rc3/doxygen/structqb__ipcs__service__handlers.html create mode 100644 1.0rc3/doxygen/structqb__ipcs__stats.html create mode 100644 1.0rc3/doxygen/structqb__list__head.html create mode 100644 1.0rc3/doxygen/structqb__list__head__coll__graph.map create mode 100644 1.0rc3/doxygen/structqb__list__head__coll__graph.md5 create mode 100644 1.0rc3/doxygen/structqb__list__head__coll__graph.png create mode 100644 1.0rc3/doxygen/structqb__log__callsite.html create mode 100644 1.0rc3/doxygen/tab_b.gif create mode 100644 1.0rc3/doxygen/tab_l.gif create mode 100644 1.0rc3/doxygen/tab_r.gif create mode 100644 1.0rc3/doxygen/tabs.css create mode 100644 1.0rc3/doxygen/tcpserver_8c-example.html create mode 100644 1.0rc3/doxygen/unionqb__log__ctl2__arg__t.html diff --git a/1.0rc3/1.0rc2_to_1.0rc3.html b/1.0rc3/1.0rc2_to_1.0rc3.html new file mode 100644 index 000000000..8af4f71ef --- /dev/null +++ b/1.0rc3/1.0rc2_to_1.0rc3.html @@ -0,0 +1,593 @@ + + + + + + + + + + libqb: 1.0rc2 to 1.0rc3 compatibility report + + + +

API compatibility report for the libqb library between 1.0rc2 and 1.0rc3 versions on x86_64

+ +
+ Binary
Compatibility
+ Source
Compatibility
+
+

Test Info


+ + + + + + + +
Library Namelibqb
Version #11.0rc2
Version #21.0rc3
CPU Typex86_64
GCC Version4.4.7
SubjectBinary Compatibility
+

Test Results


+ + + + +
Total Header Files14
Total Shared Libraries1
Total Symbols / Types175 / 141
VerdictCompatible
+

Problem Summary


+ + + + + + + + + + +
SeverityCount
Added Symbols-1
Removed SymbolsHigh0
Problems with
Data Types
High0
Medium0
Low0
Problems with
Symbols
High0
Medium0
Low0
Problems with
Constants
Low5
Other Changes
in Data Types
-1
+ +

Added Symbols (1)


+qblog.h, libqb.so.0.17.3
+qb_log_ctl2 int32_t target, enum qb_log_conf conf_type, union qb_log_ctl2_arg_t arg )
+
+to the top
+

Problems with Constants, Low Severity (5)


+qblog.h
+ +[+] QB_LOG_BLACKBOX +
+ + + +[+] QB_LOG_STDERR +
+ + + +[+] QB_LOG_STDOUT +
+ + + +[+] QB_LOG_SYSLOG +
+ + + +[+] QB_LOG_TARGET_MAX +
+ + +
+to the top
+ +

Other Changes in Data Types (1)


+qblog.h
+ +[+] enum qb_log_conf (1) +
+ + +
to the top
+

Header Files (14)


+
+qbarray.h
+qbatomic.h
+qbconfig.h
+qbdefs.h
+qbhdb.h
+qbipc_common.h
+qbipcc.h
+qbipcs.h
+qblist.h
+qblog.h
+qbloop.h
+qbmap.h
+qbrb.h
+qbutil.h
+
+
to the top
+

Shared Libraries (1)


+
+libqb.so.0.17.3
+
+
to the top
+


+

Test Info


+ + + + + + + +
Library Namelibqb
Version #11.0rc2
Version #21.0rc3
CPU Typex86_64
GCC Version4.4.7
SubjectSource Compatibility
+

Test Results


+ + + + +
Total Header Files14
Total Shared Libraries1
Total Symbols / Types185 / 145
VerdictCompatible
+

Problem Summary


+ + + + + + + + + + +
SeverityCount
Added Symbols-1
Removed SymbolsHigh0
Problems with
Data Types
High0
Medium0
Low0
Problems with
Symbols
High0
Medium0
Low0
Problems with
Constants
Low5
Other Changes
in Data Types
-1
+ +

Added Symbols (1)


+qblog.h
+qb_log_ctl2 int32_t target, enum qb_log_conf conf_type, union qb_log_ctl2_arg_t arg )
+
+to the top
+

Problems with Constants, Low Severity (5)


+qblog.h
+ +[+] QB_LOG_BLACKBOX +
+ + + +[+] QB_LOG_STDERR +
+ + + +[+] QB_LOG_STDOUT +
+ + + +[+] QB_LOG_SYSLOG +
+ + + +[+] QB_LOG_TARGET_MAX +
+ + +
+to the top
+ +

Other Changes in Data Types (1)


+qblog.h
+ +[+] enum qb_log_conf (1) +
+ + +
to the top
+

Header Files (14)


+
+qbarray.h
+qbatomic.h
+qbconfig.h
+qbdefs.h
+qbhdb.h
+qbipc_common.h
+qbipcc.h
+qbipcs.h
+qblist.h
+qblog.h
+qbloop.h
+qbmap.h
+qbrb.h
+qbutil.h
+
+
to the top
+

Shared Libraries (1)


+
+libqb.so.0.17.3
+
+
to the top
+



+ diff --git a/1.0rc3/Changelog.txt b/1.0rc3/Changelog.txt new file mode 100644 index 000000000..5ec6bc09c --- /dev/null +++ b/1.0rc3/Changelog.txt @@ -0,0 +1,205 @@ +2016-02-22 Christine Caulfield + + travis: Add a normal 'make' to the checks + make check doesn't build the docs and so errors in that part of + the build system will not be checked without a normal 'make'. + +2016-02-22 Chrissie Caulfield + + Merge pull request #185 from jnpkrn/followup-fixes + Follow-up fixes + +2016-02-22 Jan Pokorný + + build: GCC < 4.6 does not support diagnostic push/pop pragmas + Better to get sort of a spurious warning then to possibly mess up + with a warnings safety net. + Reported by Chrissie (thanks). + + build: fix man3 pages not installed + Issue with original version of the patch spotted by Chrissie (thanks). + +2016-02-22 Chrissie Caulfield + + Merge pull request #179 from dpejesh/socket + socket improvements for freebsd + + Merge pull request #184 from jnpkrn/maint-no_magic-build_manpages + Maintainance: no magic + better manpages building + + Merge pull request #181 from jnpkrn/log-target-slot-enum + log: enum qb_log_target_slot introduction + qblog.h cleanup + +2016-02-18 Jan Pokorný + + build: header-based man pages: include also qbdefs.h+qbrb.h + No reason not to do that. Situation with qbconfig.h is a bit more + complicated as this file gets generated from .in file and there is + currently no reliable inter-dir/makefile (siblings) targets + dependency tracking in place, AFAICT. + + build: header-based man pages: dependent_headers - blacklist + IOW, make tracking of interfaces to document via man pages maintainable. + + build: grab "dependent_headers" from respective Makefile.am + ...with "echo path/*.h" fallback (equivalent of wildcard function) if + the new methods fails for some reason. + + build: fix "dependant" typo + + Low: no magic constants + gethostname usage sanity + +2016-02-18 Chrissie Caulfield + + Merge pull request #177 from jnpkrn/changing-syslog-identifier-nicer + Changing syslog identifier + testing syslog, preferred edition + + Merge pull request #180 from jnpkrn/example-simplelog-stdout + example: simplelog supports -o (for stdout sink) + + Merge pull request #178 from jnpkrn/format-annotations + build: avoid too keen -Wmissing-format-attribute warning + + Merge pull request #183 from jnpkrn/doc-fix-overview + Doc: fix overview + +2016-02-18 Jan Pokorný + + CI: restore travis notifications, IRC this time around + While quarterback [dash] devel [at] lists [dot] fedorahosted [dot] org, + original notification target and development ML seems long gone (without + archives preserved!), let's use #clusterlabs-dev at freenode IRC + network. This is in-line with the purpose of the channel and it's what + clufter, crmsh and hawk seem to be currently using. + + CI: enable recently added syslog-tests in .travis.yml + + CI: .travis.yml cosmetics + + Feature: allow changing the identifier for syslog (+tests) + Original "qb_log_ctl" interface had to be extended for passing read-only + strings (new parameter), resulting in new "qb_log_ctl2" function, which + is what qb_log_ctl calls into with the new parameter set to NULL. + This ensures backward compatibility. + A new QB_LOG_CONF_IDENT configuration directive for the mentioned + interface is added with a goal to set new internal identifier + that is, notably, used for syslog sink. This allows for switching + the identification without a need to reinitialize logging subsystem, + akin to changing target logging facility. + Also a brand new concept of testing syslog sink in particular is + introduced (finally). During initial trial&error stage, it used + LD_PRELOAD hack but it seems that libtool is sophisticated enough + that no such extra intervention is needed and the desired symbol + resolution Just Works (tm). However, the technique is highly + non-portable (there is even a warning about that from libtool, + which is partially on purpose as the _syslog_override.so should + rather be explicit it is by no mean a regular library) and hence + the syslog tests have to be enabled with explicit + ./configure --enable-syslog-tests + rather than possibly break on untested platforms (far too many). + The concept can be extended upon, but initially, just the new + feature is being tested. + Post-review: thanks Chrissie for a suggestion how to deal with + extract-arg-and-forget in a less intrusive way (no defines). + +2016-02-16 Jan Pokorný + + qblog.h: fix typos and make stylistic enhancements + + qblog.h: unify descriptions before the code examples + - use semicolons at the end of the description + - use commas when there can be an issue with parsing a long sentence + (and wrap such text at 79 characters if applicable) + + log: convert few more instances to use enum qb_log_target_slot + + log: refactor static target slots state initialization + It doesn't matter that also syslog is disabled first, as it will get + enabled few lines later on (uniformity + simplicity > optimization + + complexity). + + log: better (fixed) documentation for funcs returning "slot" index + Also add missing "stdout" to the enumerations of the static ones. + + doc: IPC overview: fix typos + + doc: main overview: fix style + reword per spec file + + log: convert log target defined values into enum values + Also use the new enum qb_log_target_slot type in for-loops together + with a proper substitute for the literal "0" initializer. + There could be more places that might be type-substituted for this enum + (and hence possibly catch more of an incorrect usage if the compiler + or checker has some notion of enum type narrowing), but leave it as + a possible enhancement for now. + + log: defined value as an index-pointer after static slots + Amongst other uses, this allows for better (fixed) documentation + regarding how many additional logging targets the user can define. + +2016-02-15 Jan Pokorný + + example: simplelog supports -o (for stdout sink) + +2016-02-14 David Shane Holden + + ipc: return -errno when getsockopt/setsockopt fail + + ipc: set socket buffer size used by ipcs service + + ipc: set socket receive buffer + Set the sockets receive buffer size to match the send buffer. On + FreeBSD without this calls to sendto() will result in an ENOBUFS error + if the message is larger than net.local.dgram.recvspace sysctl. + +2016-02-12 Jan Pokorný + + build: avoid too keen -Wmissing-format-attribute warning + Grouped with pre-existing -Wsuggest-attribute=format treatment. + +2016-02-04 Chrissie Caulfield + + Merge pull request #175 from jnpkrn/format-annotations + Format annotations + + Merge pull request #174 from jnpkrn/spec-cleanup + Spec cleanup + +2016-02-03 Jan Pokorný + + spec cleanup: drop redundant %{buildroot} cleaning + References: + http://pkgs.fedoraproject.org/cgit/rpms/redhat-rpm-config.git/commit/?id=159a65f + (~2010) + + spec cleanup: summary should not end with a dot + References: + https://fedoraproject.org/wiki/Common_Rpmlint_issues#summary-ended-with-dot + https://en.opensuse.org/openSUSE:Specfile_guidelines#Summary + + it's an internal inconsistency with Summary for -devel package + + includes: format __attribute__ func. annotations in qblog.h + + build: avoid too keen -Wsuggest-attribute=format warning + With gcc 5.3.1 20151207: + > log.c: In function 'cs_format': + > log.c:182:2: warning: function might be possible candidate for + > 'gnu_printf' format attribute [-Wsuggest-attribute=format] + > len = vsnprintf(str, QB_LOG_MAX_LEN, cs->format, ap_copy); + > ^ + We certainly don't want to disable that warning globally so make use of + diagnostic pragmas for GCC instead in one instance that we cannot + annotate properly. + + spec cleanup: get rid of redundant %clean section + References: + http://rpm.org/gitweb?p=rpm.git;a=commit;h=3fc5824 (~2009) + + spec cleanup: remove ignored BuildRoot tag + References: + http://rpm.org/gitweb?p=rpm.git;a=commit;h=6c06519 (~2008) + + spec cleanup: get rid of redundant defattr + References (first one is a direct trigger): + https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/KEO7AX3JXR2TY6OVL4M7HDISZ6YIJNKU/#2UFET77NHMJTG4NA2ECRVH2KO3W56ZWD + http://rpm.org/gitweb?p=rpm.git;a=commit;h=47ea5da (~2004) diff --git a/1.0rc3/doxygen/annotated.html b/1.0rc3/doxygen/annotated.html new file mode 100644 index 000000000..f590d76c6 --- /dev/null +++ b/1.0rc3/doxygen/annotated.html @@ -0,0 +1,81 @@ + + + + + +libqb: Data Structures + + + + + + + + + +
+

Data Structures

Here are the data structures with brief descriptions: + + + + + + + + + + + + +
qb_hdb
qb_hdb_handle
qb_ipc_request_header
qb_ipc_response_header
qb_ipcs_connection_stats
qb_ipcs_connection_stats_2
qb_ipcs_poll_handlers
qb_ipcs_service_handlers
qb_ipcs_stats
qb_list_head
qb_log_callsiteAn instance of this structure is created in a special ELF section at every dynamic debug callsite
qb_log_ctl2_arg_t
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/classes.html b/1.0rc3/doxygen/classes.html new file mode 100644 index 000000000..4d238149c --- /dev/null +++ b/1.0rc3/doxygen/classes.html @@ -0,0 +1,71 @@ + + + + + +libqb: Alphabetical List + + + + + + + + + + + + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/deprecated.html b/1.0rc3/doxygen/deprecated.html new file mode 100644 index 000000000..c0cda453d --- /dev/null +++ b/1.0rc3/doxygen/deprecated.html @@ -0,0 +1,68 @@ + + + + + +libqb: Deprecated List + + + + + + + + + +
+ + +

Deprecated List

+
+
Global qb_ipcs_connection_stats_get
+
from v0.13.0 onwards, use qb_ipcs_connection_stats_get_2
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/doxygen.css b/1.0rc3/doxygen/doxygen.css new file mode 100644 index 000000000..9ca3cafbc --- /dev/null +++ b/1.0rc3/doxygen/doxygen.css @@ -0,0 +1,498 @@ +/* The standard CSS for doxygen */ + +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; +} + +/* @group Heading Levels */ + +h1 { + text-align: center; + font-size: 150%; +} + +h2 { + font-size: 120%; +} + +h3 { + font-size: 100%; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #153788; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #1b77c5; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code { +} + +a.codeRef { +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +pre.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding: 4px 6px; + margin: 4px 8px 4px 2px; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} + +td.indexkey { + background-color: #e8eef2; + font-weight: bold; + border: 1px solid #CCCCCC; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +td.indexvalue { + background-color: #e8eef2; + border: 1px solid #CCCCCC; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #f0f0f0; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +/* @end */ + +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} + +th.dirtab { + background: #e8eef2; + font-weight: bold; +} + +hr { + height: 0; + border: none; + border-top: 1px solid #666; +} + +/* @group Member Descriptions */ + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #FAFAFA; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #ccc; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memTemplParams { + color: #606060; + white-space: nowrap; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; +} + +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.memitem { + padding: 0; + margin-bottom: 10px; +} + +.memname { + white-space: nowrap; + font-weight: bold; +} + +.memproto, .memdoc { + border: 1px solid #84b0c7; +} + +.memproto { + padding: 0; + background-color: #d5e1e8; + font-weight: bold; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + +} + +.memdoc { + padding: 2px 5px; + background-color: #eef3f5; + border-top-width: 0; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0.5em; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +address { + font-style: normal; + color: #333; +} diff --git a/1.0rc3/doxygen/doxygen.png b/1.0rc3/doxygen/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a274bbaffdd67f6d784c894d9cf28729db0e14 GIT binary patch literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/examples.html b/1.0rc3/doxygen/examples.html new file mode 100644 index 000000000..f32731136 --- /dev/null +++ b/1.0rc3/doxygen/examples.html @@ -0,0 +1,71 @@ + + + + + +libqb: Examples + + + + + + + + + +
+

Examples

Here is a list of all examples: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/files.html b/1.0rc3/doxygen/files.html new file mode 100644 index 000000000..4de0be952 --- /dev/null +++ b/1.0rc3/doxygen/files.html @@ -0,0 +1,84 @@ + + + + + +libqb: File Index + + + + + + + + + +
+

File List

Here is a list of all files with brief descriptions: + + + + + + + + + + + + + + + +
mainpage.h
qbarray.hThis is a dynamic array (it can grow, but without moving memory)
qbatomic.hBasic atomic integer and pointer operations
qbconfig.h
qbdefs.h
qbhdb.hThe handle database is for reference counting objects
qbipc_common.hCommon types and definitions
qbipcc.hClient IPC API
qbipcs.hServer IPC API
qblist.hThis is a kernel style list implementation
qblog.hThe logging API provides four main parts (basics, filtering, threading & blackbox)
qbloop.hMain loop manages timers, jobs and polling sockets
qbmap.hThis provides a map interface to a Patricia trie, hashtable or skiplist
qbrb.hThis implements a ring buffer that works in "chunks" not bytes
qbutil.hThese are some convience functions used throughout libqb
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/functions.html b/1.0rc3/doxygen/functions.html new file mode 100644 index 000000000..80497be42 --- /dev/null +++ b/1.0rc3/doxygen/functions.html @@ -0,0 +1,291 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+Here is a list of all struct and union fields with links to the structures/unions they belong to: + +

- _ -

+ + +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/functions_func.html b/1.0rc3/doxygen/functions_func.html new file mode 100644 index 000000000..2e40df22a --- /dev/null +++ b/1.0rc3/doxygen/functions_func.html @@ -0,0 +1,81 @@ + + + + + +libqb: Data Fields - Functions + + + + + + + + + + + + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/functions_vars.html b/1.0rc3/doxygen/functions_vars.html new file mode 100644 index 000000000..241353fae --- /dev/null +++ b/1.0rc3/doxygen/functions_vars.html @@ -0,0 +1,281 @@ + + + + + +libqb: Data Fields - Variables + + + + + + + + + +
+  + +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals.html b/1.0rc3/doxygen/globals.html new file mode 100644 index 000000000..c0350fda9 --- /dev/null +++ b/1.0rc3/doxygen/globals.html @@ -0,0 +1,97 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to: + +

- _ -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_0x61.html b/1.0rc3/doxygen/globals_0x61.html new file mode 100644 index 000000000..1d8fdceb6 --- /dev/null +++ b/1.0rc3/doxygen/globals_0x61.html @@ -0,0 +1,95 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to: + +

- a -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_0x68.html b/1.0rc3/doxygen/globals_0x68.html new file mode 100644 index 000000000..1013ed9d6 --- /dev/null +++ b/1.0rc3/doxygen/globals_0x68.html @@ -0,0 +1,94 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to: + +

- h -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_0x6c.html b/1.0rc3/doxygen/globals_0x6c.html new file mode 100644 index 000000000..a7594cffc --- /dev/null +++ b/1.0rc3/doxygen/globals_0x6c.html @@ -0,0 +1,94 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to: + +

- l -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_0x71.html b/1.0rc3/doxygen/globals_0x71.html new file mode 100644 index 000000000..88ead9c36 --- /dev/null +++ b/1.0rc3/doxygen/globals_0x71.html @@ -0,0 +1,1147 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to: + +

- q -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_defs.html b/1.0rc3/doxygen/globals_defs.html new file mode 100644 index 000000000..10eefa384 --- /dev/null +++ b/1.0rc3/doxygen/globals_defs.html @@ -0,0 +1,322 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+  + +

- h -

+ + +

- l -

+ + +

- q -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_enum.html b/1.0rc3/doxygen/globals_enum.html new file mode 100644 index 000000000..1d351dd81 --- /dev/null +++ b/1.0rc3/doxygen/globals_enum.html @@ -0,0 +1,107 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_eval.html b/1.0rc3/doxygen/globals_eval.html new file mode 100644 index 000000000..f7ba0dbcd --- /dev/null +++ b/1.0rc3/doxygen/globals_eval.html @@ -0,0 +1,243 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+  + +

- q -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_func.html b/1.0rc3/doxygen/globals_func.html new file mode 100644 index 000000000..b538a6562 --- /dev/null +++ b/1.0rc3/doxygen/globals_func.html @@ -0,0 +1,639 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+  + +

- q -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_type.html b/1.0rc3/doxygen/globals_type.html new file mode 100644 index 000000000..b36b922c2 --- /dev/null +++ b/1.0rc3/doxygen/globals_type.html @@ -0,0 +1,201 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+  + +

- q -

+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/globals_vars.html b/1.0rc3/doxygen/globals_vars.html new file mode 100644 index 000000000..fa5790a97 --- /dev/null +++ b/1.0rc3/doxygen/globals_vars.html @@ -0,0 +1,90 @@ + + + + + +libqb: Data Fields + + + + + + + + + +
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/graph_legend.dot b/1.0rc3/doxygen/graph_legend.dot new file mode 100644 index 000000000..9a09018a4 --- /dev/null +++ b/1.0rc3/doxygen/graph_legend.dot @@ -0,0 +1,22 @@ +digraph G +{ + edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"]; + node [fontname="FreeSans",fontsize="10",shape=record]; + Node9 [shape="box",label="Inherited",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; + Node10 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node10 [shape="box",label="PublicBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; + Node11 -> Node10 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node11 [shape="box",label="Truncated",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; + Node13 -> Node9 [dir=back,color="darkgreen",fontsize="10",style="solid",fontname="FreeSans"]; + Node13 [shape="box",label="ProtectedBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; + Node14 -> Node9 [dir=back,color="firebrick4",fontsize="10",style="solid",fontname="FreeSans"]; + Node14 [shape="box",label="PrivateBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; + Node15 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node15 [shape="box",label="Undocumented",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; + Node16 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"]; + Node16 [shape="box",label="Templ< int >",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; + Node17 -> Node16 [dir=back,color="orange",fontsize="10",style="dashed",label="< int >",fontname="FreeSans"]; + Node17 [shape="box",label="Templ< T >",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; + Node18 -> Node9 [dir=back,color="darkorchid3",fontsize="10",style="dashed",label="m_usedClass",fontname="FreeSans"]; + Node18 [shape="box",label="Used",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; +} diff --git a/1.0rc3/doxygen/graph_legend.html b/1.0rc3/doxygen/graph_legend.html new file mode 100644 index 000000000..817aae83f --- /dev/null +++ b/1.0rc3/doxygen/graph_legend.html @@ -0,0 +1,125 @@ + + + + + +libqb: Graph Legend + + + + + + + + + +
+

Graph Legend

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

+
/*! Invisible class because of truncation */
+class Invisible { };
+
+/*! Truncated class, inheritance relation is hidden */
+class Truncated : public Invisible { };
+
+/* Class not documented with doxygen comments */
+class Undocumented { };
+
+/*! Class that is inherited using public inheritance */
+class PublicBase : public Truncated { };
+
+/*! A template class */
+template<class T> class Templ { };
+
+/*! Class that is inherited using protected inheritance */
+class ProtectedBase { };
+
+/*! Class that is inherited using private inheritance */
+class PrivateBase { };
+
+/*! Class that is used by the Inherited class */
+class Used { };
+
+/*! Super class that inherits a number of other classes */
+class Inherited : public PublicBase,
+                  protected ProtectedBase,
+                  private PrivateBase,
+                  public Undocumented,
+                  public Templ<int>
+{
+  private:
+    Used *m_usedClass;
+};
+

This will result in the following graph:

+
+graph_legend.png +
+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a grey border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
  • +
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/graph_legend.png b/1.0rc3/doxygen/graph_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a6f80b3c6b6a8183dd924e08291c73f8726e7a GIT binary patch literal 20601 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 NZSK3s6|SN5{{Vqz)$#xU literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/index.html b/1.0rc3/doxygen/index.html new file mode 100644 index 000000000..b532d57d8 --- /dev/null +++ b/1.0rc3/doxygen/index.html @@ -0,0 +1,78 @@ + + + + + +libqb: Main Page + + + + + + + + + +
+

libqb Documentation

1.0rc3

+Overview

+

libqb is a thread-safe library with the primary purpose of providing high-performance, reusable features for client-server architecture, such as logging, tracing, inter-process communication (IPC), and polling.

+

We don't intend this to be an all-encompassing library, but instead provide very specially focused APIs that are highly tuned for maximum performance for client/server applications.

+

See the following pages for more info:

+ +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/installdox b/1.0rc3/doxygen/installdox new file mode 100755 index 000000000..d3e628fd6 --- /dev/null +++ b/1.0rc3/doxygen/installdox @@ -0,0 +1,117 @@ +#! + +%subst = ( ); +$quiet = 0; + +if (open(F,"search.cfg")) +{ + $_= ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_; + $_= ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_; +} + +while ( @ARGV ) { + $_ = shift @ARGV; + if ( s/^-// ) { + if ( /^l(.*)/ ) { + $v = ($1 eq "") ? shift @ARGV : $1; + ($v =~ /\/$/) || ($v .= "/"); + $_ = $v; + if ( /(.+)\@(.+)/ ) { + if ( exists $subst{$1} ) { + $subst{$1} = $2; + } else { + print STDERR "Unknown tag file $1 given with option -l\n"; + &usage(); + } + } else { + print STDERR "Argument $_ is invalid for option -l\n"; + &usage(); + } + } + elsif ( /^q/ ) { + $quiet = 1; + } + elsif ( /^\?|^h/ ) { + &usage(); + } + else { + print STDERR "Illegal option -$_\n"; + &usage(); + } + } + else { + push (@files, $_ ); + } +} + +foreach $sub (keys %subst) +{ + if ( $subst{$sub} eq "" ) + { + print STDERR "No substitute given for tag file `$sub'\n"; + &usage(); + } + elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) + { + print "Substituting $subst{$sub} for each occurence of tag file $sub\n"; + } +} + +if ( ! @files ) { + if (opendir(D,".")) { + foreach $file ( readdir(D) ) { + $match = ".html"; + next if ( $file =~ /^\.\.?$/ ); + ($file =~ /$match/) && (push @files, $file); + ($file =~ "tree.js") && (push @files, $file); + } + closedir(D); + } +} + +if ( ! @files ) { + print STDERR "Warning: No input files given and none found!\n"; +} + +foreach $f (@files) +{ + if ( ! $quiet ) { + print "Editing: $f...\n"; + } + $oldf = $f; + $f .= ".bak"; + unless (rename $oldf,$f) { + print STDERR "Error: cannot rename file $oldf\n"; + exit 1; + } + if (open(F,"<$f")) { + unless (open(G,">$oldf")) { + print STDERR "Error: opening file $oldf for writing\n"; + exit 1; + } + if ($oldf ne "tree.js") { + while () { + s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; + print G "$_"; + } + } + else { + while () { + s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; + print G "$_"; + } + } + } + else { + print STDERR "Warning file $f does not exist\n"; + } + unlink $f; +} + +sub usage { + print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; + print STDERR "Options:\n"; + print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; + print STDERR " -q Quiet mode\n\n"; + exit 1; +} diff --git a/1.0rc3/doxygen/ipcclient_8c-example.html b/1.0rc3/doxygen/ipcclient_8c-example.html new file mode 100644 index 000000000..f9f826b90 --- /dev/null +++ b/1.0rc3/doxygen/ipcclient_8c-example.html @@ -0,0 +1,303 @@ + + + + + +libqb: ipcclient.c + + + + + + + + + +
+

ipcclient.c

This is an example of how to use the client.

+
/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Angus Salkeld <asalkeld@redhat.com>
+ *
+ * libqb is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * libqb is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libqb.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "os_base.h"
+#include <signal.h>
+
+#include <qb/qbdefs.h>
+#include <qb/qbutil.h>
+#include <qb/qbipcc.h>
+#include <qb/qblog.h>
+
+static int32_t do_benchmark = QB_FALSE;
+static int32_t use_events = QB_FALSE;
+static int alarm_notice;
+static qb_util_stopwatch_t *sw;
+#define ONE_MEG 1048576
+static char *data;
+
+struct my_req {
+        struct qb_ipc_request_header hdr;
+        char message[256];
+};
+
+struct my_res {
+        struct qb_ipc_response_header hdr;
+        char message[256];
+};
+
+static void sigalrm_handler (int num)
+{
+        alarm_notice = 1;
+}
+
+static void
+_benchmark(qb_ipcc_connection_t *conn, int write_size)
+{
+        struct iovec iov[2];
+        ssize_t res;
+        struct qb_ipc_request_header hdr;
+        int write_count = 0;
+        float secs;
+
+        alarm_notice = 0;
+        hdr.size = write_size;
+        hdr.id = QB_IPC_MSG_USER_START + 1;
+
+        iov[0].iov_base = &hdr;
+        iov[0].iov_len = sizeof(struct qb_ipc_request_header);
+
+        iov[1].iov_base = data;
+        iov[1].iov_len = write_size - sizeof(struct qb_ipc_request_header);
+
+        alarm (10);
+
+        qb_util_stopwatch_start(sw);
+        do {
+                res = qb_ipcc_sendv(conn, iov, 2);
+                if (res == write_size) {
+                        write_count++;
+                }
+        } while (alarm_notice == 0 && (res == write_size || res == -EAGAIN));
+        if (res < 0) {
+                perror("qb_ipcc_sendv");
+        }
+        qb_util_stopwatch_stop(sw);
+        secs = qb_util_stopwatch_sec_elapsed_get(sw);
+
+        printf ("%5d messages sent ", write_count);
+        printf ("%5d bytes per write ", write_size);
+        printf ("%7.3f Seconds runtime ", secs);
+        printf ("%9.3f TP/s ",
+                ((float)write_count) / secs);
+        printf ("%7.3f MB/s.\n",
+                ((float)write_count) * ((float)write_size) / secs);
+}
+
+
+static void
+do_throughput_benchmark(qb_ipcc_connection_t *conn)
+{
+        ssize_t size = 64;
+        int i;
+
+        signal (SIGALRM, sigalrm_handler);
+        sw =  qb_util_stopwatch_create();
+
+        for (i = 0; i < 10; i++) { /* number of repetitions - up to 50k */
+                _benchmark (conn, size);
+                signal (SIGALRM, sigalrm_handler);
+                size *= 5;
+                if (size >= (ONE_MEG - 100)) {
+                        break;
+                }
+        }
+}
+
+static void
+do_echo(qb_ipcc_connection_t *conn)
+{
+        struct my_req req;
+        struct my_res res;
+        char *newline;
+        int32_t rc;
+        int32_t send_ten_events;
+
+        while (1) {
+                printf("SEND (q or Q to quit) : ");
+                if (fgets(req.message, 256, stdin) == NULL) {
+                        continue;
+                }
+                newline = strrchr(req.message, '\n');
+                if (newline) {
+                        *newline = '\0';
+                }
+
+                if (strcasecmp(req.message, "q") == 0) {
+                        break;
+                } else {
+                        req.hdr.id = QB_IPC_MSG_USER_START + 3;
+                        req.hdr.size = sizeof(struct my_req);
+                        rc = qb_ipcc_send(conn, &req, req.hdr.size);
+                        if (rc < 0) {
+                                perror("qb_ipcc_send");
+                                exit(0);
+                        }
+                }
+
+                send_ten_events = (strcasecmp(req.message, "events") == 0);
+
+                if (rc > 0) {
+                        if (use_events && !send_ten_events) {
+                                printf("waiting for event recv\n");
+                                rc = qb_ipcc_event_recv(conn, &res, sizeof(res), -1);
+                        } else {
+                                printf("waiting for recv\n");
+                                rc = qb_ipcc_recv(conn, &res, sizeof(res), -1);
+                        }
+                        printf("recv %d\n", rc);
+                        if (rc < 0) {
+                                perror("qb_ipcc_recv");
+                                exit(0);
+                        }
+                        if (send_ten_events) {
+                                int32_t i;
+                                printf("waiting for 10 events\n");
+                                for (i = 0; i < 10; i++) {
+                                        rc = qb_ipcc_event_recv(conn, &res, sizeof(res), -1);
+                                        if (rc < 0) {
+                                                perror("qb_ipcc_event_recv");
+                                        } else {
+                                                printf("got event %d rc:%d\n", i, rc);
+                                        }
+                                }
+                        }
+                        printf("Response[%d]: %s \n", res.hdr.id, res.message);
+                }
+        }
+}
+
+static void
+show_usage(const char *name)
+{
+        printf("usage: \n");
+        printf("%s <options>\n", name);
+        printf("\n");
+        printf("  options:\n");
+        printf("\n");
+        printf("  -h             show this help text\n");
+        printf("  -b             benchmark\n");
+        printf("  -e             use events instead of responses\n");
+        printf("\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+        qb_ipcc_connection_t *conn;
+        const char *options = "ebh";
+        int32_t opt;
+
+        while ((opt = getopt(argc, argv, options)) != -1) {
+                switch (opt) {
+                case 'b':
+                        do_benchmark = QB_TRUE;
+                        break;
+                case 'e':
+                        use_events = QB_TRUE;
+                        break;
+                case 'h':
+                default:
+                        show_usage(argv[0]);
+                        exit(0);
+                        break;
+                }
+        }
+
+
+        qb_log_init("ipcclient", LOG_USER, LOG_TRACE);
+        qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
+        qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD,
+                          QB_LOG_FILTER_FILE, "*", LOG_TRACE);
+        qb_log_format_set(QB_LOG_STDERR, "%f:%l [%p] %b");
+        qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE);
+
+        /* Our example server is enforcing a buffer size minimum,
+         * so the client does not need to be concerned with setting
+         * the buffer size */
+        conn = qb_ipcc_connect("ipcserver", 0);
+        if (conn == NULL) {
+                perror("qb_ipcc_connect");
+                exit(1);
+        }
+        data = calloc(1, qb_ipcc_get_buffer_size(conn));
+
+        if (do_benchmark) {
+                do_throughput_benchmark(conn);
+        } else {
+                do_echo(conn);
+        }
+
+        qb_ipcc_disconnect(conn);
+        free(data);
+        return EXIT_SUCCESS;
+}
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/ipcserver_8c-example.html b/1.0rc3/doxygen/ipcserver_8c-example.html new file mode 100644 index 000000000..6d9bb50b8 --- /dev/null +++ b/1.0rc3/doxygen/ipcserver_8c-example.html @@ -0,0 +1,464 @@ + + + + + +libqb: ipcserver.c + + + + + + + + + +
+

ipcserver.c

/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Angus Salkeld <asalkeld@redhat.com>
+ *
+ * libqb is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * libqb is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libqb.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "os_base.h"
+#include <signal.h>
+
+#include <qb/qbdefs.h>
+#include <qb/qbutil.h>
+#include <qb/qblog.h>
+#include <qb/qbloop.h>
+#include <qb/qbipcs.h>
+
+#ifdef HAVE_GLIB
+#include <glib.h>
+static GMainLoop *glib_loop;
+static qb_array_t *gio_map;
+#endif /* HAVE_GLIB */
+
+#define ONE_MEG 1048576
+
+static int32_t use_glib = QB_FALSE;
+static int32_t use_events = QB_FALSE;
+static qb_loop_t *bms_loop;
+static qb_ipcs_service_t *s1;
+
+static int32_t
+s1_connection_accept_fn(qb_ipcs_connection_t * c, uid_t uid, gid_t gid)
+{
+#if 0
+        if (uid == 0 && gid == 0) {
+                qb_log(LOG_INFO, "Authenticated connection");
+                return 1;
+        }
+        qb_log(LOG_NOTICE, "BAD user!");
+        return 0;
+#else
+        return 0;
+#endif
+}
+
+static void
+s1_connection_created_fn(qb_ipcs_connection_t * c)
+{
+        struct qb_ipcs_stats srv_stats;
+
+        qb_ipcs_stats_get(s1, &srv_stats, QB_FALSE);
+        qb_log(LOG_INFO, "Connection created (active:%d, closed:%d)",
+               srv_stats.active_connections, srv_stats.closed_connections);
+}
+
+static void
+s1_connection_destroyed_fn(qb_ipcs_connection_t * c)
+{
+        qb_log(LOG_INFO, "Connection about to be freed");
+}
+
+static int32_t
+s1_connection_closed_fn(qb_ipcs_connection_t * c)
+{
+        struct qb_ipcs_connection_stats stats;
+        struct qb_ipcs_stats srv_stats;
+
+        qb_ipcs_stats_get(s1, &srv_stats, QB_FALSE);
+        qb_ipcs_connection_stats_get(c, &stats, QB_FALSE);
+        qb_log(LOG_INFO,
+               "Connection to pid:%d destroyed (active:%d, closed:%d)",
+               stats.client_pid, srv_stats.active_connections,
+               srv_stats.closed_connections);
+
+        qb_log(LOG_DEBUG, " Requests     %"PRIu64"", stats.requests);
+        qb_log(LOG_DEBUG, " Responses    %"PRIu64"", stats.responses);
+        qb_log(LOG_DEBUG, " Events       %"PRIu64"", stats.events);
+        qb_log(LOG_DEBUG, " Send retries %"PRIu64"", stats.send_retries);
+        qb_log(LOG_DEBUG, " Recv retries %"PRIu64"", stats.recv_retries);
+        qb_log(LOG_DEBUG, " FC state     %d", stats.flow_control_state);
+        qb_log(LOG_DEBUG, " FC count     %"PRIu64"", stats.flow_control_count);
+        return 0;
+}
+
+struct my_req {
+        struct qb_ipc_request_header hdr;
+        char message[256];
+};
+
+static int32_t
+s1_msg_process_fn(qb_ipcs_connection_t * c, void *data, size_t size)
+{
+        struct qb_ipc_request_header *hdr;
+        struct my_req *req_pt;
+        struct qb_ipc_response_header response;
+        ssize_t res;
+        struct iovec iov[2];
+        char resp[100];
+        int32_t sl;
+        int32_t send_ten_events = QB_FALSE;
+
+        hdr = (struct qb_ipc_request_header *)data;
+        if (hdr->id == (QB_IPC_MSG_USER_START + 1)) {
+                return 0;
+        }
+
+        req_pt = (struct my_req *)data;
+        qb_log(LOG_DEBUG, "msg received (id:%d, size:%d, data:%s)",
+               req_pt->hdr.id, req_pt->hdr.size, req_pt->message);
+
+        if (strcmp(req_pt->message, "kill") == 0) {
+                exit(0);
+        }
+        response.size = sizeof(struct qb_ipc_response_header);
+        response.id = 13;
+        response.error = 0;
+
+        sl = snprintf(resp, 100, "ACK %zd bytes", size) + 1;
+        iov[0].iov_len = sizeof(response);
+        iov[0].iov_base = &response;
+        iov[1].iov_len = sl;
+        iov[1].iov_base = resp;
+        response.size += sl;
+
+        send_ten_events = (strcmp(req_pt->message, "events") == 0);
+
+        if (use_events && !send_ten_events) {
+                res = qb_ipcs_event_sendv(c, iov, 2);
+        } else {
+                res = qb_ipcs_response_sendv(c, iov, 2);
+        }
+        if (res < 0) {
+                errno = - res;
+                qb_perror(LOG_ERR, "qb_ipcs_response_send");
+        }
+        if (send_ten_events) {
+                int32_t i;
+                qb_log(LOG_INFO, "request to send 10 events");
+                for (i = 0; i < 10; i++) {
+                        res = qb_ipcs_event_sendv(c, iov, 2);
+                        qb_log(LOG_INFO, "sent event %d res:%d", i, res);
+                }
+        }
+        return 0;
+}
+
+static void
+sigusr1_handler(int32_t num)
+{
+        qb_log(LOG_DEBUG, "(%d)", num);
+        qb_ipcs_destroy(s1);
+        exit(0);
+}
+
+static void
+show_usage(const char *name)
+{
+        printf("usage: \n");
+        printf("%s <options>\n", name);
+        printf("\n");
+        printf("  options:\n");
+        printf("\n");
+        printf("  -h             show this help text\n");
+        printf("  -m             use shared memory\n");
+        printf("  -u             use unix sockets\n");
+        printf("  -g             use glib mainloop\n");
+        printf("  -e             use events\n");
+        printf("\n");
+}
+
+#ifdef HAVE_GLIB
+struct gio_to_qb_poll {
+        int32_t is_used;
+        int32_t events;
+        int32_t source;
+        int32_t fd;
+        void *data;
+        qb_ipcs_dispatch_fn_t fn;
+        enum qb_loop_priority p;
+};
+
+static gboolean
+gio_read_socket(GIOChannel * gio, GIOCondition condition, gpointer data)
+{
+        struct gio_to_qb_poll *adaptor = (struct gio_to_qb_poll *)data;
+        gint fd = g_io_channel_unix_get_fd(gio);
+
+        return (adaptor->fn(fd, condition, adaptor->data) == 0);
+}
+
+static void
+gio_poll_destroy(gpointer data)
+{
+        struct gio_to_qb_poll *adaptor = (struct gio_to_qb_poll *)data;
+
+        adaptor->is_used--;
+        if (adaptor->is_used == 0) {
+                qb_log(LOG_DEBUG, "fd %d adaptor destroyed\n", adaptor->fd);
+                adaptor->fd = 0;
+                adaptor->source = 0;
+        }
+}
+
+static int32_t
+my_g_dispatch_update(enum qb_loop_priority p, int32_t fd, int32_t evts,
+                  void *data, qb_ipcs_dispatch_fn_t fn, gboolean is_new)
+{
+        struct gio_to_qb_poll *adaptor;
+        GIOChannel *channel;
+        int32_t res = 0;
+
+        res = qb_array_index(gio_map, fd, (void **)&adaptor);
+        if (res < 0) {
+                return res;
+        }
+        if (adaptor->is_used && adaptor->source) {
+                if (is_new) {
+                        return -EEXIST;
+                }
+                g_source_remove(adaptor->source);
+                adaptor->source = 0;
+        }
+
+        channel = g_io_channel_unix_new(fd);
+        if (!channel) {
+                return -ENOMEM;
+        }
+
+        adaptor->fn = fn;
+        adaptor->events = evts;
+        adaptor->data = data;
+        adaptor->p = p;
+        adaptor->is_used++;
+        adaptor->fd = fd;
+
+        adaptor->source = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, evts, gio_read_socket, adaptor, gio_poll_destroy);
+
+        /* we are handing the channel off to be managed by mainloop now.
+         * remove our reference. */
+        g_io_channel_unref(channel);
+
+        return 0;
+}
+
+static int32_t
+my_g_dispatch_add(enum qb_loop_priority p, int32_t fd, int32_t evts,
+                  void *data, qb_ipcs_dispatch_fn_t fn)
+{
+        return my_g_dispatch_update(p, fd, evts, data, fn, TRUE);
+}
+
+static int32_t
+my_g_dispatch_mod(enum qb_loop_priority p, int32_t fd, int32_t evts,
+                  void *data, qb_ipcs_dispatch_fn_t fn)
+{
+        return my_g_dispatch_update(p, fd, evts, data, fn, FALSE);
+}
+
+static int32_t
+my_g_dispatch_del(int32_t fd)
+{
+        struct gio_to_qb_poll *adaptor;
+        if (qb_array_index(gio_map, fd, (void **)&adaptor) == 0) {
+                g_source_remove(adaptor->source);
+                adaptor->source = 0;
+        }
+        return 0;
+}
+#endif /* HAVE_GLIB */
+
+static int32_t
+my_job_add(enum qb_loop_priority p, void *data, qb_loop_job_dispatch_fn fn)
+{
+        return qb_loop_job_add(bms_loop, p, data, fn);
+}
+
+static int32_t
+my_dispatch_add(enum qb_loop_priority p, int32_t fd, int32_t evts,
+                void *data, qb_ipcs_dispatch_fn_t fn)
+{
+        return qb_loop_poll_add(bms_loop, p, fd, evts, data, fn);
+}
+
+static int32_t
+my_dispatch_mod(enum qb_loop_priority p, int32_t fd, int32_t evts,
+                void *data, qb_ipcs_dispatch_fn_t fn)
+{
+        return qb_loop_poll_mod(bms_loop, p, fd, evts, data, fn);
+}
+
+static int32_t
+my_dispatch_del(int32_t fd)
+{
+        return qb_loop_poll_del(bms_loop, fd);
+}
+
+int32_t
+main(int32_t argc, char *argv[])
+{
+        const char *options = "mpseugh";
+        int32_t opt;
+        int32_t rc;
+        enum qb_ipc_type ipc_type = QB_IPC_NATIVE;
+        struct qb_ipcs_service_handlers sh = {
+                .connection_accept = s1_connection_accept_fn,
+                .connection_created = s1_connection_created_fn,
+                .msg_process = s1_msg_process_fn,
+                .connection_destroyed = s1_connection_destroyed_fn,
+                .connection_closed = s1_connection_closed_fn,
+        };
+        struct qb_ipcs_poll_handlers ph = {
+                .job_add = my_job_add,
+                .dispatch_add = my_dispatch_add,
+                .dispatch_mod = my_dispatch_mod,
+                .dispatch_del = my_dispatch_del,
+        };
+#ifdef HAVE_GLIB
+        struct qb_ipcs_poll_handlers glib_ph = {
+                .job_add = NULL, /* FIXME */
+                .dispatch_add = my_g_dispatch_add,
+                .dispatch_mod = my_g_dispatch_mod,
+                .dispatch_del = my_g_dispatch_del,
+        };
+#endif /* HAVE_GLIB */
+
+        while ((opt = getopt(argc, argv, options)) != -1) {
+                switch (opt) {
+                case 'm':
+                        ipc_type = QB_IPC_SHM;
+                        break;
+                case 'u':
+                        ipc_type = QB_IPC_SOCKET;
+                        break;
+                case 'g':
+                        use_glib = QB_TRUE;
+                        break;
+                case 'e':
+                        use_events = QB_TRUE;
+                        break;
+                case 'h':
+                default:
+                        show_usage(argv[0]);
+                        exit(0);
+                        break;
+                }
+        }
+        signal(SIGINT, sigusr1_handler);
+
+        qb_log_init("ipcserver", LOG_USER, LOG_TRACE);
+        qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD,
+                          QB_LOG_FILTER_FILE, "*", LOG_TRACE);
+        qb_log_format_set(QB_LOG_STDERR, "%f:%l [%p] %b");
+        qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE);
+
+        s1 = qb_ipcs_create("ipcserver", 0, ipc_type, &sh);
+        if (s1 == 0) {
+                qb_perror(LOG_ERR, "qb_ipcs_create");
+                exit(1);
+        }
+        /* This forces the clients to use a minimum buffer size */
+        qb_ipcs_enforce_buffer_size(s1, ONE_MEG);
+
+        if (!use_glib) {
+                bms_loop = qb_loop_create();
+                qb_ipcs_poll_handlers_set(s1, &ph);
+                rc = qb_ipcs_run(s1);
+                if (rc != 0) {
+                        errno = -rc;
+                        qb_perror(LOG_ERR, "qb_ipcs_run");
+                        exit(1);
+                }
+                qb_loop_run(bms_loop);
+        } else {
+#ifdef HAVE_GLIB
+                glib_loop = g_main_loop_new(NULL, FALSE);
+                gio_map = qb_array_create_2(16, sizeof(struct gio_to_qb_poll), 1);
+                qb_ipcs_poll_handlers_set(s1, &glib_ph);
+                rc = qb_ipcs_run(s1);
+                if (rc != 0) {
+                        errno = -rc;
+                        qb_perror(LOG_ERR, "qb_ipcs_run");
+                        exit(1);
+                }
+                g_main_loop_run(glib_loop);
+#else
+                qb_log(LOG_ERR,
+                       "You don't seem to have glib-devel installed.\n");
+#endif
+        }
+        return EXIT_SUCCESS;
+}
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/mainpage_8h.html b/1.0rc3/doxygen/mainpage_8h.html new file mode 100644 index 000000000..73105d7f4 --- /dev/null +++ b/1.0rc3/doxygen/mainpage_8h.html @@ -0,0 +1,69 @@ + + + + + +libqb: mainpage.h File Reference + + + + + + + + + +
+

mainpage.h File Reference

+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/pages.html b/1.0rc3/doxygen/pages.html new file mode 100644 index 000000000..1db523d20 --- /dev/null +++ b/1.0rc3/doxygen/pages.html @@ -0,0 +1,65 @@ + + + + + +libqb: Page Index + + + + + + + + + +
+

Related Pages

Here is a list of all related documentation pages: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_array_overview.html b/1.0rc3/doxygen/qb_array_overview.html new file mode 100644 index 000000000..3a362f911 --- /dev/null +++ b/1.0rc3/doxygen/qb_array_overview.html @@ -0,0 +1,74 @@ + + + + + +libqb: Array + + + + + + + + + +
+ + +

Array

This is a dynamic array (it can grow, but without moving memory).

 arr = qb_array_create_2(64, sizeof(struct my_struct), 256);
+ ...
+ res = qb_array_index(arr, idx, (void**)&my_ptr);
+ if (res < 0) {
+        return res;
+ }
+ // use my_ptr, now even if there is a grow, this pointer will be valid.
+

+
See also:
qbarray.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_atomic_overview.html b/1.0rc3/doxygen/qb_atomic_overview.html new file mode 100644 index 000000000..4c5d7e94a --- /dev/null +++ b/1.0rc3/doxygen/qb_atomic_overview.html @@ -0,0 +1,67 @@ + + + + + +libqb: Atomic operations + + + + + + + + + +
+ + +

Atomic operations

Basic atomic integer and pointer operations. The following functions can be used to atomically access integers and pointers. They are implemented as inline assembler function on most platforms and use slower fall-backs otherwise. Using them can sometimes save you from using a performance-expensive pthread_mutex to protect the integer or pointer.The most important usage is reference counting. Using qb_atomic_int_inc() and qb_atomic_int_dec_and_test() makes reference counting a very fast operation.You must not directly read integers or pointers concurrently accessed by multiple threads, but use the atomic accessor functions instead. That is, always use qb_atomic_int_get() and qb_atomic_pointer_get() for read outs. They provide the necessary synchonization mechanisms like memory barriers to access memory locations concurrently.If you are using those functions for anything apart from simple reference counting, you should really be aware of the implications of doing that. There are literally thousands of ways to shoot yourself in the foot. So if in doubt, use a pthread_mutex. If you don't know, what memory barriers are, do not use anything but qb_atomic_int_inc() and qb_atomic_int_dec_and_test().It is not safe to set an integer or pointer just by assigning to it, when it is concurrently accessed by other threads with the following functions. Use qb_atomic_int_compare_and_exchange() or qb_atomic_pointer_compare_and_exchange() respectively.

+
See also:
qbatomic.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_hdb_overview.html b/1.0rc3/doxygen/qb_hdb_overview.html new file mode 100644 index 000000000..54f6d0d6b --- /dev/null +++ b/1.0rc3/doxygen/qb_hdb_overview.html @@ -0,0 +1,67 @@ + + + + + +libqb: Handle Database + + + + + + + + + +
+ + +

Handle Database

The handle database is for reference counting objects.

+
See also:
qbhdb.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_ipc_overview.html b/1.0rc3/doxygen/qb_ipc_overview.html new file mode 100644 index 000000000..b461462f1 --- /dev/null +++ b/1.0rc3/doxygen/qb_ipc_overview.html @@ -0,0 +1,85 @@ + + + + + +libqb: IPC Overview + + + + + + + + + +
+ + +

IPC Overview

Overview
libqb provides a generically reusable very high performance shared memory IPC system for client and service applications. It supports many features including:
    +
  • Multiple transport implementations
      +
    1. Shared memory implementation for very high performance.
    2. +
    3. Unix sockets
    4. +
    +
  • +
  • A synchronous request/response channel and asynchronous response channel per ipc connection.
  • +
  • User defined private data per IPC connection.
  • +
  • Ability to call a function per service on ipc connection and disconnection.
  • +
  • Authenticated IPC connection with ability for developer to define which UIDs and GIDs are valid at connection time.
  • +
  • Fully abstracted poll system so that any poll library may be used.
  • +
  • User defined selector for determining the proper function to call per service and id.
  • +
+
+
Security
The ipc system uses default operating system security mechanics to ensure ipc connections are validated. A callback used with qb_ipcs_create() is called for every new ipc connection with the parameters of UID and GID. The callback then determines if the UID and GID are authenticated for communication.
+
Performance
For performance, QB_IPC_SHM (shared memory) is recommended. It is tuned for very high performance.
+
Client API
Client IPC API.
+
See also:
qbipcc.h
+
Server API
Server IPC API.
+
See also:
qbipcs.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_list_overview.html b/1.0rc3/doxygen/qb_list_overview.html new file mode 100644 index 000000000..9efc2d15c --- /dev/null +++ b/1.0rc3/doxygen/qb_list_overview.html @@ -0,0 +1,68 @@ + + + + + +libqb: List + + + + + + + + + +
+ + +

List

This is a kernel style list implementation.

Author:
Steven Dake <sdake@redhat.com>
+

+
See also:
qblist.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_log_overview.html b/1.0rc3/doxygen/qb_log_overview.html new file mode 100644 index 000000000..a1ff4c7dc --- /dev/null +++ b/1.0rc3/doxygen/qb_log_overview.html @@ -0,0 +1,167 @@ + + + + + +libqb: Logging + + + + + + + + + +
+ + +

Logging

The logging API provides four main parts (basics, filtering, threading & blackbox). The idea behind this logging system is not to be prescriptive but to provide a set of tools to help the developer achieve what they want quickly and easily.

Basic logging API.
Call qb_log() to generate a log message. Then to write the message somewhere meaningful call qb_log_ctl() to configure the targets.
+

Simplest possible use:

+
 main() {
+        qb_log_init("simple-log", LOG_DAEMON, LOG_INFO);
+        // ...
+        qb_log(LOG_WARNING, "watch out");
+        // ...
+        qb_log_fini();
+ }
+
Configuring log targets.
A log target can be syslog, stderr, the blackbox, stdout, or a text file. By default only syslog is enabled.
+

To enable a target do the following:

+syslog, stderr, the blackbox, and stdout are static (they don't need to be created, just enabled or disabled). However you can open multiple logfiles (QB_LOG_TARGET_MAX - QB_LOG_TARGET_STATIC_MAX). To do this, use the following code:

+
        mytarget = qb_log_file_open("/var/log/mylogfile");
+        qb_log_ctl(mytarget, QB_LOG_CONF_ENABLED, QB_TRUE);
+
Once your targets are enabled/opened you can configure them as follows: Configure the size of blackbox

+Make logging to file threaded:

+To workaround your syslog daemon filtering all messages > LOG_INFO

+
        qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_PRIORITY_BUMP,
+                   LOG_INFO - LOG_DEBUG);
+
To ensure all logs to file targets are fsync'ed (default QB_FALSE)

+
Filtering messages.
To have more power over what log messages go to which target you can apply filters to the targets. What happens is the desired callsites have the correct bit set. Then when the log message is generated it gets sent to the targets based on which bit is set in the callsite's "target" bitmap. Messages can be filtered based on the:
    +
  1. filename + priority
  2. +
  3. function name + priority
  4. +
  5. format string + priority
  6. +
+
+

So to make all logs from evil_function() go to stderr, do the following:

+So to make all logs from totem* (with a priority <= LOG_INFO) go to stderr, do the following:

+So to make all logs with the substring "ringbuffer" go to stderr, do the following:

+
Thread safe non-blocking logging.
Logging is only thread safe when threaded logging is in use. If you plan on logging from multiple threads, you must initialize libqb's logger thread and use qg_log_filter_ctl to set the QB_LOG_CONF_THREADED flag on all the logging targets in use.
+

To achieve non-blocking logging, so that any calls to write() or syslog() will not hold up your program, you can use threaded logging as well.Threaded logging use:

+
 main() {
+        qb_log_init("simple-log", LOG_DAEMON, LOG_INFO);
+        qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_THREADED, QB_TRUE);
+        // ...
+        daemonize();
+        // call this after you fork()
+        qb_log_thread_start();
+        // ...
+        qb_log(LOG_WARNING, "watch out");
+        // ...
+        qb_log_fini();
+ }
+
A blackbox for in-field diagnosis.
This stores log messages in a ringbuffer so they can be written to file if the program crashes (you will need to catch SIGSEGV). These can then be easily printed out later.
+
Note:
the blackbox is not enabled by default.
+

Blackbox usage:

+
 static void sigsegv_handler(int sig)
+ {
+        (void)signal (SIGSEGV, SIG_DFL);
+        qb_log_blackbox_write_to_file("simple-log.fdata");
+        qb_log_fini();
+        raise(SIGSEGV);
+ }
+
+ main() {
+
+        signal(SIGSEGV, sigsegv_handler);
+
+        qb_log_init("simple-log", LOG_DAEMON, LOG_INFO);
+        qb_log_filter_ctl(QB_LOG_BLACKBOX, QB_LOG_FILTER_ADD,
+                          QB_LOG_FILTER_FILE, "*", LOG_DEBUG);
+        qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_SIZE, 1024*10);
+        qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_TRUE);
+        // ...
+        qb_log(LOG_WARNING, "watch out");
+        // ...
+        qb_log_fini();
+ }
+
Tagging messages.
You can tag messages using the second argument to qb_logt() or by using qb_log_filter_ctl(). This can be used to add feature or sub-system information to the logs.
+
 const char* my_tags_stringify(uint32_t tags) {
+        if (qb_bit_is_set(tags, QB_LOG_TAG_LIBQB_MSG_BIT) {
+                return "libqb";
+        } else if (tags == 3) {
+                return "three";
+        } else {
+                return "MAIN";
+        }
+ }
+ main() {
+        // ...
+        qb_log_tags_stringify_fn_set(my_tags_stringify);
+        qb_log_format_set(QB_LOG_STDERR, "[%5g] %p %b");
+        // ...
+        qb_logt(LOG_INFO, 3, "hello");
+        qb_logt(LOG_INFO, 0, "hello");
+ }
+

The code above will produce:

+
 [libqb] some message
+ [three] info hello
+ [MAIN ] info hello
+

+
See also:
qblog.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_loop_overview.html b/1.0rc3/doxygen/qb_loop_overview.html new file mode 100644 index 000000000..ad5b888d5 --- /dev/null +++ b/1.0rc3/doxygen/qb_loop_overview.html @@ -0,0 +1,67 @@ + + + + + +libqb: Main Loop + + + + + + + + + +
+ + +

Main Loop

Main loop manages timers, jobs and polling sockets.

+
See also:
qbloop.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_map_overview.html b/1.0rc3/doxygen/qb_map_overview.html new file mode 100644 index 000000000..ff87bacac --- /dev/null +++ b/1.0rc3/doxygen/qb_map_overview.html @@ -0,0 +1,95 @@ + + + + + +libqb: Map + + + + + + + + + +
+ + +

Map

This provides a map interface to a Patricia trie, hashtable or skiplist.

Ordering
The hashtable is NOT ordered, but ptrie and skiplist are.
+
Iterating
Below is a simple example of how to iterate over a map.
 const char *p;
+ void *data;
+ qb_map_iter_t *it = qb_map_iter_create(m);
+ for (p = qb_map_iter_next(it, &data); p; p = qb_map_iter_next(it, &data)) {
+     printf("%s > %s\n", p, (char*) data);
+ }
+ qb_map_iter_free(it);
+
+

Deletion of items within the iterator is supported. But note do not free the item memory in the iterator. If you need to free the data items then register for a notifier and free the memory there. This is required as the items are reference counted.

+
 qb_map_notify_add(m, NULL, my_map_free_handler,
+                     QB_MAP_NOTIFY_FREE, NULL);
+
Notifications
These allow you to get callbacks when values are inserted/removed or replaced.
+
Note:
hashtable only supports deletion and replacement notificatins. There is also a special global callback for freeing deleted and replaced values (QB_MAP_NOTIFY_FREE).
+
See also:
qb_map_notify_add() qb_map_notify_del_2()
+
Prefix matching
The ptrie supports prefixes in the iterator:
+
 it = qb_map_pref_iter_create(m, "aa");
+ while ((p = qb_map_iter_next(it, &data)) != NULL) {
+     printf("%s > %s\n", p, (char*)data);
+ }
+ qb_map_iter_free(it);
+
The ptrie also supports prefixes in notifications: (remember to pass QB_MAP_NOTIFY_RECURSIVE into the notify_add.

+

+
See also:
qbmap.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_rb_overview.html b/1.0rc3/doxygen/qb_rb_overview.html new file mode 100644 index 000000000..9565e50f0 --- /dev/null +++ b/1.0rc3/doxygen/qb_rb_overview.html @@ -0,0 +1,90 @@ + + + + + +libqb: Ringbuffer + + + + + + + + + +
+ + +

Ringbuffer

This implements a ring buffer that works in "chunks" not bytes. So you write/read a complete chunk or not at all. There are two types of ring buffer normal and overwrite. Overwrite will reclaim the oldest chunks inorder to make way for new ones, the normal version will refuse to write a new chunk if the ring buffer is full.This implementation is capable of working across processes, but one process must only write and the other prrocess read.The read process will do the following:

+
        rb = qb_rb_open("test2", 2000, QB_RB_FLAG_SHARED_PROCESS|QB_RB_FLAG_CREATE);
+        for (i = 0; i < 200; i++) {
+        try_read_again:
+                l = qb_rb_chunk_read(rb, (void *)out, 32, 1000);
+                if (l < 0) {
+                        goto try_read_again;
+                }
+        }
+        ...
+        qb_rb_close(rb);
+
The write process will do the following:

+
        rb = qb_rb_open("test2", 2000, QB_RB_FLAG_SHARED_PROCESS);
+        for (i = 0; i < 200; i++) {
+ try_write_again:
+                l = qb_rb_chunk_write(rb, &v, sizeof(v));
+                if (l < sizeof(v)) {
+                        goto try_write_again;
+                }
+        }
+        ...
+        qb_rb_close(rb);
+
Author:
Angus Salkeld <asalkeld@redhat.com>
+

+
See also:
qbrb.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qb_util_overview.html b/1.0rc3/doxygen/qb_util_overview.html new file mode 100644 index 000000000..1be390990 --- /dev/null +++ b/1.0rc3/doxygen/qb_util_overview.html @@ -0,0 +1,127 @@ + + + + + +libqb: Common Utilities + + + + + + + + + +
+ + +

Common Utilities

These are some convience functions used throughout libqb.

Author:
Angus Salkeld <asalkeld@redhat.com>
+
Locking
+
+
Time functions
+
+
Basic Stopwatch
 uint64_t elapsed1;
+ uint64_t elapsed2;
+ qb_util_stopwatch_t *sw = qb_util_stopwatch_create();
+
+ qb_util_stopwatch_start(sw);
+
+ usleep(sometime);
+ qb_util_stopwatch_stop(sw);
+ elapsed1 = qb_util_stopwatch_us_elapsed_get(sw);
+
+ usleep(somemoretime);
+ qb_util_stopwatch_stop(sw);
+ elapsed2 = qb_util_stopwatch_us_elapsed_get(sw);
+
+ qb_util_stopwatch_free(sw);
+
+
Stopwatch with splits
Setup a stopwatch with space for 3 splits.
+
 uint64_t split;
+ qb_util_stopwatch_t *sw = qb_util_stopwatch_create();
+
+ qb_util_stopwatch_split_ctl(sw, 3, 0);
+ qb_util_stopwatch_start(sw);
+
+ usleep(sometime);
+ qb_util_stopwatch_split(sw);
+
+ usleep(somemoretime);
+ qb_util_stopwatch_split(sw);
+
+ usleep(somemoretime);
+ qb_util_stopwatch_split(sw);
+
+ idx = qb_util_stopwatch_split_last(sw);
+ do {
+      split = qb_util_stopwatch_time_split_get(sw, idx, idx);
+      qb_log(LOG_INFO, "split %d is %"PRIu64"", last, split);
+      idx--;
+ } while (split > 0);
+
+ split = qb_util_stopwatch_time_split_get(sw, 2, 1);
+ qb_log(LOG_INFO, "time between second and third split is %"PRIu64"", split);
+
+ qb_util_stopwatch_free(sw);
+

+
See also:
qbutil.h
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbarray_8h.html b/1.0rc3/doxygen/qbarray_8h.html new file mode 100644 index 000000000..b314efc00 --- /dev/null +++ b/1.0rc3/doxygen/qbarray_8h.html @@ -0,0 +1,409 @@ + + + + + +libqb: qbarray.h File Reference + + + + + + + + + +
+

qbarray.h File Reference

+

This is a dynamic array (it can grow, but without moving memory). +More...

+#include <stdint.h>
+#include <unistd.h>
+#include <qb/qbdefs.h>
+
+Include dependency graph for qbarray.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +

Typedefs

typedef struct qb_array qb_array_t
 This is an opaque data type representing an instance of an array.
typedef void(* qb_array_new_bin_cb_fn )(qb_array_t *a, uint32_t bin)

Functions

qb_array_tqb_array_create (size_t max_elements, size_t element_size)
 Create an array with fixed sized elements.
qb_array_tqb_array_create_2 (size_t max_elements, size_t element_size, size_t autogrow_elements)
 Create an array with fixed sized elements.
int32_t qb_array_index (qb_array_t *a, int32_t idx, void **element_out)
 Get an element at a particular index.
int32_t qb_array_grow (qb_array_t *a, size_t max_elements)
 Grow the array.
size_t qb_array_num_bins_get (qb_array_t *a)
 Get the number of bins used or the array.
size_t qb_array_elems_per_bin_get (qb_array_t *a)
 Get the number of elements per bin.
int32_t qb_array_new_bin_cb_set (qb_array_t *a, qb_array_new_bin_cb_fn fn)
 Get a callback when a new bin is allocated.
void qb_array_free (qb_array_t *a)
 Free all the memory used by the array.
+

Detailed Description

+

This is a dynamic array (it can grow, but without moving memory).

+
 arr = qb_array_create_2(64, sizeof(struct my_struct), 256);
+ ...
+ res = qb_array_index(arr, idx, (void**)&my_ptr);
+ if (res < 0) {
+        return res;
+ }
+ // use my_ptr, now even if there is a grow, this pointer will be valid.
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* qb_array_new_bin_cb_fn)(qb_array_t *a, uint32_t bin)
+
+
+ +
+
+ +
+
+ + + + +
typedef struct qb_array qb_array_t
+
+
+ +

This is an opaque data type representing an instance of an array.

+
Examples:
ipcserver.c.
+
+
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
qb_array_t* qb_array_create (size_t  max_elements,
size_t  element_size 
)
+
+
+ +

Create an array with fixed sized elements.

+
Parameters:
+ + + +
max_elements initial max elements.
element_size size of each element.
+
+
+
Returns:
array instance.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
qb_array_t* qb_array_create_2 (size_t  max_elements,
size_t  element_size,
size_t  autogrow_elements 
)
+
+
+ +

Create an array with fixed sized elements.

+
Parameters:
+ + + + +
max_elements initial max elements.
element_size size of each element.
autogrow_elements the number of elements to grow automatically by.
+
+
+
Returns:
array instance.
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
size_t qb_array_elems_per_bin_get (qb_array_t a ) 
+
+
+ +

Get the number of elements per bin.

+ +
+
+ +
+
+ + + + + + + + + +
void qb_array_free (qb_array_t a ) 
+
+
+ +

Free all the memory used by the array.

+
Parameters:
+ + +
a array instance.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_array_grow (qb_array_t a,
size_t  max_elements 
)
+
+
+ +

Grow the array.

+
Parameters:
+ + + +
a array instance.
max_elements the new maximum size of the array.
+
+
+
Returns:
(0 == success, else -errno)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_array_index (qb_array_t a,
int32_t  idx,
void **  element_out 
)
+
+
+ +

Get an element at a particular index.

+
Parameters:
+ + + + +
a array instance.
idx the index
element_out the pointer to the element data.
+
+
+
Returns:
(0 == success, else -errno)
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_array_new_bin_cb_set (qb_array_t a,
qb_array_new_bin_cb_fn  fn 
)
+
+
+ +

Get a callback when a new bin is allocated.

+ +
+
+ +
+
+ + + + + + + + + +
size_t qb_array_num_bins_get (qb_array_t a ) 
+
+
+ +

Get the number of bins used or the array.

+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbarray_8h__dep__incl.map b/1.0rc3/doxygen/qbarray_8h__dep__incl.map new file mode 100644 index 000000000..da83dcab3 --- /dev/null +++ b/1.0rc3/doxygen/qbarray_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/1.0rc3/doxygen/qbarray_8h__dep__incl.md5 b/1.0rc3/doxygen/qbarray_8h__dep__incl.md5 new file mode 100644 index 000000000..93bfccaf4 --- /dev/null +++ b/1.0rc3/doxygen/qbarray_8h__dep__incl.md5 @@ -0,0 +1 @@ +1d29c5ede442f14c3296dd6d2f89a81a \ No newline at end of file diff --git a/1.0rc3/doxygen/qbarray_8h__dep__incl.png b/1.0rc3/doxygen/qbarray_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..51a68df4401d8da9b5f6550de93525ca07247ef0 GIT binary patch literal 5878 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 s^GGBLi>+xMxq^wE5teuR? + + diff --git a/1.0rc3/doxygen/qbarray_8h__incl.md5 b/1.0rc3/doxygen/qbarray_8h__incl.md5 new file mode 100644 index 000000000..79b02d01a --- /dev/null +++ b/1.0rc3/doxygen/qbarray_8h__incl.md5 @@ -0,0 +1 @@ +9275e2b7032ce60ea39f1f2011c9c502 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbarray_8h__incl.png b/1.0rc3/doxygen/qbarray_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..2728a3eb3c54857560b593e3a341236b01de6aee GIT binary patch literal 6528 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 + + + + +libqb: qbatomic.h File Reference + + + + + + + + + +
+

qbatomic.h File Reference

+

Basic atomic integer and pointer operations. +More...

+#include <stdint.h>
+#include <qb/qbdefs.h>
+#include <qb/qbconfig.h>
+
+Include dependency graph for qbatomic.h:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define qb_atomic_int_get(atomic)   ((int32_t)*(atomic))
#define qb_atomic_int_set(atomic, newval)   ((void) (*(atomic) = (newval)))
#define qb_atomic_pointer_get(atomic)   ((void*)*(atomic))
#define qb_atomic_pointer_set(atomic, newval)   ((void*) (*(atomic) = (newval)))
#define qb_atomic_int_inc(atomic)   (qb_atomic_int_add ((atomic), 1))
 Atomically increments the integer pointed to by atomic by 1.
#define qb_atomic_int_dec_and_test(atomic)   (qb_atomic_int_exchange_and_add ((atomic), -1) == 1)
 Atomically decrements the integer pointed to by atomic by 1.

Functions

void qb_atomic_init (void)
int32_t qb_atomic_int_exchange_and_add (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_t val)
 Atomically adds val to the integer pointed to by atomic.
void qb_atomic_int_add (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_t val)
 Atomically adds val to the integer pointed to by atomic.
int32_t qb_atomic_int_compare_and_exchange (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_t oldval, int32_t newval)
 Compares oldval with the integer pointed to by atomic and if they are equal, atomically exchanges *atomic with newval.
int32_t qb_atomic_pointer_compare_and_exchange (volatile void *QB_GNUC_MAY_ALIAS *atomic, void *oldval, void *newval)
 Compares oldval with the pointer pointed to by atomic and if they are equal, atomically exchanges *atomic with newval.
int32_t qb_atomic_int_get (volatile int32_t QB_GNUC_MAY_ALIAS *atomic)
 Reads the value of the integer pointed to by atomic.
void qb_atomic_int_set (volatile int32_t QB_GNUC_MAY_ALIAS *atomic, int32_t newval)
 Sets the value of the integer pointed to by atomic.
void * qb_atomic_pointer_get (volatile void *QB_GNUC_MAY_ALIAS *atomic)
 Reads the value of the pointer pointed to by atomic.
void qb_atomic_pointer_set (volatile void *QB_GNUC_MAY_ALIAS *atomic, void *newval)
 Sets the value of the pointer pointed to by atomic.
+

Detailed Description

+

Basic atomic integer and pointer operations.

+

The following functions can be used to atomically access integers and pointers. They are implemented as inline assembler function on most platforms and use slower fall-backs otherwise. Using them can sometimes save you from using a performance-expensive pthread_mutex to protect the integer or pointer.

+

The most important usage is reference counting. Using qb_atomic_int_inc() and qb_atomic_int_dec_and_test() makes reference counting a very fast operation.

+

You must not directly read integers or pointers concurrently accessed by multiple threads, but use the atomic accessor functions instead. That is, always use qb_atomic_int_get() and qb_atomic_pointer_get() for read outs. They provide the necessary synchonization mechanisms like memory barriers to access memory locations concurrently.

+

If you are using those functions for anything apart from simple reference counting, you should really be aware of the implications of doing that. There are literally thousands of ways to shoot yourself in the foot. So if in doubt, use a pthread_mutex. If you don't know, what memory barriers are, do not use anything but qb_atomic_int_inc() and qb_atomic_int_dec_and_test().

+

It is not safe to set an integer or pointer just by assigning to it, when it is concurrently accessed by other threads with the following functions. Use qb_atomic_int_compare_and_exchange() or qb_atomic_pointer_compare_and_exchange() respectively.

+

Define Documentation

+ +
+
+ + + + + + + + + +
#define qb_atomic_int_dec_and_test(atomic  )    (qb_atomic_int_exchange_and_add ((atomic), -1) == 1)
+
+
+ +

Atomically decrements the integer pointed to by atomic by 1.

+
Parameters:
+ + +
atomic a pointer to an integer
+
+
+
Returns:
QB_TRUE if the integer pointed to by atomic is 0 after decrementing it
+ +
+
+ +
+
+ + + + + + + + + +
#define qb_atomic_int_get(atomic  )    ((int32_t)*(atomic))
+
+
+ +
+
+ +
+
+ + + + + + + + + +
#define qb_atomic_int_inc(atomic  )    (qb_atomic_int_add ((atomic), 1))
+
+
+ +

Atomically increments the integer pointed to by atomic by 1.

+
Parameters:
+ + +
atomic a pointer to an integer.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_atomic_int_set(atomic,
newval  )    ((void) (*(atomic) = (newval)))
+
+
+ +
+
+ +
+
+ + + + + + + + + +
#define qb_atomic_pointer_get(atomic  )    ((void*)*(atomic))
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_atomic_pointer_set(atomic,
newval  )    ((void*) (*(atomic) = (newval)))
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + +
void qb_atomic_init (void  ) 
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_atomic_int_add (volatile int32_t QB_GNUC_MAY_ALIAS *  atomic,
int32_t  val 
)
+
+
+ +

Atomically adds val to the integer pointed to by atomic.

+

Also acts as a memory barrier.

+
Parameters:
+ + + +
atomic a pointer to an integer
val the value to add to *atomic
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_atomic_int_compare_and_exchange (volatile int32_t QB_GNUC_MAY_ALIAS *  atomic,
int32_t  oldval,
int32_t  newval 
)
+
+
+ +

Compares oldval with the integer pointed to by atomic and if they are equal, atomically exchanges *atomic with newval.

+

Also acts as a memory barrier.

+
Parameters:
+ + + + +
atomic a pointer to an integer
oldval the assumed old value of *atomic
newval the new value of *atomic
+
+
+
Returns:
QB_TRUE, if *atomic was equal oldval. QB_FALSE otherwise.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_atomic_int_exchange_and_add (volatile int32_t QB_GNUC_MAY_ALIAS *  atomic,
int32_t  val 
)
+
+
+ +

Atomically adds val to the integer pointed to by atomic.

+

It returns the value of *atomic just before the addition took place. Also acts as a memory barrier.

+
Parameters:
+ + + +
atomic a pointer to an integer
val the value to add to *atomic
+
+
+
Returns:
the value of *atomic before the addition.
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_atomic_int_get (volatile int32_t QB_GNUC_MAY_ALIAS *  atomic ) 
+
+
+ +

Reads the value of the integer pointed to by atomic.

+

Also acts as a memory barrier.

+
Parameters:
+ + +
atomic a pointer to an integer
+
+
+
Returns:
the value of atomic
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_atomic_int_set (volatile int32_t QB_GNUC_MAY_ALIAS *  atomic,
int32_t  newval 
)
+
+
+ +

Sets the value of the integer pointed to by atomic.

+

Also acts as a memory barrier.

+
Parameters:
+ + + +
atomic a pointer to an integer
newval the new value
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_atomic_pointer_compare_and_exchange (volatile void *QB_GNUC_MAY_ALIAS *  atomic,
void *  oldval,
void *  newval 
)
+
+
+ +

Compares oldval with the pointer pointed to by atomic and if they are equal, atomically exchanges *atomic with newval.

+

Also acts as a memory barrier.

+
Parameters:
+ + + + +
atomic a pointer to a void*
oldval the assumed old value of *atomic
newval the new value of *atomic
+
+
+
Returns:
QB_TRUE if atomic was equal oldval, else QB_FALSE.
+ +
+
+ +
+
+ + + + + + + + + +
void* qb_atomic_pointer_get (volatile void *QB_GNUC_MAY_ALIAS *  atomic ) 
+
+
+ +

Reads the value of the pointer pointed to by atomic.

+

Also acts as a memory barrier.

+
Parameters:
+ + +
atomic a pointer to a void*.
+
+
+
Returns:
the value to add to atomic.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_atomic_pointer_set (volatile void *QB_GNUC_MAY_ALIAS *  atomic,
void *  newval 
)
+
+
+ +

Sets the value of the pointer pointed to by atomic.

+

Also acts as a memory barrier.

+
Parameters:
+ + + +
atomic a pointer to a void*
newval the new value
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbatomic_8h__incl.map b/1.0rc3/doxygen/qbatomic_8h__incl.map new file mode 100644 index 000000000..edc64f86e --- /dev/null +++ b/1.0rc3/doxygen/qbatomic_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/1.0rc3/doxygen/qbatomic_8h__incl.md5 b/1.0rc3/doxygen/qbatomic_8h__incl.md5 new file mode 100644 index 000000000..861b94636 --- /dev/null +++ b/1.0rc3/doxygen/qbatomic_8h__incl.md5 @@ -0,0 +1 @@ +191d313c6c51f3e69ae1c208319dff1c \ No newline at end of file diff --git a/1.0rc3/doxygen/qbatomic_8h__incl.png b/1.0rc3/doxygen/qbatomic_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9c79009c99a8ee312050ed1c3e91e38872d4ab GIT binary patch literal 7419 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 + + + + +libqb: qbconfig.h File Reference + + + + + + + + + +
+

qbconfig.h File Reference

+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+ + + + +

Defines

#define QB_ATOMIC_OP_MEMORY_BARRIER_NEEDED   1
#define QB_HAVE_ATTRIBUTE_SECTION   1
+

Define Documentation

+ +
+
+ + + + +
#define QB_ATOMIC_OP_MEMORY_BARRIER_NEEDED   1
+
+
+ +
+
+ +
+
+ + + + +
#define QB_HAVE_ATTRIBUTE_SECTION   1
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbconfig_8h__dep__incl.map b/1.0rc3/doxygen/qbconfig_8h__dep__incl.map new file mode 100644 index 000000000..283daea8e --- /dev/null +++ b/1.0rc3/doxygen/qbconfig_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/1.0rc3/doxygen/qbconfig_8h__dep__incl.md5 b/1.0rc3/doxygen/qbconfig_8h__dep__incl.md5 new file mode 100644 index 000000000..29db61b6e --- /dev/null +++ b/1.0rc3/doxygen/qbconfig_8h__dep__incl.md5 @@ -0,0 +1 @@ +fccc403363082712884f35aea72fa71b \ No newline at end of file diff --git a/1.0rc3/doxygen/qbconfig_8h__dep__incl.png b/1.0rc3/doxygen/qbconfig_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..def88c81cb4a2016ffcc0b8cb0133d9757dab6c0 GIT binary patch literal 6566 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 OFCb+FbvO!U8v0-O + + + + +libqb: qbdefs.h File Reference + + + + + + + + + +
+

qbdefs.h File Reference

+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define QB_ROUNDUP(x, y)   ((((x) + ((y) - 1)) / (y)) * (y))
#define QB_ABS(i)   (((i) < 0) ? -(i) : (i))
#define QB_MAX(a, b)   (((a) > (b)) ? (a) : (b))
#define QB_MIN(a, b)   (((a) < (b)) ? (a) : (b))
#define QB_FALSE   0
#define QB_TRUE   (!QB_FALSE)
#define qb_bit_value(bit)   (1 << (bit))
#define qb_bit_set(barray, bit)   (barray |= qb_bit_value(bit))
#define qb_bit_clear(barray, bit)   (barray &= ~(qb_bit_value(bit)))
#define qb_bit_is_set(barray, bit)   (barray & qb_bit_value(bit))
#define qb_bit_is_clear(barray, bit)   (!(barray & qb_bit_value(bit)))
#define HZ   100
#define QB_TIME_MS_IN_SEC   1000ULL
#define QB_TIME_US_IN_SEC   1000000ULL
#define QB_TIME_NS_IN_SEC   1000000000ULL
#define QB_TIME_US_IN_MSEC   1000ULL
#define QB_TIME_NS_IN_MSEC   1000000ULL
#define QB_TIME_NS_IN_USEC   1000ULL
#define QB_GNUC_DEPRECATED
#define QB_GNUC_DEPRECATED_FOR(f)   QB_GNUC_DEPRECATED
#define QB_GNUC_MAY_ALIAS
+

Detailed Description

+
Author:
Angus Salkeld <asalkeld@redhat.com>
+

These are some convience macros and defines.

+

Define Documentation

+ +
+
+ + + + +
#define HZ   100
+
+
+ +
+
+ +
+
+ + + + + + + + + +
#define QB_ABS( )    (((i) < 0) ? -(i) : (i))
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_bit_clear(barray,
bit  )    (barray &= ~(qb_bit_value(bit)))
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_bit_is_clear(barray,
bit  )    (!(barray & qb_bit_value(bit)))
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_bit_is_set(barray,
bit  )    (barray & qb_bit_value(bit))
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_bit_set(barray,
bit  )    (barray |= qb_bit_value(bit))
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + +
#define qb_bit_value(bit  )    (1 << (bit))
+
+
+ +
+
+ +
+
+ + + + +
#define QB_FALSE   0
+
+ +
+ +
+
+ + + + +
#define QB_GNUC_DEPRECATED
+
+
+ +
+
+ +
+
+ + + + + + + + + +
#define QB_GNUC_DEPRECATED_FOR( )    QB_GNUC_DEPRECATED
+
+
+ +
+
+ +
+
+ + + + +
#define QB_GNUC_MAY_ALIAS
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define QB_MAX(a,
 )    (((a) > (b)) ? (a) : (b))
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define QB_MIN(a,
 )    (((a) < (b)) ? (a) : (b))
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + +
#define QB_ROUNDUP(x,
 )    ((((x) + ((y) - 1)) / (y)) * (y))
+
+
+ +
+
+ +
+
+ + + + +
#define QB_TIME_MS_IN_SEC   1000ULL
+
+
+ +
+
+ +
+
+ + + + +
#define QB_TIME_NS_IN_MSEC   1000000ULL
+
+
+ +
+
+ +
+
+ + + + +
#define QB_TIME_NS_IN_SEC   1000000000ULL
+
+
+ +
+
+ +
+
+ + + + +
#define QB_TIME_NS_IN_USEC   1000ULL
+
+
+ +
+
+ +
+
+ + + + +
#define QB_TIME_US_IN_MSEC   1000ULL
+
+
+ +
+
+ +
+
+ + + + +
#define QB_TIME_US_IN_SEC   1000000ULL
+
+
+ +
+
+ +
+
+ + + + +
#define QB_TRUE   (!QB_FALSE)
+
+ +
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbdefs_8h__dep__incl.map b/1.0rc3/doxygen/qbdefs_8h__dep__incl.map new file mode 100644 index 000000000..4602aaffb --- /dev/null +++ b/1.0rc3/doxygen/qbdefs_8h__dep__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/1.0rc3/doxygen/qbdefs_8h__dep__incl.md5 b/1.0rc3/doxygen/qbdefs_8h__dep__incl.md5 new file mode 100644 index 000000000..14d920fec --- /dev/null +++ b/1.0rc3/doxygen/qbdefs_8h__dep__incl.md5 @@ -0,0 +1 @@ +21b8fd89397512b2cc9cf9e58ef44bee \ No newline at end of file diff --git a/1.0rc3/doxygen/qbdefs_8h__dep__incl.png b/1.0rc3/doxygen/qbdefs_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..25a3303f31da9d4c6c0821548601760aa8bdc08f GIT binary patch literal 14514 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 UJ6(OiONfw{GRn|mDdV930SvE+*8l(j literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbhdb_8h.html b/1.0rc3/doxygen/qbhdb_8h.html new file mode 100644 index 000000000..cd2ecf2ba --- /dev/null +++ b/1.0rc3/doxygen/qbhdb_8h.html @@ -0,0 +1,606 @@ + + + + + +libqb: qbhdb.h File Reference + + + + + + + + + +
+

qbhdb.h File Reference

+

The handle database is for reference counting objects. +More...

+#include <stdlib.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <qb/qbarray.h>
+
+Include dependency graph for qbhdb.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  qb_hdb_handle
struct  qb_hdb

Defines

#define QB_HDB_D_FORMAT   "%" PRIu64
#define QB_HDB_X_FORMAT   "%" PRIx64
#define QB_HDB_DECLARE(database_name, destructor_function)
 Convience macro for declaring a file scoped handle database.

Typedefs

typedef uint64_t qb_handle_t
 Generic handle type is 64 bits.

Functions

void qb_hdb_create (struct qb_hdb *hdb)
 Create a new database.
void qb_hdb_destroy (struct qb_hdb *hdb)
 Destroy a handle database.
int32_t qb_hdb_handle_create (struct qb_hdb *hdb, int32_t instance_size, qb_handle_t *handle_id_out)
 Create a new handle.
int32_t qb_hdb_handle_get (struct qb_hdb *hdb, qb_handle_t handle_in, void **instance)
 Get the instance associated with this handle and increase it's refcount.
int32_t qb_hdb_handle_get_always (struct qb_hdb *hdb, qb_handle_t handle_in, void **instance)
 Get the instance associated with this handle and increase it's refcount.
int32_t qb_hdb_handle_put (struct qb_hdb *hdb, qb_handle_t handle_in)
 Put the instance associated with this handle and decrease it's refcount.
int32_t qb_hdb_handle_destroy (struct qb_hdb *hdb, qb_handle_t handle_in)
 Request the destruction of the object.
int32_t qb_hdb_handle_refcount_get (struct qb_hdb *hdb, qb_handle_t handle_in)
 Get the current refcount.
void qb_hdb_iterator_reset (struct qb_hdb *hdb)
 Reset the iterator.
int32_t qb_hdb_iterator_next (struct qb_hdb *hdb, void **instance, qb_handle_t *handle)
 Get the next object and increament it's refcount.
uint32_t qb_hdb_base_convert (qb_handle_t handle)
uint64_t qb_hdb_nocheck_convert (uint32_t handle)
+

Detailed Description

+

The handle database is for reference counting objects.

+

Define Documentation

+ +
+
+ + + + +
#define QB_HDB_D_FORMAT   "%" PRIu64
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define QB_HDB_DECLARE(database_name,
destructor_function  ) 
+
+
+Value:
static struct qb_hdb (database_name) = {                                \
+        .handle_count   = 0,                                            \
+        .handles        = NULL,                                         \
+        .iterator       = 0,                                            \
+        .destructor     = destructor_function,                          \
+        .first_run      = QB_TRUE                                       \
+};                                                                      \
+
+

Convience macro for declaring a file scoped handle database.

+
 QB_HDB_DECLARE(my_handle_database, NULL);
+
+
+
+ +
+
+ + + + +
#define QB_HDB_X_FORMAT   "%" PRIx64
+
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef uint64_t qb_handle_t
+
+
+ +

Generic handle type is 64 bits.

+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + +
uint32_t qb_hdb_base_convert (qb_handle_t  handle ) 
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void qb_hdb_create (struct qb_hdb hdb ) 
+
+
+ +

Create a new database.

+
Parameters:
+ + +
hdb the database to init.
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void qb_hdb_destroy (struct qb_hdb hdb ) 
+
+
+ +

Destroy a handle database.

+
Parameters:
+ + +
hdb the database to destroy.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_hdb_handle_create (struct qb_hdb hdb,
int32_t  instance_size,
qb_handle_t handle_id_out 
)
+
+
+ +

Create a new handle.

+
Parameters:
+ + + + +
hdb the database instance
instance_size size of the object to malloc
handle_id_out new handle
+
+
+
Returns:
(0 == ok, -errno faliure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_hdb_handle_destroy (struct qb_hdb hdb,
qb_handle_t  handle_in 
)
+
+
+ +

Request the destruction of the object.

+

When the refcount is 0, it will be destroyed.

+
Parameters:
+ + + +
handle_in the handle
hdb the database instance
+
+
+
Returns:
(0 == ok, -errno faliure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_hdb_handle_get (struct qb_hdb hdb,
qb_handle_t  handle_in,
void **  instance 
)
+
+
+ +

Get the instance associated with this handle and increase it's refcount.

+
Parameters:
+ + + + +
handle_in the handle
hdb the database instance
instance (out) pointer to the desired object.
+
+
+
Returns:
(0 == ok, -errno faliure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_hdb_handle_get_always (struct qb_hdb hdb,
qb_handle_t  handle_in,
void **  instance 
)
+
+
+ +

Get the instance associated with this handle and increase it's refcount.

+
Parameters:
+ + + + +
handle_in the handle
hdb the database instance
instance (out) pointer to the desired object.
+
+
+
Returns:
(0 == ok, -errno faliure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_hdb_handle_put (struct qb_hdb hdb,
qb_handle_t  handle_in 
)
+
+
+ +

Put the instance associated with this handle and decrease it's refcount.

+
Parameters:
+ + + +
handle_in the handle
hdb the database instance
+
+
+
Returns:
(0 == ok, -errno faliure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_hdb_handle_refcount_get (struct qb_hdb hdb,
qb_handle_t  handle_in 
)
+
+
+ +

Get the current refcount.

+
Parameters:
+ + + +
handle_in the handle
hdb the database instance
+
+
+
Returns:
(>= 0 is the refcount, -errno faliure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_hdb_iterator_next (struct qb_hdb hdb,
void **  instance,
qb_handle_t handle 
)
+
+
+ +

Get the next object and increament it's refcount.

+

Remember to call qb_hdb_handle_put()

+
Parameters:
+ + + + +
hdb the database instance
handle (out) the handle
instance (out) pointer to the desired object.
+
+
+
Returns:
(0 == ok, -errno faliure)
+ +
+
+ +
+
+ + + + + + + + + +
void qb_hdb_iterator_reset (struct qb_hdb hdb ) 
+
+
+ +

Reset the iterator.

+
Parameters:
+ + +
hdb the database instance
+
+
+ +
+
+ +
+
+ + + + + + + + + +
uint64_t qb_hdb_nocheck_convert (uint32_t  handle ) 
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbhdb_8h__dep__incl.map b/1.0rc3/doxygen/qbhdb_8h__dep__incl.map new file mode 100644 index 000000000..885eb8734 --- /dev/null +++ b/1.0rc3/doxygen/qbhdb_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/1.0rc3/doxygen/qbhdb_8h__dep__incl.md5 b/1.0rc3/doxygen/qbhdb_8h__dep__incl.md5 new file mode 100644 index 000000000..c93d5af5b --- /dev/null +++ b/1.0rc3/doxygen/qbhdb_8h__dep__incl.md5 @@ -0,0 +1 @@ +246444559c365c8eac552de47688bec3 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbhdb_8h__dep__incl.png b/1.0rc3/doxygen/qbhdb_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..69c870b0669c0845413a7574f945d47275c11ae8 GIT binary patch literal 4173 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 literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbhdb_8h__incl.map b/1.0rc3/doxygen/qbhdb_8h__incl.map new file mode 100644 index 000000000..98de8db11 --- /dev/null +++ b/1.0rc3/doxygen/qbhdb_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/1.0rc3/doxygen/qbhdb_8h__incl.md5 b/1.0rc3/doxygen/qbhdb_8h__incl.md5 new file mode 100644 index 000000000..d28992140 --- /dev/null +++ b/1.0rc3/doxygen/qbhdb_8h__incl.md5 @@ -0,0 +1 @@ +ff9722717c1a204a702a0194f73a6869 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbhdb_8h__incl.png b/1.0rc3/doxygen/qbhdb_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..90f21558b9440f936f0d6fb73c16d15b360fa261 GIT binary patch literal 14739 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 + + + + +libqb: qbipc_common.h File Reference + + + + + + + + + +
+

qbipc_common.h File Reference

+

common types and definitions +More...

+#include <stdint.h>
+
+Include dependency graph for qbipc_common.h:
+
+
+
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+ + + + + + + + + + + + + + +

Data Structures

struct  qb_ipc_request_header
struct  qb_ipc_response_header

Defines

#define QB_IPC_MSG_NEW_MESSAGE   0
#define QB_IPC_MSG_USER_START   QB_IPC_MSG_NEW_MESSAGE
#define QB_IPC_MSG_AUTHENTICATE   -1
#define QB_IPC_MSG_NEW_EVENT_SOCK   -2
#define QB_IPC_MSG_DISCONNECT   -3

Enumerations

enum  qb_ipc_type {
+  QB_IPC_SOCKET, +QB_IPC_SHM, +QB_IPC_POSIX_MQ, +QB_IPC_SYSV_MQ, +
+  QB_IPC_NATIVE +
+ }

Variables

struct qb_ipc_request_header aligned
+

Detailed Description

+

common types and definitions

+

Define Documentation

+ +
+
+ + + + +
#define QB_IPC_MSG_AUTHENTICATE   -1
+
+
+ +
+
+ +
+
+ + + + +
#define QB_IPC_MSG_DISCONNECT   -3
+
+
+ +
+
+ +
+
+ + + + +
#define QB_IPC_MSG_NEW_EVENT_SOCK   -2
+
+
+ +
+
+ +
+
+ + + + +
#define QB_IPC_MSG_NEW_MESSAGE   0
+
+
+ +
+
+ +
+
+ + + + +
#define QB_IPC_MSG_USER_START   QB_IPC_MSG_NEW_MESSAGE
+
+
+
Examples:
ipcclient.c, and ipcserver.c.
+
+
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum qb_ipc_type
+
+
+
Enumerator:
+ + + + + +
QB_IPC_SOCKET  +
QB_IPC_SHM  +
QB_IPC_POSIX_MQ  +
QB_IPC_SYSV_MQ  +
QB_IPC_NATIVE  +
+
+
+ +
+
+

Variable Documentation

+ +
+
+ + + + +
struct qb_ipc_response_header aligned
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbipc__common_8h__dep__incl.map b/1.0rc3/doxygen/qbipc__common_8h__dep__incl.map new file mode 100644 index 000000000..885eb8734 --- /dev/null +++ b/1.0rc3/doxygen/qbipc__common_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/1.0rc3/doxygen/qbipc__common_8h__dep__incl.md5 b/1.0rc3/doxygen/qbipc__common_8h__dep__incl.md5 new file mode 100644 index 000000000..7ffad5163 --- /dev/null +++ b/1.0rc3/doxygen/qbipc__common_8h__dep__incl.md5 @@ -0,0 +1 @@ +d1ecd71283994f6388e3dd557fc280bc \ No newline at end of file diff --git a/1.0rc3/doxygen/qbipc__common_8h__dep__incl.png b/1.0rc3/doxygen/qbipc__common_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f0594b8915a2809752b4073ee18227e4cff57329 GIT binary patch literal 4721 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 literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbipc__common_8h__incl.map b/1.0rc3/doxygen/qbipc__common_8h__incl.map new file mode 100644 index 000000000..8be6a309f --- /dev/null +++ b/1.0rc3/doxygen/qbipc__common_8h__incl.map @@ -0,0 +1,2 @@ + + diff --git a/1.0rc3/doxygen/qbipc__common_8h__incl.md5 b/1.0rc3/doxygen/qbipc__common_8h__incl.md5 new file mode 100644 index 000000000..fa5599fa1 --- /dev/null +++ b/1.0rc3/doxygen/qbipc__common_8h__incl.md5 @@ -0,0 +1 @@ +7d9c7e74816f9f84f4111aab3aca116b \ No newline at end of file diff --git a/1.0rc3/doxygen/qbipc__common_8h__incl.png b/1.0rc3/doxygen/qbipc__common_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d568e9e48c1c79643024cc501d7e842b6a7df83c GIT binary patch literal 2700 zcmcImXH-+!7QQ63gf2}qp@TSsAkv9JN*u~i0)n6hrAi51$RHpF0U>l15Co|z1PDkc z4+u&f6k#HS4uS|$B;rs)=UxBI`|;NM`PRAToV)h9cb|Rs-sk%^32SA-2R{V|0D#ZT z6k`j{>0l4#<^;#0K`#!!!NcSIYFph-t5~Dy{)ZwX`nwq8MFVIc8OhG82K}2=0Rguv_CxbiP-&Hq0x8zfyetSm;LQE ztddAsMMdWb<%W=yR9a=FvXTfqX+QhAiHC=RR=`YhbF+@A{0Yj@UhCbBp33b-=ltlu zH#X=aBM&<|j6y;~=ekJ3dVZh*peN`IMqFpSfZN{YvSSN@GIN+RvOUp&Pw#UdYru{SY;{lmj~_p-ug@9B>}w1+ zHZ_Si`A-`W2wJYLuCvR_q}f?#c}2xjlp)7YOs0QER#v%`2?oPHQstDi&-#vEJEN{H zJU2HdNWy?dmsMAr+`g>{9&vcJyu4hQ>E?q3W5^AIMHduEjZ|KX0S}e3xAVa-fd3V6 zZ*LQJczDPShuc;U;YONNl$5y7oja#DYM0#L=j|PBOUAgnzZeHYSn)lmKOcRgbl}Y! zgRR<@78KyzlPqz4HN#vX>R`vkM(WDy$?^84CI@`~qkg}DRJFUJS|MzN+98(C7G>z5 zxA8@qLTK_xL1-)eJjb8Cyw(7qqMc5yIj=<@^oWLtqY3V+K}MBU`{`x>!oak5(vLpSn$Gm zcx0Zww{dbx$<+>!J$tsVL(VOyrmTcahJkU7wu^mVkwqAgHO&_OM};b;Q5m4FD|Z(-zD6<>sc`ty4JE;5*t8V zTwKwM7w#Q*OxRc{LJol z#s2(vY&)t4!WAM0Rbkyk({RrND3;;u=Eo>(bqTbv;+D(LVJx-2oy=q`wkI}|~DOPO^JNZx+`_~J|;>OunKg`x5h6cRmWEGxJ! zBX+D7EgB@nVQL&4EWfwUS8!sRRgs?Odo-A8eOpADPnI5#tvx6eNn>uDEEw!;y?Z1` zimEg6n7Yh%%1}8!V7+Ok`}6MAvV=(`1G!2^AvS|gL)j}|wTej)jR*1ZJYwhIkb+B* zUOSQc;43Ie68&{v5uPqdCT}!E*9BMQGlL})dwRn0Pm5!IZCC2c0oV+@ zyp&p7TPvL&KEp0S0moLIv3Hrgcs#xnyeOdbR4JrOlTNRzbb@@fA^xT|k$Lw*Lh3&x z)Tb&{D6V>w*gHQ5Le2;IE$7Q|7D#gur~OR zv!^FlK)}CTW)NB^s1r4qgN=<%5FWR_wRQRC&HV5iAt4&To4!8SMM>*b{!Z0fH0SO_ z(ZG-pjGbM^NN(^mYfa<#*7+9=L5M^k5Q0b~9~I~SQD-mX>C@9wPbsy1z*!NvySuwI z3UxY|inx%&TX&nUeVH};77DzH7mzB%DuK`NWNmHj`j2@N@HaVaZE;(2$Z$=nBs!5t zT&3{UD^3D|kZvlknBvBy`DP``nVXy2Q79C}25_)v!)j`1EKMIB?A{Rt?5(ZSM)p9I zBgYyQt^AnpT?y6I)m>>cKGZ{@81D!3(N~%>``mv4$+%?xWVvVky`1uf277y3TUSE+ z57#H^STF=)D!7C=9&y+Co|NVYmI@~)XYw}Q$H(Z_Eh$;K_)E`9sFl`XVa?&=Lqo!! z+V6vaRbR%enG$yxb0@Mx*xtQ+7dYR;*G#3#$jL#MmzNb;+JvfNvyGW0nO}I?t(=uv z-J)6&(g5gZM_Qz=Re^p=g+uk{?X}63Yo^jCTalq(DmCsbT5!i1*)ogs!<^BngQ`hO6p4cERl@>z6_{cQ-sKt7ftL sI(N>-j46iGq<>axKkKWXFn7%L&DW}-P};!=EH44G%T|~wBj*SI22`E$LI3~& literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbipcc_8h.html b/1.0rc3/doxygen/qbipcc_8h.html new file mode 100644 index 000000000..443538884 --- /dev/null +++ b/1.0rc3/doxygen/qbipcc_8h.html @@ -0,0 +1,704 @@ + + + + + +libqb: qbipcc.h File Reference + + + + + + + + + +
+

qbipcc.h File Reference

+

Client IPC API. +More...

+#include <qb/qbconfig.h>
+#include <pthread.h>
+#include <sys/poll.h>
+#include <sys/socket.h>
+#include <qb/qbhdb.h>
+#include <qb/qbipc_common.h>
+
+Include dependency graph for qbipcc.h:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Typedefs

typedef struct qb_ipcc_connection qb_ipcc_connection_t

Functions

qb_ipcc_connection_tqb_ipcc_connect (const char *name, size_t max_msg_size)
 Create a connection to an IPC service.
int32_t qb_ipcc_verify_dgram_max_msg_size (size_t max_msg_size)
 Test kernel dgram socket buffers to verify the largest size up to the max_msg_size value a single msg can be.
void qb_ipcc_disconnect (qb_ipcc_connection_t *c)
 Disconnect an IPC connection.
int32_t qb_ipcc_fd_get (qb_ipcc_connection_t *c, int32_t *fd)
 Get the file descriptor to poll.
int32_t qb_ipcc_fc_enable_max_set (qb_ipcc_connection_t *c, uint32_t max)
 Set the maximum allowable flowcontrol value.
ssize_t qb_ipcc_send (qb_ipcc_connection_t *c, const void *msg_ptr, size_t msg_len)
 Send a message.
ssize_t qb_ipcc_sendv (qb_ipcc_connection_t *c, const struct iovec *iov, size_t iov_len)
 Send a message (iovec).
ssize_t qb_ipcc_recv (qb_ipcc_connection_t *c, void *msg_ptr, size_t msg_len, int32_t ms_timeout)
 Receive a response.
ssize_t qb_ipcc_sendv_recv (qb_ipcc_connection_t *c, const struct iovec *iov, uint32_t iov_len, void *msg_ptr, size_t msg_len, int32_t ms_timeout)
 This is a convenience function that simply sends and then recvs.
ssize_t qb_ipcc_event_recv (qb_ipcc_connection_t *c, void *msg_ptr, size_t msg_len, int32_t ms_timeout)
 Receive an event.
void qb_ipcc_context_set (qb_ipcc_connection_t *c, void *context)
 Associate a "user" pointer with this connection.
void * qb_ipcc_context_get (qb_ipcc_connection_t *c)
 Get the context (set previously).
int32_t qb_ipcc_is_connected (qb_ipcc_connection_t *c)
 Is the connection connected?
int32_t qb_ipcc_get_buffer_size (qb_ipcc_connection_t *c)
 What is the actual buffer size used after the connection.
+

Detailed Description

+

Client IPC API.

+
Lifecycle of an IPC connection.
An IPC connection is made to the server with qb_ipcc_connect(). This function connects to the server and requests channels be created for communication. To disconnect, the client either exits or executes the function qb_ipcc_disconnect().
+
Synchronous communication
The function qb_ipcc_sendv_recv() sends an iovector request and receives a response.
+
Asynchronous requests from the client
The function qb_ipcc_sendv() sends an iovector request. The function qb_ipcc_send() sends an message buffer request.
+
Asynchronous events from the server
The qb_ipcc_event_recv() function receives an out-of-band asyncronous message. The asynchronous messages are queued and can provide very high out-of-band performance. To determine when to call qb_ipcc_event_recv() the qb_ipcc_fd_get() call is used to obtain a file descriptor used in the poll() or select() system calls.
+

Typedef Documentation

+ +
+
+ + + + +
typedef struct qb_ipcc_connection qb_ipcc_connection_t
+
+
+
Examples:
ipcclient.c.
+
+
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
qb_ipcc_connection_t* qb_ipcc_connect (const char *  name,
size_t  max_msg_size 
)
+
+
+ +

Create a connection to an IPC service.

+
Parameters:
+ + + +
name name of the service.
max_msg_size biggest msg size.
+
+
+
Returns:
NULL (error: see errno) or a connection object.
+
Note:
It is recommended to do a one time check on the max_msg_size value using qb_ipcc_verify_dgram_max_msg_size _BEFORE_ calling the connect function when IPC_SOCKET is in use. Some distributions while allow large message buffers to be set on the socket, but not actually honor them because of kernel state values. The qb_ipcc_verify_dgram_max_msg_size function both sets the socket buffer size and verifies it by doing a send/recv.
+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + +
void* qb_ipcc_context_get (qb_ipcc_connection_t c ) 
+
+
+ +

Get the context (set previously).

+
Parameters:
+ + +
c connection instance
+
+
+
Returns:
the context
+
See also:
qb_ipcc_context_set()
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_ipcc_context_set (qb_ipcc_connection_t c,
void *  context 
)
+
+
+ +

Associate a "user" pointer with this connection.

+
Parameters:
+ + + +
context the point to associate with this connection.
c connection instance
+
+
+
See also:
qb_ipcc_context_get()
+ +
+
+ +
+
+ + + + + + + + + +
void qb_ipcc_disconnect (qb_ipcc_connection_t c ) 
+
+
+ +

Disconnect an IPC connection.

+
Parameters:
+ + +
c connection instance
+
+
+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcc_event_recv (qb_ipcc_connection_t c,
void *  msg_ptr,
size_t  msg_len,
int32_t  ms_timeout 
)
+
+
+ +

Receive an event.

+
Parameters:
+ + + + + + +
c connection instance
msg_ptr pointer to a message buffer to receive into
msg_len the size of the buffer
ms_timeout time in milli seconds to wait for a message 0 == no wait, negative == block, positive == wait X ms.
ms_timeout max time to wait for a response
+
+
+
Returns:
size of the message or error (-errno)
+
Note:
that msg_ptr will include a qb_ipc_response_header at the top of the message.
+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_ipcc_fc_enable_max_set (qb_ipcc_connection_t c,
uint32_t  max 
)
+
+
+ +

Set the maximum allowable flowcontrol value.

+
Note:
the default is 1
+
Parameters:
+ + + +
c connection instance
max the max allowable flowcontrol value (1 or 2)
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_ipcc_fd_get (qb_ipcc_connection_t c,
int32_t *  fd 
)
+
+
+ +

Get the file descriptor to poll.

+
Parameters:
+ + + +
c connection instance
fd (out) file descriptor to poll
+
+
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_ipcc_get_buffer_size (qb_ipcc_connection_t c ) 
+
+
+ +

What is the actual buffer size used after the connection.

+
Note:
The buffer size is guaranteed to be at least the size of the value given in qb_ipcc_connect, but it is possible the server will enforce a larger size depending on the implementation. If the server side is known to enforce a buffer size, use this function after the client connection is established to retrieve the buffer size in use. It is important for the client side to know the buffer size in use so the client can successfully retrieve large server events.
+
Parameters:
+ + +
c connection instance
+
+
+
Return values:
+ + +
connection size in bytes or -error code
+
+
+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + +
int32_t qb_ipcc_is_connected (qb_ipcc_connection_t c ) 
+
+
+ +

Is the connection connected?

+
Parameters:
+ + +
c connection instance
+
+
+
Return values:
+ + + +
QB_TRUE when connected
QB_FALSE when not connected
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcc_recv (qb_ipcc_connection_t c,
void *  msg_ptr,
size_t  msg_len,
int32_t  ms_timeout 
)
+
+
+ +

Receive a response.

+
Parameters:
+ + + + + +
c connection instance
msg_ptr pointer to a message buffer to receive into
msg_len the size of the buffer
ms_timeout max time to wait for a response
+
+
+
Returns:
(size recv'ed, -errno == error)
+
Note:
that msg_ptr will include a qb_ipc_response_header at the top of the message.
+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcc_send (qb_ipcc_connection_t c,
const void *  msg_ptr,
size_t  msg_len 
)
+
+
+ +

Send a message.

+
Parameters:
+ + + + +
c connection instance
msg_ptr pointer to a message to send
msg_len the size of the message
+
+
+
Returns:
(size sent, -errno == error)
+
Note:
the msg_ptr must include a qb_ipc_request_header at the top of the message. The server will read the size field to determine how much to recv.
+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcc_sendv (qb_ipcc_connection_t c,
const struct iovec *  iov,
size_t  iov_len 
)
+
+
+ +

Send a message (iovec).

+
Parameters:
+ + + + +
c connection instance
iov pointer to an iovec struct to send
iov_len the number of iovecs used
+
+
+
Returns:
(size sent, -errno == error)
+
Note:
the iov[0] must be a qb_ipc_request_header. The server will read the size field to determine how much to recv.
+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcc_sendv_recv (qb_ipcc_connection_t c,
const struct iovec *  iov,
uint32_t  iov_len,
void *  msg_ptr,
size_t  msg_len,
int32_t  ms_timeout 
)
+
+
+ +

This is a convenience function that simply sends and then recvs.

+
Parameters:
+ + + + + + + +
c connection instance
iov pointer to an iovec struct to send
iov_len the number of iovecs used
msg_ptr pointer to a message buffer to receive into
msg_len the size of the buffer
ms_timeout max time to wait for a response
+
+
+
Note:
the iov[0] must include a qb_ipc_request_header at the top of the message. The server will read the size field to determine how much to recv.
+
+that msg_ptr will include a qb_ipc_response_header at the top of the message.
+
See also:
qb_ipcc_sendv() qb_ipcc_recv()
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_ipcc_verify_dgram_max_msg_size (size_t  max_msg_size ) 
+
+
+ +

Test kernel dgram socket buffers to verify the largest size up to the max_msg_size value a single msg can be.

+

Rounds down to the nearest 1k.

+
Parameters:
+ + +
max_msg_size biggest msg size.
+
+
+
Returns:
-1 if max size can not be detected, positive value representing the largest single msg up to max_msg_size that can successfully be sent over a unix dgram socket.
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbipcc_8h__incl.map b/1.0rc3/doxygen/qbipcc_8h__incl.map new file mode 100644 index 000000000..a36ec8822 --- /dev/null +++ b/1.0rc3/doxygen/qbipcc_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/1.0rc3/doxygen/qbipcc_8h__incl.md5 b/1.0rc3/doxygen/qbipcc_8h__incl.md5 new file mode 100644 index 000000000..e1ddc6a9c --- /dev/null +++ b/1.0rc3/doxygen/qbipcc_8h__incl.md5 @@ -0,0 +1 @@ +1fc96265d1f6739ce6c0270252c82a14 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbipcc_8h__incl.png b/1.0rc3/doxygen/qbipcc_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..305c5e786a611ae747e7ce52019abaf1037d6735 GIT binary patch literal 33063 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 z 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 literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbipcs_8h.html b/1.0rc3/doxygen/qbipcs_8h.html new file mode 100644 index 000000000..7f79f375f --- /dev/null +++ b/1.0rc3/doxygen/qbipcs_8h.html @@ -0,0 +1,1382 @@ + + + + + +libqb: qbipcs.h File Reference + + + + + + + + + +
+

qbipcs.h File Reference

+

Server IPC API. +More...

+#include <stdlib.h>
+#include <sys/uio.h>
+#include <qb/qbipc_common.h>
+#include <qb/qbhdb.h>
+#include <qb/qbloop.h>
+
+Include dependency graph for qbipcs.h:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  qb_ipcs_stats
struct  qb_ipcs_connection_stats
struct  qb_ipcs_connection_stats_2
struct  qb_ipcs_poll_handlers
struct  qb_ipcs_service_handlers

Typedefs

typedef struct qb_ipcs_connection qb_ipcs_connection_t
typedef struct qb_ipcs_service qb_ipcs_service_t
typedef int32_t(* qb_ipcs_dispatch_fn_t )(int32_t fd, int32_t revents, void *data)
typedef int32_t(* qb_ipcs_dispatch_add_fn )(enum qb_loop_priority p, int32_t fd, int32_t events, void *data, qb_ipcs_dispatch_fn_t fn)
typedef int32_t(* qb_ipcs_dispatch_mod_fn )(enum qb_loop_priority p, int32_t fd, int32_t events, void *data, qb_ipcs_dispatch_fn_t fn)
typedef int32_t(* qb_ipcs_dispatch_del_fn )(int32_t fd)
typedef int32_t(* qb_ipcs_job_add_fn )(enum qb_loop_priority p, void *data, qb_loop_job_dispatch_fn dispatch_fn)
typedef int32_t(* qb_ipcs_connection_accept_fn )(qb_ipcs_connection_t *c, uid_t uid, gid_t gid)
 This callback is to check whether you want to accept a new connection.
typedef void(* qb_ipcs_connection_created_fn )(qb_ipcs_connection_t *c)
 This is called after a new connection has been created.
typedef int32_t(* qb_ipcs_connection_closed_fn )(qb_ipcs_connection_t *c)
 This is called after a connection has been disconnected.
typedef void(* qb_ipcs_connection_destroyed_fn )(qb_ipcs_connection_t *c)
 This is called just before a connection is freed.
typedef int32_t(* qb_ipcs_msg_process_fn )(qb_ipcs_connection_t *c, void *data, size_t size)
 This is the message processing calback.

Enumerations

enum  qb_ipcs_rate_limit {
+  QB_IPCS_RATE_FAST, +QB_IPCS_RATE_NORMAL, +QB_IPCS_RATE_SLOW, +QB_IPCS_RATE_OFF, +
+  QB_IPCS_RATE_OFF_2 +
+ }

Functions

qb_ipcs_service_tqb_ipcs_create (const char *name, int32_t service_id, enum qb_ipc_type type, struct qb_ipcs_service_handlers *handlers)
 Create a new IPC server.
void qb_ipcs_ref (qb_ipcs_service_t *s)
 Increase the reference counter on the service object.
void qb_ipcs_unref (qb_ipcs_service_t *s)
 Decrease the reference counter on the service object.
void qb_ipcs_poll_handlers_set (qb_ipcs_service_t *s, struct qb_ipcs_poll_handlers *handlers)
 Set your poll callbacks.
void qb_ipcs_service_context_set (qb_ipcs_service_t *s, void *context)
 Associate a "user" pointer with this service.
void * qb_ipcs_service_context_get (qb_ipcs_service_t *s)
 Get the context (set previously).
int32_t qb_ipcs_run (qb_ipcs_service_t *s)
 run the new IPC server.
void qb_ipcs_destroy (qb_ipcs_service_t *s)
 Destroy the IPC server.
void qb_ipcs_request_rate_limit (qb_ipcs_service_t *s, enum qb_ipcs_rate_limit rl)
 Limit the incoming request rate.
ssize_t qb_ipcs_response_send (qb_ipcs_connection_t *c, const void *data, size_t size)
 Send a response to a incoming request.
ssize_t qb_ipcs_response_sendv (qb_ipcs_connection_t *c, const struct iovec *iov, size_t iov_len)
 Send a response to a incoming request.
ssize_t qb_ipcs_event_send (qb_ipcs_connection_t *c, const void *data, size_t size)
 Send an asyncronous event message to the client.
ssize_t qb_ipcs_event_sendv (qb_ipcs_connection_t *c, const struct iovec *iov, size_t iov_len)
 Send an asyncronous event message to the client.
void qb_ipcs_connection_ref (qb_ipcs_connection_t *c)
 Increment the connection's reference counter.
void qb_ipcs_connection_unref (qb_ipcs_connection_t *c)
 Decrement the connection's reference counter.
void qb_ipcs_disconnect (qb_ipcs_connection_t *c)
 Disconnect from this client.
int32_t qb_ipcs_service_id_get (qb_ipcs_connection_t *c)
 Get the service id related to this connection's service.
void qb_ipcs_context_set (qb_ipcs_connection_t *c, void *context)
 Associate a "user" pointer with this connection.
void * qb_ipcs_context_get (qb_ipcs_connection_t *c)
 Get the context (set previously).
void * qb_ipcs_connection_service_context_get (qb_ipcs_connection_t *c)
 Get the context previously set on the service backing this connection.
int32_t qb_ipcs_connection_stats_get (qb_ipcs_connection_t *c, struct qb_ipcs_connection_stats *stats, int32_t clear_after_read)
 Get the connection statistics.
struct qb_ipcs_connection_stats_2qb_ipcs_connection_stats_get_2 (qb_ipcs_connection_t *c, int32_t clear_after_read)
 Get (and allocate) the connection statistics.
int32_t qb_ipcs_stats_get (qb_ipcs_service_t *pt, struct qb_ipcs_stats *stats, int32_t clear_after_read)
 Get the service statistics.
qb_ipcs_connection_tqb_ipcs_connection_first_get (qb_ipcs_service_t *pt)
 Get the first connection.
qb_ipcs_connection_tqb_ipcs_connection_next_get (qb_ipcs_service_t *pt, qb_ipcs_connection_t *current)
 Get the next connection.
void qb_ipcs_connection_auth_set (qb_ipcs_connection_t *conn, uid_t uid, gid_t gid, mode_t mode)
 Set the permissions on and shared memory files so that both processes can read and write to them.
int32_t qb_ipcs_connection_get_buffer_size (qb_ipcs_connection_t *conn)
 Retrieve the connection ipc buffer size.
void qb_ipcs_enforce_buffer_size (qb_ipcs_service_t *s, uint32_t max_buf_size)
 Enforce the max buffer size clients must use from the server side.
+

Detailed Description

+

Server IPC API.

+

Typedef Documentation

+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_connection_accept_fn)(qb_ipcs_connection_t *c, uid_t uid, gid_t gid)
+
+
+ +

This callback is to check whether you want to accept a new connection.

+

The type of checks you should do are authentication, service availabilty or process resource constraints.

+
Returns:
0 to accept or -errno to indicate a failure (sent back to the client)
+
Note:
If connection state data is allocated as a result of this callback being invoked, that data must be freed in the destroy callback. Just because the accept callback returns 0, that does not guarantee the create and closed callback functions will follow.
+
+you can call qb_ipcs_connection_auth_set() within this function.
+ +
+
+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_connection_closed_fn)(qb_ipcs_connection_t *c)
+
+
+ +

This is called after a connection has been disconnected.

+
Note:
This callback will only be invoked if the connection is successfully created.
+
+if you return anything but 0 this function will be repeativily called (until 0 is returned).
+ +
+
+ +
+
+ + + + +
typedef void(* qb_ipcs_connection_created_fn)(qb_ipcs_connection_t *c)
+
+
+ +

This is called after a new connection has been created.

+
Note:
A client connection is not considered connected until this callback is invoked.
+ +
+
+ +
+
+ + + + +
typedef void(* qb_ipcs_connection_destroyed_fn)(qb_ipcs_connection_t *c)
+
+
+ +

This is called just before a connection is freed.

+ +
+
+ +
+
+ + + + +
typedef struct qb_ipcs_connection qb_ipcs_connection_t
+
+
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_dispatch_add_fn)(enum qb_loop_priority p, int32_t fd, int32_t events, void *data, qb_ipcs_dispatch_fn_t fn)
+
+
+ +
+
+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_dispatch_del_fn)(int32_t fd)
+
+
+ +
+
+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_dispatch_fn_t)(int32_t fd, int32_t revents, void *data)
+
+
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_dispatch_mod_fn)(enum qb_loop_priority p, int32_t fd, int32_t events, void *data, qb_ipcs_dispatch_fn_t fn)
+
+
+ +
+
+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_job_add_fn)(enum qb_loop_priority p, void *data, qb_loop_job_dispatch_fn dispatch_fn)
+
+
+ +
+
+ +
+
+ + + + +
typedef int32_t(* qb_ipcs_msg_process_fn)(qb_ipcs_connection_t *c, void *data, size_t size)
+
+
+ +

This is the message processing calback.

+

It is called with the message data.

+ +
+
+ +
+
+ + + + +
typedef struct qb_ipcs_service qb_ipcs_service_t
+
+
+
Examples:
ipcserver.c.
+
+
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum qb_ipcs_rate_limit
+
+
+
Enumerator:
+ + + + + +
QB_IPCS_RATE_FAST  +
QB_IPCS_RATE_NORMAL  +
QB_IPCS_RATE_SLOW  +
QB_IPCS_RATE_OFF  +
QB_IPCS_RATE_OFF_2  +
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void qb_ipcs_connection_auth_set (qb_ipcs_connection_t conn,
uid_t  uid,
gid_t  gid,
mode_t  mode 
)
+
+
+ +

Set the permissions on and shared memory files so that both processes can read and write to them.

+
Parameters:
+ + + + + +
conn connection instance
uid the user id to set.
gid the group id to set.
mode the mode to set.
+
+
+
See also:
chmod() chown()
+
Note:
this must be called within the qb_ipcs_connection_accept_fn() callback.
+ +
+
+ +
+
+ + + + + + + + + +
qb_ipcs_connection_t* qb_ipcs_connection_first_get (qb_ipcs_service_t pt ) 
+
+
+ +

Get the first connection.

+
Note:
call qb_ipcs_connection_unref() after using the connection.
+
Parameters:
+ + +
pt service instance
+
+
+
Returns:
first connection
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_ipcs_connection_get_buffer_size (qb_ipcs_connection_t conn ) 
+
+
+ +

Retrieve the connection ipc buffer size.

+

This reflects the largest size msg that can be sent or received.

+
Parameters:
+ + +
conn connection instance
+
+
+
Returns:
msg size in bytes, negative value on error.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
qb_ipcs_connection_t* qb_ipcs_connection_next_get (qb_ipcs_service_t pt,
qb_ipcs_connection_t current 
)
+
+
+ +

Get the next connection.

+
Note:
call qb_ipcs_connection_unref() after using the connection.
+
Parameters:
+ + + +
pt service instance
current current connection
+
+
+
Returns:
next connection
+ +
+
+ +
+
+ + + + + + + + + +
void qb_ipcs_connection_ref (qb_ipcs_connection_t c ) 
+
+
+ +

Increment the connection's reference counter.

+
Parameters:
+ + +
c connection instance
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void* qb_ipcs_connection_service_context_get (qb_ipcs_connection_t c ) 
+
+
+ +

Get the context previously set on the service backing this connection.

+
Parameters:
+ + +
c connection instance
+
+
+
Returns:
the context
+
See also:
qb_ipcs_service_context_set
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_ipcs_connection_stats_get (qb_ipcs_connection_t c,
struct qb_ipcs_connection_stats stats,
int32_t  clear_after_read 
)
+
+
+ +

Get the connection statistics.

+
Deprecated:
from v0.13.0 onwards, use qb_ipcs_connection_stats_get_2
+
Parameters:
+ + + + +
stats (out) the statistics structure
clear_after_read clear stats after copying them into stats
c connection instance
+
+
+
Returns:
0 == ok; -errno to indicate a failure
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
struct qb_ipcs_connection_stats_2* qb_ipcs_connection_stats_get_2 (qb_ipcs_connection_t c,
int32_t  clear_after_read 
) [read]
+
+
+ +

Get (and allocate) the connection statistics.

+
Parameters:
+ + + +
clear_after_read clear stats after copying them into stats
c connection instance
+
+
+
Return values:
+ + + +
NULL if no memory or invalid connection
allocated statistics structure (user must free it).
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void qb_ipcs_connection_unref (qb_ipcs_connection_t c ) 
+
+
+ +

Decrement the connection's reference counter.

+
Parameters:
+ + +
c connection instance
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void* qb_ipcs_context_get (qb_ipcs_connection_t c ) 
+
+
+ +

Get the context (set previously).

+
Parameters:
+ + +
c connection instance
+
+
+
Returns:
the context
+
See also:
qb_ipcs_context_set()
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_ipcs_context_set (qb_ipcs_connection_t c,
void *  context 
)
+
+
+ +

Associate a "user" pointer with this connection.

+
Parameters:
+ + + +
context the point to associate with this connection.
c connection instance
+
+
+
See also:
qb_ipcs_context_get()
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
qb_ipcs_service_t* qb_ipcs_create (const char *  name,
int32_t  service_id,
enum qb_ipc_type  type,
struct qb_ipcs_service_handlers handlers 
)
+
+
+ +

Create a new IPC server.

+
Parameters:
+ + + + + +
name for clients to connect to.
service_id an integer to associate with the service
type transport type.
handlers callbacks.
+
+
+
Returns:
the new service instance.
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_ipcs_destroy (qb_ipcs_service_t s ) 
+
+
+ +

Destroy the IPC server.

+
Parameters:
+ + +
s service instance to destroy
+
+
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_ipcs_disconnect (qb_ipcs_connection_t c ) 
+
+
+ +

Disconnect from this client.

+
Parameters:
+ + +
c connection instance
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_ipcs_enforce_buffer_size (qb_ipcs_service_t s,
uint32_t  max_buf_size 
)
+
+
+ +

Enforce the max buffer size clients must use from the server side.

+
Note:
Setting this will force client connections to use at least max_buf_size bytes as their buffer size. If this value is not set on the server, the clients enforce their own buffer sizes.
+
Parameters:
+ + + +
s ipc server instance
max_buf_size represented in bytes
+
+
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcs_event_send (qb_ipcs_connection_t c,
const void *  data,
size_t  size 
)
+
+
+ +

Send an asyncronous event message to the client.

+
Parameters:
+ + + + +
c connection instance
data the message to send
size the size of the message
+
+
+
Returns:
size sent or -errno for errors
+
Note:
the data must include a qb_ipc_response_header at the top of the message. The client will read the size field to determine how much to recv.
+
+When send returns -EMSGSIZE, this means the msg is too large and will never succeed. To determine the max msg size a client can be sent, use qb_ipcs_connection_get_buffer_size()
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcs_event_sendv (qb_ipcs_connection_t c,
const struct iovec *  iov,
size_t  iov_len 
)
+
+
+ +

Send an asyncronous event message to the client.

+
Parameters:
+ + + + +
c connection instance
iov the iovec struct that points to the message to send
iov_len the number of iovecs.
+
+
+
Returns:
size sent or -errno for errors
+
Note:
the iov[0] must be a qb_ipc_response_header. The client will read the size field to determine how much to recv.
+
+When send returns -EMSGSIZE, this means the msg is too large and will never succeed. To determine the max msg size a client can be sent, use qb_ipcs_connection_get_buffer_size()
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_ipcs_poll_handlers_set (qb_ipcs_service_t s,
struct qb_ipcs_poll_handlers handlers 
)
+
+
+ +

Set your poll callbacks.

+
Parameters:
+ + + +
s service instance
handlers the handlers that you want ipcs to use.
+
+
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_ipcs_ref (qb_ipcs_service_t s ) 
+
+
+ +

Increase the reference counter on the service object.

+
Parameters:
+ + +
s service instance
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_ipcs_request_rate_limit (qb_ipcs_service_t s,
enum qb_ipcs_rate_limit  rl 
)
+
+
+ +

Limit the incoming request rate.

+
Parameters:
+ + + +
s service instance
rl the new rate
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcs_response_send (qb_ipcs_connection_t c,
const void *  data,
size_t  size 
)
+
+
+ +

Send a response to a incoming request.

+
Parameters:
+ + + + +
c connection instance
data the message to send
size the size of the message
+
+
+
Returns:
size sent or -errno for errors
+
Note:
the data must include a qb_ipc_response_header at the top of the message. The client will read the size field to determine how much to recv.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_ipcs_response_sendv (qb_ipcs_connection_t c,
const struct iovec *  iov,
size_t  iov_len 
)
+
+
+ +

Send a response to a incoming request.

+
Parameters:
+ + + + +
c connection instance
iov the iovec struct that points to the message to send
iov_len the number of iovecs.
+
+
+
Returns:
size sent or -errno for errors
+
Note:
the iov[0] must be a qb_ipc_response_header. The client will read the size field to determine how much to recv.
+
+When send returns -EMSGSIZE, this means the msg is too large and will never succeed. To determine the max msg size a client can be sent, use qb_ipcs_connection_get_buffer_size()
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
int32_t qb_ipcs_run (qb_ipcs_service_t s ) 
+
+
+ +

run the new IPC server.

+
Parameters:
+ + +
s service instance
+
+
+
Returns:
0 == ok; -errno to indicate a failure. Service is destroyed on failure.
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
void* qb_ipcs_service_context_get (qb_ipcs_service_t s ) 
+
+
+ +

Get the context (set previously).

+
Parameters:
+ + +
s service instance
+
+
+
Returns:
the context
+
See also:
qb_ipcs_service_context_set()
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_ipcs_service_context_set (qb_ipcs_service_t s,
void *  context 
)
+
+
+ +

Associate a "user" pointer with this service.

+
Parameters:
+ + + +
s service instance
context the pointer to associate with this service.
+
+
+
See also:
qb_ipcs_service_context_get()
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_ipcs_service_id_get (qb_ipcs_connection_t c ) 
+
+
+ +

Get the service id related to this connection's service.

+

(as passed into qb_ipcs_create()

+
Returns:
service id.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_ipcs_stats_get (qb_ipcs_service_t pt,
struct qb_ipcs_stats stats,
int32_t  clear_after_read 
)
+
+
+ +

Get the service statistics.

+
Parameters:
+ + + + +
stats (out) the statistics structure
clear_after_read clear stats after copying them into stats
pt service instance
+
+
+
Returns:
0 == ok; -errno to indicate a failure
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_ipcs_unref (qb_ipcs_service_t s ) 
+
+
+ +

Decrease the reference counter on the service object.

+
Parameters:
+ + +
s service instance
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbipcs_8h__incl.map b/1.0rc3/doxygen/qbipcs_8h__incl.map new file mode 100644 index 000000000..f83e8488b --- /dev/null +++ b/1.0rc3/doxygen/qbipcs_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/1.0rc3/doxygen/qbipcs_8h__incl.md5 b/1.0rc3/doxygen/qbipcs_8h__incl.md5 new file mode 100644 index 000000000..bfe966236 --- /dev/null +++ b/1.0rc3/doxygen/qbipcs_8h__incl.md5 @@ -0,0 +1 @@ +54dd7dbcc7c6ebb931ad4b3c75144a24 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbipcs_8h__incl.png b/1.0rc3/doxygen/qbipcs_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..31e9fe4d86bee804e11ed45874dc213e67ef9484 GIT binary patch literal 30899 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 D0!o9Z literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qblist_8h.html b/1.0rc3/doxygen/qblist_8h.html new file mode 100644 index 000000000..39a63fff5 --- /dev/null +++ b/1.0rc3/doxygen/qblist_8h.html @@ -0,0 +1,922 @@ + + + + + +libqb: qblist.h File Reference + + + + + + + + + +
+

qblist.h File Reference

+

This is a kernel style list implementation. +More...

+#include <stdint.h>
+#include <qb/qbdefs.h>
+
+Include dependency graph for qblist.h:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  qb_list_head

Defines

#define QB_LIST_DECLARE(name)   struct qb_list_head name = { &(name), &(name) }
 Declare and initialize a list head.
#define QB_INIT_LIST_HEAD(ptr)
#define qb_list_entry(ptr, type, member)   ((type *)((char *)(ptr)-(char*)(&((type *)0)->member)))
 Get the struct for this entry.
#define qb_list_first_entry(ptr, type, member)   qb_list_entry((ptr)->next, type, member)
 Get the first element from a list.
#define qb_list_for_each(pos, head)   for (pos = (head)->next; pos != (head); pos = pos->next)
 Iterate over a list.
#define qb_list_for_each_reverse(pos, head)   for (pos = (head)->prev; pos != (head); pos = pos->prev)
 Iterate over a list backwards.
#define qb_list_for_each_safe(pos, n, head)
 Iterate over a list safe against removal of list entry.
#define qb_list_for_each_entry(pos, head, member)
 Iterate over list of given type.
#define qb_list_for_each_entry_reverse(pos, head, member)
 Iterate backwards over list of given type.
#define qb_list_for_each_entry_safe(pos, n, head, member)
 Iterate over list of given type safe against removal of list entry.
#define qb_list_for_each_entry_safe_reverse(pos, n, head, member)
 Iterate backwards over list safe against removal.
#define qb_list_for_each_entry_from(pos, head, member)
 Iterate over list of given type from the current point.

Functions

static void qb_list_init (struct qb_list_head *head)
 Initialize the list entry.
static void qb_list_add (struct qb_list_head *element, struct qb_list_head *head)
 Add this element to the list.
static void qb_list_add_tail (struct qb_list_head *element, struct qb_list_head *head)
 Add to the list (but at the end of the list).
static void qb_list_del (struct qb_list_head *_remove)
 Delete an entry from the list.
static void qb_list_replace (struct qb_list_head *old, struct qb_list_head *new)
 Replace old entry by new one.
static int qb_list_is_last (const struct qb_list_head *list, const struct qb_list_head *head)
 Tests whether list is the last entry in list head.
static int32_t qb_list_empty (const struct qb_list_head *head)
 A quick test to see if the list is empty (pointing to it's self).
static void qb_list_splice (struct qb_list_head *list, struct qb_list_head *head)
 Join two lists.
static void qb_list_splice_tail (struct qb_list_head *list, struct qb_list_head *head)
 Join two lists, each list being a queue.
static int32_t qb_list_length (struct qb_list_head *head)
 Count the number of items in the list.
+

Detailed Description

+

This is a kernel style list implementation.

+
Author:
Steven Dake <sdake@redhat.com>
+

Define Documentation

+ +
+
+ + + + + + + + + +
#define QB_INIT_LIST_HEAD(ptr  ) 
+
+
+Value:
do { \
+        (ptr)->next = (ptr); (ptr)->prev = (ptr); \
+} while (0)
+
+
+
+ +
+
+ + + + + + + + + +
#define QB_LIST_DECLARE(name  )    struct qb_list_head name = { &(name), &(name) }
+
+
+ +

Declare and initialize a list head.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_list_entry(ptr,
type,
member  )    ((type *)((char *)(ptr)-(char*)(&((type *)0)->member)))
+
+
+ +

Get the struct for this entry.

+
Parameters:
+ + + + +
ptr,: the &struct list_head pointer.
type,: the type of the struct this is embedded in.
member,: the name of the list_struct within the struct.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_list_first_entry(ptr,
type,
member  )    qb_list_entry((ptr)->next, type, member)
+
+
+ +

Get the first element from a list.

+
Parameters:
+ + + + +
ptr,: the &struct list_head pointer.
type,: the type of the struct this is embedded in.
member,: the name of the list_struct within the struct.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_list_for_each(pos,
head  )    for (pos = (head)->next; pos != (head); pos = pos->next)
+
+
+ +

Iterate over a list.

+
Parameters:
+ + + +
pos,: the &struct list_head to use as a loop counter.
head,: the head for your list.
+
+
+ +

Referenced by qb_list_length().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_list_for_each_entry(pos,
head,
member  ) 
+
+
+Value:
for (pos = qb_list_entry((head)->next, typeof(*pos), member);   \
+             &pos->member != (head);                                    \
+             pos = qb_list_entry(pos->member.next, typeof(*pos), member))
+
+

Iterate over list of given type.

+
Parameters:
+ + + + +
pos,: the type * to use as a loop counter.
head,: the head for your list.
member,: the name of the list_struct within the struct.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_list_for_each_entry_from(pos,
head,
member  ) 
+
+
+Value:
for (; &pos->member != (head);                                          \
+             pos = qb_list_entry(pos->member.next, typeof(*pos), member))
+
+

Iterate over list of given type from the current point.

+
Parameters:
+ + + + +
pos,: the type * to use as a loop cursor.
head,: the head for your list.
member,: the name of the list_struct within the struct.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_list_for_each_entry_reverse(pos,
head,
member  ) 
+
+
+Value:
for (pos = qb_list_entry((head)->prev, typeof(*pos), member);   \
+             &pos->member != (head);                                    \
+             pos = qb_list_entry(pos->member.prev, typeof(*pos), member))
+
+

Iterate backwards over list of given type.

+
Parameters:
+ + + + +
pos,: the type to use as a loop counter.
head,: the head for your list.
member,: the name of the list_struct within the struct.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
#define qb_list_for_each_entry_safe(pos,
n,
head,
member  ) 
+
+
+Value:
for (pos = qb_list_entry((head)->next, typeof(*pos), member),           \
+                n = qb_list_entry(pos->member.next, typeof(*pos), member);      \
+             &pos->member != (head);                                            \
+             pos = n, n = qb_list_entry(n->member.next, typeof(*n), member))
+
+

Iterate over list of given type safe against removal of list entry.

+
Parameters:
+ + + + + +
pos,: the type * to use as a loop cursor.
n,: another type * to use as temporary storage
head,: the head for your list.
member,: the name of the list_struct within the struct.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
#define qb_list_for_each_entry_safe_reverse(pos,
n,
head,
member  ) 
+
+
+Value:
for (pos = qb_list_entry((head)->prev, typeof(*pos), member),           \
+                n = qb_list_entry(pos->member.prev, typeof(*pos), member);      \
+             &pos->member != (head);                                            \
+             pos = n, n = qb_list_entry(n->member.prev, typeof(*n), member))
+
+

Iterate backwards over list safe against removal.

+
Parameters:
+ + + + + +
pos,: the type * to use as a loop cursor.
n,: another type * to use as temporary storage
head,: the head for your list.
member,: the name of the list_struct within the struct.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + +
#define qb_list_for_each_reverse(pos,
head  )    for (pos = (head)->prev; pos != (head); pos = pos->prev)
+
+
+ +

Iterate over a list backwards.

+
Parameters:
+ + + +
pos,: the &struct list_head to use as a loop counter.
head,: the head for your list.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_list_for_each_safe(pos,
n,
head  ) 
+
+
+Value:
for (pos = (head)->next, n = pos->next; pos != (head); \
+                pos = n, n = pos->next)
+
+

Iterate over a list safe against removal of list entry.

+
Parameters:
+ + + + +
pos,: the &struct list_head to use as a loop counter.
n,: another &struct list_head to use as temporary storage
head,: the head for your list.
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
static void qb_list_add (struct qb_list_head element,
struct qb_list_head head 
) [inline, static]
+
+
+ +

Add this element to the list.

+
Parameters:
+ + + +
element the new element to insert.
head pointer to the list head
+
+
+ +

References qb_list_head::next, and qb_list_head::prev.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
static void qb_list_add_tail (struct qb_list_head element,
struct qb_list_head head 
) [inline, static]
+
+
+ +

Add to the list (but at the end of the list).

+
Parameters:
+ + + +
element pointer to the element to add
head pointer to the list head
+
+
+
See also:
qb_list_add()
+ +

References qb_list_head::next, and qb_list_head::prev.

+ +
+
+ +
+
+ + + + + + + + + +
static void qb_list_del (struct qb_list_head _remove )  [inline, static]
+
+
+ +

Delete an entry from the list.

+
Parameters:
+ + +
_remove the list item to remove
+
+
+ +

References qb_list_head::next, and qb_list_head::prev.

+ +
+
+ +
+
+ + + + + + + + + +
static int32_t qb_list_empty (const struct qb_list_head head )  [inline, static]
+
+
+ +

A quick test to see if the list is empty (pointing to it's self).

+
Parameters:
+ + +
head pointer to the list head
+
+
+
Returns:
boolean true/false
+ +

References qb_list_head::next.

+ +

Referenced by qb_list_splice(), and qb_list_splice_tail().

+ +
+
+ +
+
+ + + + + + + + + +
static void qb_list_init (struct qb_list_head head )  [inline, static]
+
+
+ +

Initialize the list entry.

+

Points next and prev pointers to head.

+
Parameters:
+ + +
head pointer to the list head
+
+
+ +

References qb_list_head::next, and qb_list_head::prev.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
static int qb_list_is_last (const struct qb_list_head list,
const struct qb_list_head head 
) [inline, static]
+
+
+ +

Tests whether list is the last entry in list head.

+
Parameters:
+ + + +
list,: the entry to test
head,: the head of the list
+
+
+
Returns:
boolean true/false
+ +

References qb_list_head::next.

+ +
+
+ +
+
+ + + + + + + + + +
static int32_t qb_list_length (struct qb_list_head head )  [inline, static]
+
+
+ +

Count the number of items in the list.

+
Parameters:
+ + +
head,: the head for your list.
+
+
+
Returns:
length of the list.
+ +

References qb_list_for_each.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
static void qb_list_replace (struct qb_list_head old,
struct qb_list_head new 
) [inline, static]
+
+
+ +

Replace old entry by new one.

+
Parameters:
+ + + +
old,: the element to be replaced
new,: the new element to insert
+
+
+ +

References qb_list_head::next, and qb_list_head::prev.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
static void qb_list_splice (struct qb_list_head list,
struct qb_list_head head 
) [inline, static]
+
+
+ +

Join two lists.

+
Parameters:
+ + + +
list the new list to add.
head the place to add it in the first list.
+
+
+
Note:
The "list" is reinitialised
+ +

References qb_list_head::next, qb_list_head::prev, and qb_list_empty().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
static void qb_list_splice_tail (struct qb_list_head list,
struct qb_list_head head 
) [inline, static]
+
+
+ +

Join two lists, each list being a queue.

+
Parameters:
+ + + +
list,: the new list to add.
head,: the place to add it in the first list.
+
+
+ +

References qb_list_head::next, qb_list_head::prev, and qb_list_empty().

+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qblist_8h__incl.map b/1.0rc3/doxygen/qblist_8h__incl.map new file mode 100644 index 000000000..670622995 --- /dev/null +++ b/1.0rc3/doxygen/qblist_8h__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/1.0rc3/doxygen/qblist_8h__incl.md5 b/1.0rc3/doxygen/qblist_8h__incl.md5 new file mode 100644 index 000000000..a935175bc --- /dev/null +++ b/1.0rc3/doxygen/qblist_8h__incl.md5 @@ -0,0 +1 @@ +4554d029e319ff90072ca2325006b70d \ No newline at end of file diff --git a/1.0rc3/doxygen/qblist_8h__incl.png b/1.0rc3/doxygen/qblist_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..26f95d0e6b1335e59d27b78ce5682ea159041f12 GIT binary patch literal 4993 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 literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qblog_8h.html b/1.0rc3/doxygen/qblog_8h.html new file mode 100644 index 000000000..af102b45d --- /dev/null +++ b/1.0rc3/doxygen/qblog_8h.html @@ -0,0 +1,1953 @@ + + + + + +libqb: qblog.h File Reference + + + + + + + + + +
+

qblog.h File Reference

+

The logging API provides four main parts (basics, filtering, threading & blackbox). +More...

+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <syslog.h>
+#include <string.h>
+#include <qb/qbutil.h>
+#include <qb/qbconfig.h>
+
+Include dependency graph for qblog.h:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  qb_log_callsite
 An instance of this structure is created in a special ELF section at every dynamic debug callsite. More...
union  qb_log_ctl2_arg_t

Defines

#define LOG_TRACE   (LOG_DEBUG + 1)
#define QB_LOG_MAX_LEN   512
#define QB_LOG_STRERROR_MAX_LEN   128
#define QB_LOG_INIT_DATA(name)
#define QB_LOG_TAG_LIBQB_MSG_BIT   31
#define QB_LOG_TAG_LIBQB_MSG   (1 << QB_LOG_TAG_LIBQB_MSG_BIT)
#define qb_logt(priority, tags, fmt, args...)
 This is the function to generate a log message if you want to manually add tags.
#define qb_log(priority, fmt, args...)   qb_logt(priority, 0, fmt, ##args)
 This is the main function to generate a log message.
#define QB_XC   '\a'
#define QB_XS   "\a"
#define qb_perror(priority, fmt, args...)
 This is similar to perror except it goes into the logging system.
#define qb_enter()   qb_log(LOG_TRACE, "ENTERING %s()", __func__)
#define qb_leave()   qb_log(LOG_TRACE, "LEAVING %s()", __func__)
#define QB_LOG_CTL2_I32(a)   ((qb_log_ctl2_arg_t) { .i32 = (a) })
#define QB_LOG_CTL2_S(a)   ((qb_log_ctl2_arg_t) { .s = (a) })

Typedefs

typedef const char *(* qb_log_tags_stringify_fn )(uint32_t tags)
typedef void(* qb_log_filter_fn )(struct qb_log_callsite *cs)
typedef void(* qb_log_logger_fn )(int32_t t, struct qb_log_callsite *cs, time_t timestamp, const char *msg)
typedef void(* qb_log_vlogger_fn )(int32_t t, struct qb_log_callsite *cs, time_t timestamp, va_list ap)
typedef void(* qb_log_close_fn )(int32_t t)
typedef void(* qb_log_reload_fn )(int32_t t)

Enumerations

enum  qb_log_target_slot {
+  QB_LOG_TARGET_START, +QB_LOG_TARGET_STATIC_START = QB_LOG_TARGET_START, +QB_LOG_SYSLOG = QB_LOG_TARGET_STATIC_START, +QB_LOG_STDERR, +
+  QB_LOG_BLACKBOX, +QB_LOG_STDOUT, +QB_LOG_TARGET_STATIC_MAX, +QB_LOG_TARGET_STATIC_END = QB_LOG_TARGET_STATIC_MAX - 1, +
+  QB_LOG_TARGET_DYNAMIC_START = QB_LOG_TARGET_STATIC_MAX, +QB_LOG_TARGET_MAX = 32, +QB_LOG_TARGET_DYNAMIC_END = QB_LOG_TARGET_MAX - 1, +QB_LOG_TARGET_END = QB_LOG_TARGET_DYNAMIC_END +
+ }
enum  qb_log_target_state { QB_LOG_STATE_UNUSED = 1, +QB_LOG_STATE_DISABLED = 2, +QB_LOG_STATE_ENABLED = 3 + }
enum  qb_log_conf {
+  QB_LOG_CONF_ENABLED, +QB_LOG_CONF_FACILITY, +QB_LOG_CONF_DEBUG, +QB_LOG_CONF_SIZE, +
+  QB_LOG_CONF_THREADED, +QB_LOG_CONF_PRIORITY_BUMP, +QB_LOG_CONF_STATE_GET, +QB_LOG_CONF_FILE_SYNC, +
+  QB_LOG_CONF_EXTENDED, +QB_LOG_CONF_IDENT +
+ }
enum  qb_log_filter_type {
+  QB_LOG_FILTER_FILE, +QB_LOG_FILTER_FUNCTION, +QB_LOG_FILTER_FORMAT, +QB_LOG_FILTER_FILE_REGEX, +
+  QB_LOG_FILTER_FUNCTION_REGEX, +QB_LOG_FILTER_FORMAT_REGEX +
+ }
enum  qb_log_filter_conf {
+  QB_LOG_FILTER_ADD, +QB_LOG_FILTER_REMOVE, +QB_LOG_FILTER_CLEAR_ALL, +QB_LOG_TAG_SET, +
+  QB_LOG_TAG_CLEAR, +QB_LOG_TAG_CLEAR_ALL +
+ }

Functions

void qb_log_real_ (struct qb_log_callsite *cs,...)
 Internal function: use qb_log() or qb_logt().
void qb_log_real_va_ (struct qb_log_callsite *cs, va_list ap)
void qb_log_from_external_source (const char *function, const char *filename, const char *format, uint8_t priority, uint32_t lineno, uint32_t tags,...) __attribute__((format(printf
 This function is to import logs from other code (like libraries) that provide a callback with their logs.
void struct qb_log_callsiteqb_log_callsite_get (const char *function, const char *filename, const char *format, uint8_t priority, uint32_t lineno, uint32_t tags)
 Get or create a callsite at the given position.
void qb_log_from_external_source_va (const char *function, const char *filename, const char *format, uint8_t priority, uint32_t lineno, uint32_t tags, va_list ap) __attribute__((format(printf
void qb_log_init (const char *name, int32_t facility, uint8_t priority)
 Init the logging system.
void qb_log_fini (void)
 Logging system finalization function.
int32_t qb_log_callsites_register (struct qb_log_callsite *_start, struct qb_log_callsite *_stop)
 If you are using dynamically loadable modules via dlopen() and you load them after qb_log_init() then after you load the module you will need to do the following to get the filters to work in that module:.
void qb_log_callsites_dump (void)
 Dump the callsite info to stdout.
int32_t qb_log_ctl (int32_t target, enum qb_log_conf conf_type, int32_t arg)
 Main logging control function.
int32_t qb_log_ctl2 (int32_t target, enum qb_log_conf conf_type, qb_log_ctl2_arg_t arg)
 Extension of main logging control function accepting also strings.
int32_t qb_log_filter_ctl (int32_t value, enum qb_log_filter_conf c, enum qb_log_filter_type type, const char *text, uint8_t low_priority)
 This allows you modify the 'tags' and 'targets' callsite fields at runtime.
int32_t qb_log_filter_ctl2 (int32_t value, enum qb_log_filter_conf c, enum qb_log_filter_type type, const char *text, uint8_t high_priority, uint8_t low_priority)
 This extends qb_log_filter_ctl() by been able to provide a high_priority.
int32_t qb_log_filter_fn_set (qb_log_filter_fn fn)
 Instead of using the qb_log_filter_ctl() functions you can apply the filters manually by defining a callback and setting the targets field using qb_bit_set() and qb_bit_clear() like the following below:.
void qb_log_tags_stringify_fn_set (qb_log_tags_stringify_fn fn)
 Set the callback to map the 'tags' bit map to a string.
void qb_log_format_set (int32_t t, const char *format)
 Set the format specifiers.
int32_t qb_log_file_open (const char *filename)
 Open a log file.
void qb_log_file_close (int32_t t)
 Close a log file and release is resources.
int32_t qb_log_thread_priority_set (int32_t policy, int32_t priority)
 When using threaded logging set the pthread policy and priority.
int32_t qb_log_thread_start (void)
 Start the logging pthread.
ssize_t qb_log_blackbox_write_to_file (const char *filename)
 Write the blackbox to file.
void qb_log_blackbox_print_from_file (const char *filename)
 Read the blackbox for file and print it out.
int32_t qb_log_custom_open (qb_log_logger_fn log_fn, qb_log_close_fn close_fn, qb_log_reload_fn reload_fn, void *user_data)
 Open a custom log target.
void qb_log_custom_close (int32_t t)
 Close a custom log target and release is resources.
void * qb_log_target_user_data_get (int32_t t)
 Retrieve the user data set by either qb_log_custom_open or qb_log_target_user_data_set.
int32_t qb_log_target_user_data_set (int32_t t, void *user_data)
 Associate user data with this log target.
void qb_log_target_format (int32_t target, struct qb_log_callsite *cs, time_t timestamp, const char *formatted_message, char *output_buffer)
 format the callsite and timestamp info according to the format set using qb_log_format_set() It is intended to be used from your custom logger function.
int32_t qb_log_facility2int (const char *fname)
 Convert string "auth" to equivalent number "LOG_AUTH" etc.
const char * qb_log_facility2str (int32_t fnum)
 Convert number "LOG_AUTH" to equivalent string "auth" etc.

Variables

struct qb_log_callsite aligned
 An instance of this structure is created in a special ELF section at every dynamic debug callsite.
struct qb_log_callsite __start___verbose []
struct qb_log_callsite __stop___verbose []
+

Detailed Description

+

The logging API provides four main parts (basics, filtering, threading & blackbox).

+

The idea behind this logging system is not to be prescriptive but to provide a set of tools to help the developer achieve what they want quickly and easily.

+
Basic logging API.
Call qb_log() to generate a log message. Then to write the message somewhere meaningful call qb_log_ctl() to configure the targets.
+

Simplest possible use:

+
 main() {
+        qb_log_init("simple-log", LOG_DAEMON, LOG_INFO);
+        // ...
+        qb_log(LOG_WARNING, "watch out");
+        // ...
+        qb_log_fini();
+ }
+
Configuring log targets.
A log target can be syslog, stderr, the blackbox, stdout, or a text file. By default only syslog is enabled.
+

To enable a target do the following:

+

syslog, stderr, the blackbox, and stdout are static (they don't need to be created, just enabled or disabled). However you can open multiple logfiles (QB_LOG_TARGET_MAX - QB_LOG_TARGET_STATIC_MAX). To do this, use the following code:

+
        mytarget = qb_log_file_open("/var/log/mylogfile");
+        qb_log_ctl(mytarget, QB_LOG_CONF_ENABLED, QB_TRUE);
+

Once your targets are enabled/opened you can configure them as follows: Configure the size of blackbox

+

Make logging to file threaded:

+

To workaround your syslog daemon filtering all messages > LOG_INFO

+
        qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_PRIORITY_BUMP,
+                   LOG_INFO - LOG_DEBUG);
+

To ensure all logs to file targets are fsync'ed (default QB_FALSE)

+
Filtering messages.
To have more power over what log messages go to which target you can apply filters to the targets. What happens is the desired callsites have the correct bit set. Then when the log message is generated it gets sent to the targets based on which bit is set in the callsite's "target" bitmap. Messages can be filtered based on the:
    +
  1. filename + priority
  2. +
  3. function name + priority
  4. +
  5. format string + priority
  6. +
+
+

So to make all logs from evil_function() go to stderr, do the following:

+

So to make all logs from totem* (with a priority <= LOG_INFO) go to stderr, do the following:

+

So to make all logs with the substring "ringbuffer" go to stderr, do the following:

+
Thread safe non-blocking logging.
Logging is only thread safe when threaded logging is in use. If you plan on logging from multiple threads, you must initialize libqb's logger thread and use qg_log_filter_ctl to set the QB_LOG_CONF_THREADED flag on all the logging targets in use.
+

To achieve non-blocking logging, so that any calls to write() or syslog() will not hold up your program, you can use threaded logging as well.

+

Threaded logging use:

+
 main() {
+        qb_log_init("simple-log", LOG_DAEMON, LOG_INFO);
+        qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_THREADED, QB_TRUE);
+        // ...
+        daemonize();
+        // call this after you fork()
+        qb_log_thread_start();
+        // ...
+        qb_log(LOG_WARNING, "watch out");
+        // ...
+        qb_log_fini();
+ }
+
A blackbox for in-field diagnosis.
This stores log messages in a ringbuffer so they can be written to file if the program crashes (you will need to catch SIGSEGV). These can then be easily printed out later.
+
Note:
the blackbox is not enabled by default.
+

Blackbox usage:

+
 static void sigsegv_handler(int sig)
+ {
+        (void)signal (SIGSEGV, SIG_DFL);
+        qb_log_blackbox_write_to_file("simple-log.fdata");
+        qb_log_fini();
+        raise(SIGSEGV);
+ }
+
+ main() {
+
+        signal(SIGSEGV, sigsegv_handler);
+
+        qb_log_init("simple-log", LOG_DAEMON, LOG_INFO);
+        qb_log_filter_ctl(QB_LOG_BLACKBOX, QB_LOG_FILTER_ADD,
+                          QB_LOG_FILTER_FILE, "*", LOG_DEBUG);
+        qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_SIZE, 1024*10);
+        qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_TRUE);
+        // ...
+        qb_log(LOG_WARNING, "watch out");
+        // ...
+        qb_log_fini();
+ }
+
Tagging messages.
You can tag messages using the second argument to qb_logt() or by using qb_log_filter_ctl(). This can be used to add feature or sub-system information to the logs.
+
 const char* my_tags_stringify(uint32_t tags) {
+        if (qb_bit_is_set(tags, QB_LOG_TAG_LIBQB_MSG_BIT) {
+                return "libqb";
+        } else if (tags == 3) {
+                return "three";
+        } else {
+                return "MAIN";
+        }
+ }
+ main() {
+        // ...
+        qb_log_tags_stringify_fn_set(my_tags_stringify);
+        qb_log_format_set(QB_LOG_STDERR, "[%5g] %p %b");
+        // ...
+        qb_logt(LOG_INFO, 3, "hello");
+        qb_logt(LOG_INFO, 0, "hello");
+ }
+

The code above will produce:

+
 [libqb] some message
+ [three] info hello
+ [MAIN ] info hello
+

Define Documentation

+ +
+
+ + + + +
#define LOG_TRACE   (LOG_DEBUG + 1)
+
+
+
Examples:
ipcclient.c, ipcserver.c, and simplelog.c.
+
+
+
+ +
+
+ + + + +  + + + + +
#define qb_enter( )    qb_log(LOG_TRACE, "ENTERING %s()", __func__)
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + +  + + + + +
#define qb_leave( )    qb_log(LOG_TRACE, "LEAVING %s()", __func__)
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_log(priority,
fmt,
args...  )    qb_logt(priority, 0, fmt, ##args)
+
+
+ +

This is the main function to generate a log message.

+
Parameters:
+ + + + +
priority this takes syslog priorities.
fmt usual printf style format specifiers
args usual printf style args
+
+
+
Examples:
ipcserver.c, and simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + +
#define QB_LOG_CTL2_I32( )    ((qb_log_ctl2_arg_t) { .i32 = (a) })
+
+
+ +
+
+ +
+
+ + + + + + + + + +
#define QB_LOG_CTL2_S( )    ((qb_log_ctl2_arg_t) { .s = (a) })
+
+
+ +
+
+ +
+
+ + + + + + + + + +
#define QB_LOG_INIT_DATA(name  ) 
+
+
+Value:
void name(void);                                                        \
+    void name(void) { if (__start___verbose != __stop___verbose) {assert(1);} } \
+    void __attribute__ ((constructor)) name(void);
+
+
+
+ +
+
+ + + + +
#define QB_LOG_MAX_LEN   512
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + +
#define QB_LOG_STRERROR_MAX_LEN   128
+
+
+ +
+
+ +
+
+ + + + +
#define QB_LOG_TAG_LIBQB_MSG   (1 << QB_LOG_TAG_LIBQB_MSG_BIT)
+
+
+ +
+
+ +
+
+ + + + +
#define QB_LOG_TAG_LIBQB_MSG_BIT   31
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
#define qb_logt(priority,
tags,
fmt,
args...  ) 
+
+
+Value:
do {                    \
+        static struct qb_log_callsite descriptor                        \
+        __attribute__((section("__verbose"), aligned(8))) =             \
+        { __func__, __FILE__, fmt, priority, __LINE__, 0, tags };       \
+        qb_log_real_(&descriptor, ##args);                              \
+    } while(0)
+
+

This is the function to generate a log message if you want to manually add tags.

+
Parameters:
+ + + + + +
priority this takes syslog priorities.
tags this is a uint32_t that you can use with qb_log_tags_stringify_fn_set() to "tag" a log message with a feature or sub-system then you can use "%g" in the format specifer to print it out.
fmt usual printf style format specifiers
args usual printf style args
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + +
#define qb_perror(priority,
fmt,
args...  ) 
+
+
+Value:
do {                            \
+        char _perr_buf_[QB_LOG_STRERROR_MAX_LEN];                       \
+        const char *_perr_str_ = qb_strerror_r(errno, _perr_buf_, sizeof(_perr_buf_));  \
+        qb_logt(priority, 0, fmt ": %s (%d)", ##args, _perr_str_, errno); \
+    } while(0)
+
+

This is similar to perror except it goes into the logging system.

+
Parameters:
+ + + + +
priority this takes syslog priorities.
fmt usual printf style format specifiers
args usual printf style args
+
+
+
Note:
Because qb_perror() adds the system error message and error number onto the end of the given fmt, that information will become extended information if QB_XS is used inside fmt and will not show up in any logs that strip extended information.
+
Examples:
ipcserver.c, and simplelog.c.
+
+
+
+ +
+
+ + + + +
#define QB_XC   '\a'
+
+
+ +
+
+ +
+
+ + + + +
#define QB_XS   "\a"
+
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* qb_log_close_fn)(int32_t t)
+
+
+ +
+
+ +
+
+ + + + +
typedef void(* qb_log_filter_fn)(struct qb_log_callsite *cs)
+
+
+ +
+
+ +
+
+ + + + +
typedef void(* qb_log_logger_fn)(int32_t t, struct qb_log_callsite *cs, time_t timestamp, const char *msg)
+
+
+ +
+
+ +
+
+ + + + +
typedef void(* qb_log_reload_fn)(int32_t t)
+
+
+ +
+
+ +
+
+ + + + +
typedef const char*(* qb_log_tags_stringify_fn)(uint32_t tags)
+
+
+ +
+
+ +
+
+ + + + +
typedef void(* qb_log_vlogger_fn)(int32_t t, struct qb_log_callsite *cs, time_t timestamp, va_list ap)
+
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum qb_log_conf
+
+
+
Enumerator:
+ + + + + + + + + + +
QB_LOG_CONF_ENABLED  +
QB_LOG_CONF_FACILITY  +
QB_LOG_CONF_DEBUG  +
QB_LOG_CONF_SIZE  +
QB_LOG_CONF_THREADED  +
QB_LOG_CONF_PRIORITY_BUMP  +
QB_LOG_CONF_STATE_GET  +
QB_LOG_CONF_FILE_SYNC  +
QB_LOG_CONF_EXTENDED  +
QB_LOG_CONF_IDENT  +
+
+
+ +
+
+ +
+
+ + + + +
enum qb_log_filter_conf
+
+
+
Enumerator:
+ + + + + + +
QB_LOG_FILTER_ADD  +
QB_LOG_FILTER_REMOVE  +
QB_LOG_FILTER_CLEAR_ALL  +
QB_LOG_TAG_SET  +
QB_LOG_TAG_CLEAR  +
QB_LOG_TAG_CLEAR_ALL  +
+
+
+ +
+
+ +
+
+ + + + +
enum qb_log_filter_type
+
+
+
Enumerator:
+ + + + + + +
QB_LOG_FILTER_FILE  +
QB_LOG_FILTER_FUNCTION  +
QB_LOG_FILTER_FORMAT  +
QB_LOG_FILTER_FILE_REGEX  +
QB_LOG_FILTER_FUNCTION_REGEX  +
QB_LOG_FILTER_FORMAT_REGEX  +
+
+
+ +
+
+ +
+
+ + + + +
enum qb_log_target_slot
+
+
+
Enumerator:
+ + + + + + + + + + + + +
QB_LOG_TARGET_START  +
QB_LOG_TARGET_STATIC_START  +
QB_LOG_SYSLOG  +
QB_LOG_STDERR  +
QB_LOG_BLACKBOX  +
QB_LOG_STDOUT  +
QB_LOG_TARGET_STATIC_MAX  +
QB_LOG_TARGET_STATIC_END  +
QB_LOG_TARGET_DYNAMIC_START  +
QB_LOG_TARGET_MAX  +
QB_LOG_TARGET_DYNAMIC_END  +
QB_LOG_TARGET_END  +
+
+
+ +
+
+ +
+
+ + + + +
enum qb_log_target_state
+
+
+
Enumerator:
+ + + +
QB_LOG_STATE_UNUSED  +
QB_LOG_STATE_DISABLED  +
QB_LOG_STATE_ENABLED  +
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + +
void qb_log_blackbox_print_from_file (const char *  filename ) 
+
+
+ +

Read the blackbox for file and print it out.

+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + +
ssize_t qb_log_blackbox_write_to_file (const char *  filename ) 
+
+
+ +

Write the blackbox to file.

+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void struct qb_log_callsite* qb_log_callsite_get (const char *  function,
const char *  filename,
const char *  format,
uint8_t  priority,
uint32_t  lineno,
uint32_t  tags 
) [read]
+
+
+ +

Get or create a callsite at the given position.

+

The result can then be passed into qb_log_real_()

+
Parameters:
+ + + + + + + +
function originating function name
filename originating filename
format format string
priority this takes syslog priorities.
lineno file line number
tags the tag
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void qb_log_callsites_dump (void  ) 
+
+
+ +

Dump the callsite info to stdout.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_log_callsites_register (struct qb_log_callsite _start,
struct qb_log_callsite _stop 
)
+
+
+ +

If you are using dynamically loadable modules via dlopen() and you load them after qb_log_init() then after you load the module you will need to do the following to get the filters to work in that module:.

+
        _start = dlsym (dl_handle, "__start___verbose");
+        _stop = dlsym (dl_handle, "__stop___verbose");
+        qb_log_callsites_register(_start, _stop);
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_log_ctl (int32_t  target,
enum qb_log_conf  conf_type,
int32_t  arg 
)
+
+
+ +

Main logging control function.

+
Parameters:
+ + + + +
target QB_LOG_SYSLOG, QB_LOG_STDERR or result from qb_log_file_open()
conf_type what to configure
arg the new value
+
+
+
See also:
qb_log_conf
+
Return values:
+ + + + +
-errno on error
0 on success
qb_log_target_state for QB_LOG_CONF_STATE_GET
+
+
+
Examples:
ipcclient.c, ipcserver.c, and simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_log_ctl2 (int32_t  target,
enum qb_log_conf  conf_type,
qb_log_ctl2_arg_t  arg 
)
+
+
+ +

Extension of main logging control function accepting also strings.

+
Parameters:
+ + +
arg for QB_LOG_CONF_IDENT, 's' member as new identifier to openlog(), for all original qb_log_ctl-compatible configuration directives, 'i32' member is assumed (although a preferred way is to use that original function directly as it allows for more type safety)
+
+
+
See also:
qb_log_ctl
+
Note:
You can use QB_LOG_CTL2_I32 and QB_LOG_CTL2_S macros for a convenient on-the-fly construction of the object to be passed as an arg argument.
+ +
+
+ +
+
+ + + + + + + + + +
void qb_log_custom_close (int32_t  t ) 
+
+
+ +

Close a custom log target and release is resources.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_log_custom_open (qb_log_logger_fn  log_fn,
qb_log_close_fn  close_fn,
qb_log_reload_fn  reload_fn,
void *  user_data 
)
+
+
+ +

Open a custom log target.

+
Return values:
+ + + +
-errno on error
value in inclusive range QB_LOG_TARGET_DYNAMIC_START to QB_LOG_TARGET_DYNAMIC_END (to be passed into other qb_log_* functions)
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + +
int32_t qb_log_facility2int (const char *  fname ) 
+
+
+ +

Convert string "auth" to equivalent number "LOG_AUTH" etc.

+ +
+
+ +
+
+ + + + + + + + + +
const char* qb_log_facility2str (int32_t  fnum ) 
+
+
+ +

Convert number "LOG_AUTH" to equivalent string "auth" etc.

+ +
+
+ +
+
+ + + + + + + + + +
void qb_log_file_close (int32_t  t ) 
+
+
+ +

Close a log file and release is resources.

+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_log_file_open (const char *  filename ) 
+
+
+ +

Open a log file.

+
Return values:
+ + + +
-errno on error
value in inclusive range QB_LOG_TARGET_DYNAMIC_START to QB_LOG_TARGET_DYNAMIC_END (to be passed into other qb_log_* functions)
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_log_filter_ctl (int32_t  value,
enum qb_log_filter_conf  c,
enum qb_log_filter_type  type,
const char *  text,
uint8_t  low_priority 
)
+
+
+ +

This allows you modify the 'tags' and 'targets' callsite fields at runtime.

+
Examples:
ipcclient.c, ipcserver.c, and simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_log_filter_ctl2 (int32_t  value,
enum qb_log_filter_conf  c,
enum qb_log_filter_type  type,
const char *  text,
uint8_t  high_priority,
uint8_t  low_priority 
)
+
+
+ +

This extends qb_log_filter_ctl() by been able to provide a high_priority.

+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + +
int32_t qb_log_filter_fn_set (qb_log_filter_fn  fn ) 
+
+
+ +

Instead of using the qb_log_filter_ctl() functions you can apply the filters manually by defining a callback and setting the targets field using qb_bit_set() and qb_bit_clear() like the following below:.

+
 static void
+ m_filter(struct qb_log_callsite *cs)
+ {
+        if ((cs->priority >= LOG_ALERT &&
+             cs->priority <= LOG_DEBUG) &&
+             strcmp(cs->filename, "my_c_file.c") == 0) {
+                qb_bit_set(cs->targets, QB_LOG_SYSLOG);
+        } else {
+                qb_bit_clear(cs->targets, QB_LOG_SYSLOG);
+        }
+ }
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_log_fini (void  ) 
+
+
+ +

Logging system finalization function.

+

It releases any shared memory. Stops the logging thread if running. Flushes the last messages to their destinations.

+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_log_format_set (int32_t  t,
const char *  format 
)
+
+
+ +

Set the format specifiers.

+

n FUNCTION NAME f FILENAME l FILELINE p PRIORITY t TIMESTAMP b BUFFER g TAGS N name (passed into qb_log_init) P PID H hostname

+

any number between % and character specify field length to pad or chop

+
Examples:
ipcclient.c, ipcserver.c, and simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void qb_log_from_external_source (const char *  function,
const char *  filename,
const char *  format,
uint8_t  priority,
uint32_t  lineno,
uint32_t  tags,
  ... 
)
+
+
+ +

This function is to import logs from other code (like libraries) that provide a callback with their logs.

+
Note:
the performance of this will not impress you, as the filtering is done on each log message, not beforehand. So try doing basic pre-filtering.
+
Parameters:
+ + + + + + + +
function originating function name
filename originating filename
format format string
priority this takes syslog priorities.
lineno file line number
tags this is a uint32_t that you can use with qb_log_tags_stringify_fn_set() to "tag" a log message with a feature or sub-system then you can use "%g" in the format specifer to print it out.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void qb_log_from_external_source_va (const char *  function,
const char *  filename,
const char *  format,
uint8_t  priority,
uint32_t  lineno,
uint32_t  tags,
va_list  ap 
)
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void qb_log_init (const char *  name,
int32_t  facility,
uint8_t  priority 
)
+
+
+ +

Init the logging system.

+
Parameters:
+ + + + +
name will be passed into openlog()
facility default for all new targets.
priority a basic filter with this priority will be added.
+
+
+
Examples:
ipcclient.c, ipcserver.c, and simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_log_real_ (struct qb_log_callsite cs,
  ... 
)
+
+
+ +

Internal function: use qb_log() or qb_logt().

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_log_real_va_ (struct qb_log_callsite cs,
va_list  ap 
)
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void qb_log_tags_stringify_fn_set (qb_log_tags_stringify_fn  fn ) 
+
+
+ +

Set the callback to map the 'tags' bit map to a string.

+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void qb_log_target_format (int32_t  target,
struct qb_log_callsite cs,
time_t  timestamp,
const char *  formatted_message,
char *  output_buffer 
)
+
+
+ +

format the callsite and timestamp info according to the format set using qb_log_format_set() It is intended to be used from your custom logger function.

+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + + + + + + +
void* qb_log_target_user_data_get (int32_t  t ) 
+
+
+ +

Retrieve the user data set by either qb_log_custom_open or qb_log_target_user_data_set.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_log_target_user_data_set (int32_t  t,
void *  user_data 
)
+
+
+ +

Associate user data with this log target.

+
Note:
only use this with custom targets
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_log_thread_priority_set (int32_t  policy,
int32_t  priority 
)
+
+
+ +

When using threaded logging set the pthread policy and priority.

+
Return values:
+ + + +
-errno on error
0 success
+
+
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_log_thread_start (void  ) 
+
+
+ +

Start the logging pthread.

+
Examples:
simplelog.c.
+
+
+
+

Variable Documentation

+ +
+
+ + + + +
struct qb_log_callsite __start___verbose[]
+
+
+ +
+
+ +
+
+ + + + +
struct qb_log_callsite __stop___verbose[]
+
+
+ +
+
+ +
+
+ + + + +
struct qb_log_callsite aligned
+
+
+ +

An instance of this structure is created in a special ELF section at every dynamic debug callsite.

+

At runtime, the special section is treated as an array of these.

+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qblog_8h__incl.map b/1.0rc3/doxygen/qblog_8h__incl.map new file mode 100644 index 000000000..d04b1b126 --- /dev/null +++ b/1.0rc3/doxygen/qblog_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/1.0rc3/doxygen/qblog_8h__incl.md5 b/1.0rc3/doxygen/qblog_8h__incl.md5 new file mode 100644 index 000000000..82c9530a7 --- /dev/null +++ b/1.0rc3/doxygen/qblog_8h__incl.md5 @@ -0,0 +1 @@ +457907693b22fa9ef2653746df69cbe8 \ No newline at end of file diff --git a/1.0rc3/doxygen/qblog_8h__incl.png b/1.0rc3/doxygen/qblog_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..fa608a7eb3f3605df90c2b71cadef3409e2d521d GIT binary patch literal 29503 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 + + + + +libqb: qbloop.h File Reference + + + + + + + + + +
+

qbloop.h File Reference

+

Main loop manages timers, jobs and polling sockets. +More...

+#include <signal.h>
+#include <stdint.h>
+
+Include dependency graph for qbloop.h:
+
+
+
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Typedefs

typedef struct qb_loop qb_loop_t
 An opaque data type representing the main loop.
typedef uint64_t qb_loop_timer_handle
typedef void * qb_loop_signal_handle
typedef int32_t(* qb_loop_poll_dispatch_fn )(int32_t fd, int32_t revents, void *data)
typedef void(* qb_loop_job_dispatch_fn )(void *data)
typedef void(* qb_loop_timer_dispatch_fn )(void *data)
typedef int32_t(* qb_loop_signal_dispatch_fn )(int32_t rsignal, void *data)
typedef void(* qb_loop_poll_low_fds_event_fn )(int32_t not_enough, int32_t fds_available)

Enumerations

enum  qb_loop_priority { QB_LOOP_LOW = 0, +QB_LOOP_MED = 1, +QB_LOOP_HIGH = 2 + }
 

Priorites for jobs, timers & poll.

+ More...

Functions

qb_loop_tqb_loop_create (void)
 Create a new main loop.
void qb_loop_destroy (struct qb_loop *l)
void qb_loop_stop (qb_loop_t *l)
 Stop the main loop.
void qb_loop_run (qb_loop_t *l)
 Run the main loop.
int32_t qb_loop_job_add (qb_loop_t *l, enum qb_loop_priority p, void *data, qb_loop_job_dispatch_fn dispatch_fn)
 Add a job to the mainloop.
int32_t qb_loop_job_del (struct qb_loop *l, enum qb_loop_priority p, void *data, qb_loop_job_dispatch_fn dispatch_fn)
 Delete a job from the mainloop.
int32_t qb_loop_timer_add (qb_loop_t *l, enum qb_loop_priority p, uint64_t nsec_duration, void *data, qb_loop_timer_dispatch_fn dispatch_fn, qb_loop_timer_handle *timer_handle_out)
 Add a timer to the mainloop.
int32_t qb_loop_timer_del (qb_loop_t *l, qb_loop_timer_handle th)
 Delete a timer that is still outstanding.
int32_t qb_loop_timer_is_running (qb_loop_t *l, qb_loop_timer_handle th)
 Check to see if a timer that is still outstanding.
uint64_t qb_loop_timer_expire_time_get (struct qb_loop *l, qb_loop_timer_handle th)
 Get the time remaining before it expires.
int32_t qb_loop_poll_low_fds_event_set (qb_loop_t *l, qb_loop_poll_low_fds_event_fn fn)
 Set a callback to receive events on file descriptors getting low.
int32_t qb_loop_poll_add (qb_loop_t *l, enum qb_loop_priority p, int32_t fd, int32_t events, void *data, qb_loop_poll_dispatch_fn dispatch_fn)
 Add a poll job to the mainloop.
int32_t qb_loop_poll_mod (qb_loop_t *l, enum qb_loop_priority p, int32_t fd, int32_t events, void *data, qb_loop_poll_dispatch_fn dispatch_fn)
 Modify a poll job.
int32_t qb_loop_poll_del (qb_loop_t *l, int32_t fd)
 Delete a poll job.
int32_t qb_loop_signal_add (qb_loop_t *l, enum qb_loop_priority p, int32_t sig, void *data, qb_loop_signal_dispatch_fn dispatch_fn, qb_loop_signal_handle *handle)
 Add a signal job.
int32_t qb_loop_signal_mod (qb_loop_t *l, enum qb_loop_priority p, int32_t sig, void *data, qb_loop_signal_dispatch_fn dispatch_fn, qb_loop_signal_handle handle)
 Modify the signal job.
int32_t qb_loop_signal_del (qb_loop_t *l, qb_loop_signal_handle handle)
 Delete the signal job.
+

Detailed Description

+

Main loop manages timers, jobs and polling sockets.

+

Typedef Documentation

+ +
+
+ + + + +
typedef void(* qb_loop_job_dispatch_fn)(void *data)
+
+
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + +
typedef int32_t(* qb_loop_poll_dispatch_fn)(int32_t fd, int32_t revents, void *data)
+
+
+ +
+
+ +
+
+ + + + +
typedef void(* qb_loop_poll_low_fds_event_fn)(int32_t not_enough, int32_t fds_available)
+
+
+ +
+
+ +
+
+ + + + +
typedef int32_t(* qb_loop_signal_dispatch_fn)(int32_t rsignal, void *data)
+
+
+ +
+
+ +
+
+ + + + +
typedef void* qb_loop_signal_handle
+
+
+ +
+
+ +
+
+ + + + +
typedef struct qb_loop qb_loop_t
+
+
+ +

An opaque data type representing the main loop.

+
Examples:
ipcserver.c, and tcpserver.c.
+
+
+
+ +
+
+ + + + +
typedef void(* qb_loop_timer_dispatch_fn)(void *data)
+
+
+ +
+
+ +
+
+ + + + +
typedef uint64_t qb_loop_timer_handle
+
+
+ +
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum qb_loop_priority
+
+
+ +

Priorites for jobs, timers & poll.

+
Enumerator:
+ + + +
QB_LOOP_LOW  +
QB_LOOP_MED  +
QB_LOOP_HIGH  +
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + +
qb_loop_t* qb_loop_create (void  ) 
+
+
+ +

Create a new main loop.

+
Returns:
loop instance.
+
Examples:
ipcserver.c, and tcpserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_loop_destroy (struct qb_loop *  l ) 
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_loop_job_add (qb_loop_t l,
enum qb_loop_priority  p,
void *  data,
qb_loop_job_dispatch_fn  dispatch_fn 
)
+
+
+ +

Add a job to the mainloop.

+

This is run in the next cycle of the loop.

+
Note:
it is a one-shot job.
+
Parameters:
+ + + + + +
l pointer to the loop instance
p the priority
data user data passed into the dispatch function
dispatch_fn callback function
+
+
+
Returns:
status (0 == ok, -errno == failure)
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_loop_job_del (struct qb_loop *  l,
enum qb_loop_priority  p,
void *  data,
qb_loop_job_dispatch_fn  dispatch_fn 
)
+
+
+ +

Delete a job from the mainloop.

+

This will try to delete the job if it hasn't run yet.

+
Note:
this will remove the first job that matches the paramaters (priority, data, dispatch_fn).
+
Parameters:
+ + + + + +
l pointer to the loop instance
p the priority
data user data passed into the dispatch function
dispatch_fn callback function
+
+
+
Returns:
status (0 == ok, -errno == failure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_loop_poll_add (qb_loop_t l,
enum qb_loop_priority  p,
int32_t  fd,
int32_t  events,
void *  data,
qb_loop_poll_dispatch_fn  dispatch_fn 
)
+
+
+ +

Add a poll job to the mainloop.

+
Note:
it is a re-occuring job.
+
Parameters:
+ + + + + + + +
l pointer to the loop instance
p the priority
fd file descriptor.
events (POLLIN|POLLOUT) etc ....
data user data passed into the dispatch function
dispatch_fn callback function
+
+
+
Returns:
status (0 == ok, -errno == failure)
+
Examples:
ipcserver.c, and tcpserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_loop_poll_del (qb_loop_t l,
int32_t  fd 
)
+
+
+ +

Delete a poll job.

+
Parameters:
+ + + +
l pointer to the loop instance
fd file descriptor.
+
+
+
Returns:
status (0 == ok, -errno == failure)
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_loop_poll_low_fds_event_set (qb_loop_t l,
qb_loop_poll_low_fds_event_fn  fn 
)
+
+
+ +

Set a callback to receive events on file descriptors getting low.

+
Parameters:
+ + + +
l pointer to the loop instance
fn callback function.
+
+
+
Returns:
status (0 == ok, -errno == failure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_loop_poll_mod (qb_loop_t l,
enum qb_loop_priority  p,
int32_t  fd,
int32_t  events,
void *  data,
qb_loop_poll_dispatch_fn  dispatch_fn 
)
+
+
+ +

Modify a poll job.

+
Parameters:
+ + + + + + + +
l pointer to the loop instance
p the priority
fd file descriptor.
events (POLLIN|POLLOUT) etc ....
data user data passed into the dispatch function
dispatch_fn callback function
+
+
+
Returns:
status (0 == ok, -errno == failure)
+
Examples:
ipcserver.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_loop_run (qb_loop_t l ) 
+
+
+ +

Run the main loop.

+
Parameters:
+ + +
l pointer to the loop instance
+
+
+
Examples:
ipcserver.c, and tcpserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_loop_signal_add (qb_loop_t l,
enum qb_loop_priority  p,
int32_t  sig,
void *  data,
qb_loop_signal_dispatch_fn  dispatch_fn,
qb_loop_signal_handle handle 
)
+
+
+ +

Add a signal job.

+

Get a callback on this signal (not in the context of the signal).

+
Parameters:
+ + + + + + + +
l pointer to the loop instance
p the priority
sig (SIGHUP or SIGINT) etc ....
data user data passed into the dispatch function
dispatch_fn callback function
handle (out) a reference to the signal job
+
+
+
Returns:
status (0 == ok, -errno == failure)
+
Examples:
tcpserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_loop_signal_del (qb_loop_t l,
qb_loop_signal_handle  handle 
)
+
+
+ +

Delete the signal job.

+
Parameters:
+ + + +
l pointer to the loop instance
handle (in) a reference to the signal job
+
+
+
Returns:
status (0 == ok, -errno == failure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_loop_signal_mod (qb_loop_t l,
enum qb_loop_priority  p,
int32_t  sig,
void *  data,
qb_loop_signal_dispatch_fn  dispatch_fn,
qb_loop_signal_handle  handle 
)
+
+
+ +

Modify the signal job.

+
Parameters:
+ + + + + + + +
l pointer to the loop instance
p the priority
sig (SIGHUP or SIGINT) etc ....
data user data passed into the dispatch function
dispatch_fn callback function
handle (in) a reference to the signal job
+
+
+
Returns:
status (0 == ok, -errno == failure)
+ +
+
+ +
+
+ + + + + + + + + +
void qb_loop_stop (qb_loop_t l ) 
+
+
+ +

Stop the main loop.

+
Parameters:
+ + +
l pointer to the loop instance
+
+
+
Examples:
tcpserver.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_loop_timer_add (qb_loop_t l,
enum qb_loop_priority  p,
uint64_t  nsec_duration,
void *  data,
qb_loop_timer_dispatch_fn  dispatch_fn,
qb_loop_timer_handle timer_handle_out 
)
+
+
+ +

Add a timer to the mainloop.

+
Note:
it is a one-shot job.
+
Parameters:
+ + + + + + + +
l pointer to the loop instance
p the priority
nsec_duration nano-secs in the future to run the dispatch.
data user data passed into the dispatch function
dispatch_fn callback function
timer_handle_out handle to delete the timer if needed.
+
+
+
Returns:
status (0 == ok, -errno == failure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_loop_timer_del (qb_loop_t l,
qb_loop_timer_handle  th 
)
+
+
+ +

Delete a timer that is still outstanding.

+
Parameters:
+ + + +
l pointer to the loop instance
th handle to delete the timer if needed.
+
+
+
Returns:
status (0 == ok, -errno == failure)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
uint64_t qb_loop_timer_expire_time_get (struct qb_loop *  l,
qb_loop_timer_handle  th 
)
+
+
+ +

Get the time remaining before it expires.

+
Note:
if the timer has already expired it will return 0
+
Parameters:
+ + + +
l pointer to the loop instance
th timer handle.
+
+
+
Returns:
nano seconds left
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_loop_timer_is_running (qb_loop_t l,
qb_loop_timer_handle  th 
)
+
+
+ +

Check to see if a timer that is still outstanding.

+
Parameters:
+ + + +
l pointer to the loop instance
th handle to delete the timer if needed.
+
+
+
Return values:
+ + + +
QB_TRUE yes this timer is outstanding
QB_FALSE this timer does not exist or has expired
+
+
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbloop_8h__dep__incl.map b/1.0rc3/doxygen/qbloop_8h__dep__incl.map new file mode 100644 index 000000000..aa842386a --- /dev/null +++ b/1.0rc3/doxygen/qbloop_8h__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/1.0rc3/doxygen/qbloop_8h__dep__incl.md5 b/1.0rc3/doxygen/qbloop_8h__dep__incl.md5 new file mode 100644 index 000000000..eb6a91ff3 --- /dev/null +++ b/1.0rc3/doxygen/qbloop_8h__dep__incl.md5 @@ -0,0 +1 @@ +1810816ffa4d06bb23a93c18ec9c353c \ No newline at end of file diff --git a/1.0rc3/doxygen/qbloop_8h__dep__incl.png b/1.0rc3/doxygen/qbloop_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..dabd9c30a1bbd157d90b47807bbbea2b37c2c936 GIT binary patch literal 2466 zcmbtWc{tQtAD_BYA(shD+dUt3ggun;B!g*j|IiB(#xcY_wS)1BKy+N z^zvxRSjklb-~{lwE_Kpy(8+;&rYUSTp?l%l(9no;X-L?X?K4=6Sz`U;2XKg);JkDt$e`s^p{*3jb`|aCT$kWy;+J$hpVd#R8&;3 zS61kxoJ&~ZyQ+lFPK(%`Z$eBaQ%YJIiO0)nqaQjd7#hNql$5%Adr5hDFi|nFsIcwr zZSMDNy-Ke(;TP^{tE<70k&))=Ih6BPZM^idb8}}mmj*+xUuP`5&O3|45jLeH8Fw-3 zY_=-CH8wdrTO14qD-;*Vrlz0*iEK9eZC-dp#Kx>y9M8|OE#i~=)UE#7lQDbWzD01kTyq7eCJu14&ZmcD z1s93nOePl^UM*>Al3DxE#+qZLM}?J@m9aS-^ySMMy}i9qF)`m->iT-9I1E+_tkTlb zQq|C~^zbNh`}%Qncz8I`k}T{U8yj0ez9Q*zD#hBtft7d|7W$nV#^v$gYHIv>$31ob z7_Yx7KTvE;?&v_GtgL{?=^$KqVqa`QB$_#$J2$hsn)>o3LKYF)zRFAF9g&x3RLF7!#ot#AR&5_k?Gyt*;3g!0u_wEQ|W9?Hmwma0y%C6oVjgS#-5DJBw z-u*>hfyXfWR6+gTWQ_}L+VGvZ@uW*GgS0U%j%*x7Z zjYZFtP-i2f-L&=fCI6zvMm;`3kC4UGKHu@ajx!6!p+!*HV+l^%15-=+{WVZ5-z|&J z$5f7m=NAnjA94qSG=yv2BuRyZZ4c^yx8A#cbqz`>Y#Y;2`T|&UdfTSwm526L=aqpS z@{a21%9CNw2kjmC=GtCGUe&7cwvcaP?kM?@Jh=FM^kTk}f>8UA2LBVpN-i?jNdxBs43UKioA8!0kuCFKeU!#N7Uw<2E zpO}b0*3Ym6gT`u@EIBnT0dg^%DES|O`deL8@^!H%e#Z0P%Ju(Ep!Yyc)zu=VrlxfR z{>Xr9PO9P&0}1Igns#SrCs*PXpKd`aDD)+a^#hII7&a|>ul}0VlUkvy@`SGdd(h$! z%a+>r`v@<7iFo77xy%tl1~NYW@6A%}z-@6mlKXFg0P#tATJMSYf!VY#9U~2IYSCv{8`#GK#$d_7MaS*N@%Zk(zM;_%Eio`6 zkvNSIzC7|A5R;DP215e_xUw?%`0?Xot#QVUO-1Umt6G}?p*2?y)$PW z5<+cV1;`5qy(8$)_ZJ$1K~cQT3S^w4BUCYgy)qp1l~jEsE$I&wd}Dpavb3SLu1*y6 zsHG*YqdAZlL?FD)JMZEm>gwuBPcP2cj&t+B&0b#aoS#>&3z>MVUD#sE7@=MeS~fN| zwlm9QItODghtL>|h_v*j-`dh-3@zZ9=J3qv?o6ff@^ajIg*G6DBUfXhqkV#d`-0ME ztC!spluR;hRmDqMTjjPme=(k(f2NT4Ix{<4f6Yw8W&I=+6Lkaz0{(=XbBN}ct+u8T zgOi`vE*b0~Bkk<$peal=^oGr)4D(SGzm*yn52 zXeADZGuC$Fw63nMqr3aiYWn3Pwgp?CtH#pFdByfB*h2Z2ZqZNeKzy_zrUk+hZZ; zV)u57Uv+hf!eB5_Sy?P+vVpOaaZXj-@2|#il(MKugNJ>syO!cBF1e@zXTeuMp}?b} zqF#OYa6eQQ)7;!_9T1?Rn2?b!fBJ5BxAiQCV_#HUoQ#4is^^?(qgA&K1)ZefOW) literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbloop_8h__incl.map b/1.0rc3/doxygen/qbloop_8h__incl.map new file mode 100644 index 000000000..8be6a309f --- /dev/null +++ b/1.0rc3/doxygen/qbloop_8h__incl.map @@ -0,0 +1,2 @@ + + diff --git a/1.0rc3/doxygen/qbloop_8h__incl.md5 b/1.0rc3/doxygen/qbloop_8h__incl.md5 new file mode 100644 index 000000000..70f39ea5a --- /dev/null +++ b/1.0rc3/doxygen/qbloop_8h__incl.md5 @@ -0,0 +1 @@ +45e14b60a0c5dc241ac295c9cb1750f2 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbloop_8h__incl.png b/1.0rc3/doxygen/qbloop_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..9e720f9ad1737de82ca2fbda87a2116523dea12c GIT binary patch literal 4377 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 OKzay6tx661@c#hU2}7^| literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbmap_8h.html b/1.0rc3/doxygen/qbmap_8h.html new file mode 100644 index 000000000..db5276519 --- /dev/null +++ b/1.0rc3/doxygen/qbmap_8h.html @@ -0,0 +1,860 @@ + + + + + +libqb: qbmap.h File Reference + + + + + + + + + +
+

qbmap.h File Reference

+

This provides a map interface to a Patricia trie, hashtable or skiplist. +More...

+#include <stdint.h>
+#include <unistd.h>
+
+Include dependency graph for qbmap.h:
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define QB_MAP_NOTIFY_DELETED   1
#define QB_MAP_NOTIFY_REPLACED   2
#define QB_MAP_NOTIFY_INSERTED   4
#define QB_MAP_NOTIFY_RECURSIVE   8
#define QB_MAP_NOTIFY_FREE   16

Typedefs

typedef struct qb_map qb_map_t
 This is an opaque data type representing an instance of a map.
typedef struct qb_map_iter qb_map_iter_t
 This is an opaque data type representing an iterator instance.
typedef void(* qb_map_notify_fn )(uint32_t event, char *key, void *old_value, void *value, void *user_data)
typedef int32_t(* qb_map_transverse_fn )(const char *key, void *value, void *user_data)

Functions

qb_map_tqb_hashtable_create (size_t max_size)
 Create an unsorted map based on a hashtable.
qb_map_tqb_skiplist_create (void)
 Create a sorted map using a skiplist.
qb_map_tqb_trie_create (void)
 Create a sorted map using a Patricia trie or "Radix tree".
void qb_trie_dump (qb_map_t *m)
 print out the nodes in the trie
int32_t qb_map_notify_add (qb_map_t *m, const char *key, qb_map_notify_fn fn, int32_t events, void *user_data)
 Add a notifier to the map.
int32_t qb_map_notify_del (qb_map_t *m, const char *key, qb_map_notify_fn fn, int32_t events)
 Delete a notifier from the map.
int32_t qb_map_notify_del_2 (qb_map_t *m, const char *key, qb_map_notify_fn fn, int32_t events, void *user_data)
 Delete a notifier from the map (including the userdata).
void qb_map_put (qb_map_t *map, const char *key, const void *value)
 Inserts a new key and value into a qb_map_t.
void * qb_map_get (qb_map_t *map, const char *key)
 Gets the value corresponding to the given key.
int32_t qb_map_rm (qb_map_t *map, const char *key)
 Removes a key/value pair from a map.
size_t qb_map_count_get (qb_map_t *map)
 Get the number of items in the map.
void qb_map_foreach (qb_map_t *map, qb_map_transverse_fn func, void *user_data)
 Calls the given function for each of the key/value pairs in the map.
qb_map_iter_tqb_map_iter_create (qb_map_t *map)
 Create an iterator.
qb_map_iter_tqb_map_pref_iter_create (qb_map_t *map, const char *prefix)
 Create a prefix iterator.
const char * qb_map_iter_next (qb_map_iter_t *i, void **value)
 Get the next item.
void qb_map_iter_free (qb_map_iter_t *i)
 free the iterator
void qb_map_destroy (qb_map_t *map)
 Destroy the map, removes all the items from the map.
+

Detailed Description

+

This provides a map interface to a Patricia trie, hashtable or skiplist.

+
Ordering
The hashtable is NOT ordered, but ptrie and skiplist are.
+
Iterating
Below is a simple example of how to iterate over a map.
 const char *p;
+ void *data;
+ qb_map_iter_t *it = qb_map_iter_create(m);
+ for (p = qb_map_iter_next(it, &data); p; p = qb_map_iter_next(it, &data)) {
+     printf("%s > %s\n", p, (char*) data);
+ }
+ qb_map_iter_free(it);
+
+

Deletion of items within the iterator is supported. But note do not free the item memory in the iterator. If you need to free the data items then register for a notifier and free the memory there. This is required as the items are reference counted.

+
 qb_map_notify_add(m, NULL, my_map_free_handler,
+                     QB_MAP_NOTIFY_FREE, NULL);
+
Notifications
These allow you to get callbacks when values are inserted/removed or replaced.
+
Note:
hashtable only supports deletion and replacement notificatins. There is also a special global callback for freeing deleted and replaced values (QB_MAP_NOTIFY_FREE).
+
See also:
qb_map_notify_add() qb_map_notify_del_2()
+
Prefix matching
The ptrie supports prefixes in the iterator:
+
 it = qb_map_pref_iter_create(m, "aa");
+ while ((p = qb_map_iter_next(it, &data)) != NULL) {
+     printf("%s > %s\n", p, (char*)data);
+ }
+ qb_map_iter_free(it);
+

The ptrie also supports prefixes in notifications: (remember to pass QB_MAP_NOTIFY_RECURSIVE into the notify_add.

+

Define Documentation

+ +
+
+ + + + +
#define QB_MAP_NOTIFY_DELETED   1
+
+
+ +
+
+ +
+
+ + + + +
#define QB_MAP_NOTIFY_FREE   16
+
+
+ +
+
+ +
+
+ + + + +
#define QB_MAP_NOTIFY_INSERTED   4
+
+
+ +
+
+ +
+
+ + + + +
#define QB_MAP_NOTIFY_RECURSIVE   8
+
+
+ +
+
+ +
+
+ + + + +
#define QB_MAP_NOTIFY_REPLACED   2
+
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef struct qb_map_iter qb_map_iter_t
+
+
+ +

This is an opaque data type representing an iterator instance.

+ +
+
+ +
+
+ + + + +
typedef void(* qb_map_notify_fn)(uint32_t event, char *key, void *old_value, void *value, void *user_data)
+
+
+ +
+
+ +
+
+ + + + +
typedef struct qb_map qb_map_t
+
+
+ +

This is an opaque data type representing an instance of a map.

+ +
+
+ +
+
+ + + + +
typedef int32_t(* qb_map_transverse_fn)(const char *key, void *value, void *user_data)
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + +
qb_map_t* qb_hashtable_create (size_t  max_size ) 
+
+
+ +

Create an unsorted map based on a hashtable.

+
Parameters:
+ + +
max_size maximum size of the hashtable
+
+
+
Returns:
the map instance
+ +
+
+ +
+
+ + + + + + + + + +
size_t qb_map_count_get (qb_map_t map ) 
+
+
+ +

Get the number of items in the map.

+ +
+
+ +
+
+ + + + + + + + + +
void qb_map_destroy (qb_map_t map ) 
+
+
+ +

Destroy the map, removes all the items from the map.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void qb_map_foreach (qb_map_t map,
qb_map_transverse_fn  func,
void *  user_data 
)
+
+
+ +

Calls the given function for each of the key/value pairs in the map.

+

The function is passed the key and value of each pair, and the given data parameter. The map is traversed in sorted order.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void* qb_map_get (qb_map_t map,
const char *  key 
)
+
+
+ +

Gets the value corresponding to the given key.

+
Return values:
+ + + +
NULL (if the key does not exist)
a pointer to the value
+
+
+ +
+
+ +
+
+ + + + + + + + + +
qb_map_iter_t* qb_map_iter_create (qb_map_t map ) 
+
+
+ +

Create an iterator.

+ +
+
+ +
+
+ + + + + + + + + +
void qb_map_iter_free (qb_map_iter_t i ) 
+
+
+ +

free the iterator

+
Parameters:
+ + +
i the iterator
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
const char* qb_map_iter_next (qb_map_iter_t i,
void **  value 
)
+
+
+ +

Get the next item.

+
Parameters:
+ + + +
i the iterator
value (out) the next item's value
+
+
+
Return values:
+ + + +
the next key
NULL - the end of the iteration
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_map_notify_add (qb_map_t m,
const char *  key,
qb_map_notify_fn  fn,
int32_t  events,
void *  user_data 
)
+
+
+ +

Add a notifier to the map.

+
Parameters:
+ + + + + + +
m the map instance
key the key (or prefix) to attach the notification to.
fn the callback
events the type of events to register for.
user_data a pointer to be passed into the callback
+
+
+
Note:
QB_MAP_NOTIFY_INSERTED is only valid on tries.
+
+you can use key prefixes with trie maps.
+
Return values:
+ + + +
0 success
-errno failure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_map_notify_del (qb_map_t m,
const char *  key,
qb_map_notify_fn  fn,
int32_t  events 
)
+
+
+ +

Delete a notifier from the map.

+
Note:
the key,fn and events must match those you added.
+
Parameters:
+ + + + + +
m the map instance
key the key (or prefix) to attach the notification to.
fn the callback
events the type of events to register for.
+
+
+
Return values:
+ + + +
0 success
-errno failure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_map_notify_del_2 (qb_map_t m,
const char *  key,
qb_map_notify_fn  fn,
int32_t  events,
void *  user_data 
)
+
+
+ +

Delete a notifier from the map (including the userdata).

+
Note:
the key, fn, events and userdata must match those you added.
+
Parameters:
+ + + + + + +
m the map instance
key the key (or prefix) to attach the notification to.
fn the callback
events the type of events to register for.
user_data a pointer to be passed into the callback
+
+
+
Return values:
+ + + +
0 success
-errno failure
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
qb_map_iter_t* qb_map_pref_iter_create (qb_map_t map,
const char *  prefix 
)
+
+
+ +

Create a prefix iterator.

+

This will iterate over all items with the given prefix.

+
Note:
this is only supported by the trie.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void qb_map_put (qb_map_t map,
const char *  key,
const void *  value 
)
+
+
+ +

Inserts a new key and value into a qb_map_t.

+

If the key already exists in the qb_map_t, it gets replaced by the new key.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_map_rm (qb_map_t map,
const char *  key 
)
+
+
+ +

Removes a key/value pair from a map.

+ +
+
+ +
+
+ + + + + + + + + +
qb_map_t* qb_skiplist_create (void  ) 
+
+
+ +

Create a sorted map using a skiplist.

+
Returns:
the map instance
+ +
+
+ +
+
+ + + + + + + + + +
qb_map_t* qb_trie_create (void  ) 
+
+
+ +

Create a sorted map using a Patricia trie or "Radix tree".

+ + See the wikipedia Radix_tree + and Trie pages. + +
+
+ +
+
+ + + + + + + + + +
void qb_trie_dump (qb_map_t m ) 
+
+
+ +

print out the nodes in the trie

+

(for debug purposes)

+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbmap_8h__incl.map b/1.0rc3/doxygen/qbmap_8h__incl.map new file mode 100644 index 000000000..8be6a309f --- /dev/null +++ b/1.0rc3/doxygen/qbmap_8h__incl.map @@ -0,0 +1,2 @@ + + diff --git a/1.0rc3/doxygen/qbmap_8h__incl.md5 b/1.0rc3/doxygen/qbmap_8h__incl.md5 new file mode 100644 index 000000000..fa330bde6 --- /dev/null +++ b/1.0rc3/doxygen/qbmap_8h__incl.md5 @@ -0,0 +1 @@ +ed5085a2e7cfe93092fdc668d7ed4268 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbmap_8h__incl.png b/1.0rc3/doxygen/qbmap_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf836708d8c8d78b837b02910ea43dd027c9d33 GIT binary patch literal 4374 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 literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbrb_8h.html b/1.0rc3/doxygen/qbrb_8h.html new file mode 100644 index 000000000..d0f9eca57 --- /dev/null +++ b/1.0rc3/doxygen/qbrb_8h.html @@ -0,0 +1,908 @@ + + + + + +libqb: qbrb.h File Reference + + + + + + + + + +
+

qbrb.h File Reference

+

This implements a ring buffer that works in "chunks" not bytes. +More...

+#include <sys/types.h>
+#include <stdint.h>
+
+Include dependency graph for qbrb.h:
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define QB_RB_FLAG_CREATE   0x01
 create a ring buffer (rather than open and existing one)
#define QB_RB_FLAG_OVERWRITE   0x02
 New calls to qb_rb_chunk_write() will call qb_rb_chunk_reclaim() if there is not enough space.
#define QB_RB_FLAG_SHARED_THREAD   0x04
 The ringbuffer will be shared between pthreads not processes.
#define QB_RB_FLAG_SHARED_PROCESS   0x08
 The ringbuffer will be shared between processes.
#define QB_RB_FLAG_NO_SEMAPHORE   0x10
 Don't use semaphores, only atomic ops.

Typedefs

typedef struct qb_ringbuffer_s qb_ringbuffer_t

Functions

qb_ringbuffer_tqb_rb_open (const char *name, size_t size, uint32_t flags, size_t shared_user_data_size)
 Create the ring buffer with the given type.
void qb_rb_close (qb_ringbuffer_t *rb)
 Dereference the ringbuffer and if we are the last user destroy it.
char * qb_rb_name_get (qb_ringbuffer_t *rb)
 Get the name of the ringbuffer.
void * qb_rb_shared_user_data_get (qb_ringbuffer_t *rb)
 Get a point to user shared data area.
ssize_t qb_rb_chunk_write (qb_ringbuffer_t *rb, const void *data, size_t len)
 Write a chunk to the ring buffer.
void * qb_rb_chunk_alloc (qb_ringbuffer_t *rb, size_t len)
 Allocate space for a chunk of the given size.
int32_t qb_rb_chunk_commit (qb_ringbuffer_t *rb, size_t len)
 finalize the chunk.
ssize_t qb_rb_chunk_peek (qb_ringbuffer_t *rb, void **data_out, int32_t ms_timeout)
 Read (without reclaiming) the last chunk.
void qb_rb_chunk_reclaim (qb_ringbuffer_t *rb)
 Reclaim the oldest chunk.
ssize_t qb_rb_chunk_read (qb_ringbuffer_t *rb, void *data_out, size_t len, int32_t ms_timeout)
 Read the oldest chunk into data_out.
int32_t qb_rb_refcount_get (qb_ringbuffer_t *rb)
 Get the reference count.
ssize_t qb_rb_space_free (qb_ringbuffer_t *rb)
 The amount of free space in the ring buffer.
ssize_t qb_rb_space_used (qb_ringbuffer_t *rb)
 The total amount of data in the buffer.
ssize_t qb_rb_chunks_used (qb_ringbuffer_t *rb)
 The total number of chunks in the buffer.
ssize_t qb_rb_write_to_file (qb_ringbuffer_t *rb, int32_t fd)
 Write the contents of the Ring Buffer to file.
qb_ringbuffer_tqb_rb_create_from_file (int32_t fd, uint32_t flags)
 Load the saved ring buffer from file into tempory memory.
int32_t qb_rb_chown (qb_ringbuffer_t *rb, uid_t owner, gid_t group)
 Like 'chown' it changes the owner and group of the ringbuffers resources.
int32_t qb_rb_chmod (qb_ringbuffer_t *rb, mode_t mode)
 Like 'chmod' it changes the mode of the ringbuffers resources.
+

Detailed Description

+

This implements a ring buffer that works in "chunks" not bytes.

+

So you write/read a complete chunk or not at all. There are two types of ring buffer normal and overwrite. Overwrite will reclaim the oldest chunks inorder to make way for new ones, the normal version will refuse to write a new chunk if the ring buffer is full.

+

This implementation is capable of working across processes, but one process must only write and the other prrocess read.

+

The read process will do the following:

+
        rb = qb_rb_open("test2", 2000, QB_RB_FLAG_SHARED_PROCESS|QB_RB_FLAG_CREATE);
+        for (i = 0; i < 200; i++) {
+        try_read_again:
+                l = qb_rb_chunk_read(rb, (void *)out, 32, 1000);
+                if (l < 0) {
+                        goto try_read_again;
+                }
+        }
+        ...
+        qb_rb_close(rb);
+

The write process will do the following:

+
        rb = qb_rb_open("test2", 2000, QB_RB_FLAG_SHARED_PROCESS);
+        for (i = 0; i < 200; i++) {
+ try_write_again:
+                l = qb_rb_chunk_write(rb, &v, sizeof(v));
+                if (l < sizeof(v)) {
+                        goto try_write_again;
+                }
+        }
+        ...
+        qb_rb_close(rb);
+
Author:
Angus Salkeld <asalkeld@redhat.com>
+

Define Documentation

+ +
+
+ + + + +
#define QB_RB_FLAG_CREATE   0x01
+
+
+ +

create a ring buffer (rather than open and existing one)

+
See also:
qb_rb_open()
+ +
+
+ +
+
+ + + + +
#define QB_RB_FLAG_NO_SEMAPHORE   0x10
+
+
+ +

Don't use semaphores, only atomic ops.

+

This mean that the timeout passed into qb_rb_chunk_read() will be ignored.

+ +
+
+ +
+
+ + + + +
#define QB_RB_FLAG_OVERWRITE   0x02
+
+
+ +

New calls to qb_rb_chunk_write() will call qb_rb_chunk_reclaim() if there is not enough space.

+

If this is not set then new writes will be refused.

+
See also:
qb_rb_open()
+ +
+
+ +
+
+ + + + +
#define QB_RB_FLAG_SHARED_PROCESS   0x08
+
+
+ +

The ringbuffer will be shared between processes.

+

This effects the type of locks/semaphores that are used.

+
See also:
qb_rb_open()
+ +
+
+ +
+
+ + + + +
#define QB_RB_FLAG_SHARED_THREAD   0x04
+
+
+ +

The ringbuffer will be shared between pthreads not processes.

+

This effects the type of locks/semaphores that are used.

+
See also:
qb_rb_open()
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef struct qb_ringbuffer_s qb_ringbuffer_t
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_rb_chmod (qb_ringbuffer_t rb,
mode_t  mode 
)
+
+
+ +

Like 'chmod' it changes the mode of the ringbuffers resources.

+
Parameters:
+ + + +
mode mode to change to
rb ringbuffer instance
+
+
+
Return values:
+ + + +
0 == ok
-errno for error
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_rb_chown (qb_ringbuffer_t rb,
uid_t  owner,
gid_t  group 
)
+
+
+ +

Like 'chown' it changes the owner and group of the ringbuffers resources.

+
Parameters:
+ + + + +
owner uid of the owner to change to
group gid of the group to change to
rb ringbuffer instance
+
+
+
Returns:
status (0 = ok, -errno for error)
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void* qb_rb_chunk_alloc (qb_ringbuffer_t rb,
size_t  len 
)
+
+
+ +

Allocate space for a chunk of the given size.

+

If type == QB_RB_FLAG_OVERWRITE and NULL is returned, memory corruption of the memory file has occured. The ringbuffer should be destroyed. If type == QB_RB_NORMAL then when there is not enough space it will return NULL.

+
Parameters:
+ + + +
rb ringbuffer instance
len (in) the size to allocate.
+
+
+
Returns:
pointer to chunk to write to, or NULL (if no space).
+
See also:
qb_rb_chunk_alloc()
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
int32_t qb_rb_chunk_commit (qb_ringbuffer_t rb,
size_t  len 
)
+
+
+ +

finalize the chunk.

+
Parameters:
+ + + +
rb ringbuffer instance
len (in) the size of the chunk.
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_rb_chunk_peek (qb_ringbuffer_t rb,
void **  data_out,
int32_t  ms_timeout 
)
+
+
+ +

Read (without reclaiming) the last chunk.

+

This function is a way of accessing the next chunk without a memcpy(). You can read the chunk data in place.

+
Note:
This function will not "pop" the chunk, you will need to call qb_rb_chunk_reclaim().
+
Parameters:
+ + + + +
rb ringbuffer instance
data_out (out) a pointer to the next chunk to read (not copied).
ms_timeout (in) time to wait for new data.
+
+
+
Returns:
the size of the chunk (0 if buffer empty).
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_rb_chunk_read (qb_ringbuffer_t rb,
void *  data_out,
size_t  len,
int32_t  ms_timeout 
)
+
+
+ +

Read the oldest chunk into data_out.

+

This is the same as qb_rb_chunk_peek() memcpy() and qb_rb_chunk_reclaim().

+
Parameters:
+ + + + + +
rb ringbuffer instance
data_out (in/out) the chunk will be memcpy'ed into this.
len (in) the size of data_out.
ms_timeout the amount od time to wait for new data.
+
+
+
Returns:
the size of the chunk, or error.
+ +
+
+ +
+
+ + + + + + + + + +
void qb_rb_chunk_reclaim (qb_ringbuffer_t rb ) 
+
+
+ +

Reclaim the oldest chunk.

+

You will need to call this if using qb_rb_chunk_peek().

+
Parameters:
+ + +
rb ringbuffer instance
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ssize_t qb_rb_chunk_write (qb_ringbuffer_t rb,
const void *  data,
size_t  len 
)
+
+
+ +

Write a chunk to the ring buffer.

+

This simply calls qb_rb_chunk_alloc() and then qb_rb_chunk_commit().

+
Parameters:
+ + + + +
rb ringbuffer instance
data (in) the data to write
len (in) the size of the chunk.
+
+
+
Returns:
the amount of bytes actually buffered (either len or -1).
+
See also:
qb_rb_chunk_alloc()
+
+qb_rb_chunk_commit()
+ +
+
+ +
+
+ + + + + + + + + +
ssize_t qb_rb_chunks_used (qb_ringbuffer_t rb ) 
+
+
+ +

The total number of chunks in the buffer.

+
Parameters:
+ + +
rb ringbuffer instance
+
+
+ +
+
+ +
+
+ + + + + + + + + +
void qb_rb_close (qb_ringbuffer_t rb ) 
+
+
+ +

Dereference the ringbuffer and if we are the last user destroy it.

+

All files, mmaped memory, semaphores and locks will be destroyed.

+
Parameters:
+ + +
rb ringbuffer instance
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
qb_ringbuffer_t* qb_rb_create_from_file (int32_t  fd,
uint32_t  flags 
)
+
+
+ +

Load the saved ring buffer from file into tempory memory.

+
Parameters:
+ + + +
fd file with saved ringbuffer data.
flags same flags as passed into qb_rb_open()
+
+
+
Returns:
new ringbuffer instance
+
See also:
qb_rb_write_to_file()
+ +
+
+ +
+
+ + + + + + + + + +
char* qb_rb_name_get (qb_ringbuffer_t rb ) 
+
+
+ +

Get the name of the ringbuffer.

+
Parameters:
+ + +
rb ringbuffer instance
+
+
+
Returns:
name.
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
qb_ringbuffer_t* qb_rb_open (const char *  name,
size_t  size,
uint32_t  flags,
size_t  shared_user_data_size 
)
+
+
+ +

Create the ring buffer with the given type.

+

This creates allocates a ring buffer in shared memory.

+
Parameters:
+ + + + + +
name the unique name of this ringbuffer.
size the requested size.
flags or'ed flags
shared_user_data_size size for a shared data area.
+
+
+
Note:
the actual size will be rounded up to the next page size.
+
Returns:
a new ring buffer or NULL if there was a problem.
+
See also:
QB_RB_FLAG_CREATE, QB_RB_FLAG_OVERWRITE, QB_RB_FLAG_SHARED_THREAD, QB_RB_FLAG_SHARED_PROCESS
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_rb_refcount_get (qb_ringbuffer_t rb ) 
+
+
+ +

Get the reference count.

+
Parameters:
+ + +
rb ringbuffer instance
+
+
+
Returns:
the number of references
+ +
+
+ +
+
+ + + + + + + + + +
void* qb_rb_shared_user_data_get (qb_ringbuffer_t rb ) 
+
+
+ +

Get a point to user shared data area.

+
Note:
this is of size "shared_user_data_size" passed into qb_rb_open()
+
Parameters:
+ + +
rb ringbuffer instance
+
+
+
Returns:
pointer to shared data.
+ +
+
+ +
+
+ + + + + + + + + +
ssize_t qb_rb_space_free (qb_ringbuffer_t rb ) 
+
+
+ +

The amount of free space in the ring buffer.

+
Note:
Some of this space will be consumed by the chunk headers.
+
Parameters:
+ + +
rb ringbuffer instance
+
+
+ +
+
+ +
+
+ + + + + + + + + +
ssize_t qb_rb_space_used (qb_ringbuffer_t rb ) 
+
+
+ +

The total amount of data in the buffer.

+
Note:
This includes the chunk headers (8 bytes per chunk).
+
Parameters:
+ + +
rb ringbuffer instance
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
ssize_t qb_rb_write_to_file (qb_ringbuffer_t rb,
int32_t  fd 
)
+
+
+ +

Write the contents of the Ring Buffer to file.

+
Parameters:
+ + + +
fd open file to write the ringbuffer data to.
rb ringbuffer instance
+
+
+
See also:
qb_rb_create_from_file()
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbrb_8h__incl.map b/1.0rc3/doxygen/qbrb_8h__incl.map new file mode 100644 index 000000000..8be6a309f --- /dev/null +++ b/1.0rc3/doxygen/qbrb_8h__incl.map @@ -0,0 +1,2 @@ + + diff --git a/1.0rc3/doxygen/qbrb_8h__incl.md5 b/1.0rc3/doxygen/qbrb_8h__incl.md5 new file mode 100644 index 000000000..6dee938bf --- /dev/null +++ b/1.0rc3/doxygen/qbrb_8h__incl.md5 @@ -0,0 +1 @@ +d41cb7d377a99b1aef7a012d1f5ecf92 \ No newline at end of file diff --git a/1.0rc3/doxygen/qbrb_8h__incl.png b/1.0rc3/doxygen/qbrb_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d60158fd627588469d0954d95d1192b3250efe GIT binary patch literal 4895 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 literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/qbutil_8h.html b/1.0rc3/doxygen/qbutil_8h.html new file mode 100644 index 000000000..fa3dc83a7 --- /dev/null +++ b/1.0rc3/doxygen/qbutil_8h.html @@ -0,0 +1,861 @@ + + + + + +libqb: qbutil.h File Reference + + + + + + + + + +
+

qbutil.h File Reference

+

These are some convience functions used throughout libqb. +More...

+#include <pthread.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <qb/qbdefs.h>
+
+Include dependency graph for qbutil.h:
+
+
+ + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define QB_UTIL_SW_OVERWRITE   0x01

Typedefs

typedef struct qb_thread_lock_s qb_thread_lock_t
typedef void(* qb_util_log_fn_t )(const char *file_name, int32_t file_line, int32_t severity, const char *msg)
typedef struct qb_util_stopwatch qb_util_stopwatch_t

Enumerations

enum  qb_thread_lock_type_t { QB_THREAD_LOCK_SHORT, +QB_THREAD_LOCK_LONG + }
 

QB_THREAD_LOCK_SHORT is a short term lock (spinlock if available on your system) QB_THREAD_LOCK_LONG is a mutex.

+ More...

Functions

qb_thread_lock_tqb_thread_lock_create (qb_thread_lock_type_t type)
 Create a new lock of the given type.
int32_t qb_thread_lock (qb_thread_lock_t *tl)
 Calls either pthread_mutex_lock() or pthread_spin_lock().
int32_t qb_thread_trylock (qb_thread_lock_t *tl)
 Calls either pthread_mutex_trylock() or pthread_spin_trylock().
int32_t qb_thread_unlock (qb_thread_lock_t *tl)
 Calls either pthread_mutex_unlock() or pthread_spin_unlock.
int32_t qb_thread_lock_destroy (qb_thread_lock_t *tl)
 Calls either pthread_mutex_destro() or pthread_spin_destroy().
void qb_util_set_log_function (qb_util_log_fn_t fn)
 Use this function to output libqb internal log message as you wish.
void qb_timespec_add_ms (struct timespec *ts, int32_t ms)
 Add milliseconds onto the timespec.
uint64_t qb_util_nano_current_get (void)
 Get the current number of nano secounds produced by the systems incrementing clock (CLOCK_MONOTOMIC if available).
uint64_t qb_util_nano_monotonic_hz (void)
 Get the frequence of the clock used in qb_util_nano_current_get().
uint64_t qb_util_nano_from_epoch_get (void)
 Get the time in nano seconds since epoch.
void qb_util_timespec_from_epoch_get (struct timespec *ts)
 Get the time in timespec since epoch.
char * qb_strerror_r (int errnum, char *buf, size_t buflen)
 strerror_r replacement.
qb_util_stopwatch_tqb_util_stopwatch_create (void)
 Create a Stopwatch (to time operations).
void qb_util_stopwatch_free (qb_util_stopwatch_t *sw)
 Free the stopwatch.
void qb_util_stopwatch_start (qb_util_stopwatch_t *sw)
 Start the stopwatch.
void qb_util_stopwatch_stop (qb_util_stopwatch_t *sw)
 Stop the stopwatch.
uint64_t qb_util_stopwatch_us_elapsed_get (qb_util_stopwatch_t *sw)
 Get the elapsed time in micro seconds.
float qb_util_stopwatch_sec_elapsed_get (qb_util_stopwatch_t *sw)
 Get the elapsed time in seconds.
int32_t qb_util_stopwatch_split_ctl (qb_util_stopwatch_t *sw, uint32_t max_splits, uint32_t options)
uint64_t qb_util_stopwatch_split (qb_util_stopwatch_t *sw)
 Create a new time split (or lap time).
uint32_t qb_util_stopwatch_split_last (qb_util_stopwatch_t *sw)
 Get the last split index to be used by qb_util_stopwatch_time_split_get().
uint64_t qb_util_stopwatch_time_split_get (qb_util_stopwatch_t *sw, uint32_t receint, uint32_t older)
 Read the time split (in us) from "receint" to "older".
+

Detailed Description

+

These are some convience functions used throughout libqb.

+
Author:
Angus Salkeld <asalkeld@redhat.com>
+
Locking
+
+
Time functions
+
+
Basic Stopwatch
 uint64_t elapsed1;
+ uint64_t elapsed2;
+ qb_util_stopwatch_t *sw = qb_util_stopwatch_create();
+
+ qb_util_stopwatch_start(sw);
+
+ usleep(sometime);
+ qb_util_stopwatch_stop(sw);
+ elapsed1 = qb_util_stopwatch_us_elapsed_get(sw);
+
+ usleep(somemoretime);
+ qb_util_stopwatch_stop(sw);
+ elapsed2 = qb_util_stopwatch_us_elapsed_get(sw);
+
+ qb_util_stopwatch_free(sw);
+
+
Stopwatch with splits
Setup a stopwatch with space for 3 splits.
+
 uint64_t split;
+ qb_util_stopwatch_t *sw = qb_util_stopwatch_create();
+
+ qb_util_stopwatch_split_ctl(sw, 3, 0);
+ qb_util_stopwatch_start(sw);
+
+ usleep(sometime);
+ qb_util_stopwatch_split(sw);
+
+ usleep(somemoretime);
+ qb_util_stopwatch_split(sw);
+
+ usleep(somemoretime);
+ qb_util_stopwatch_split(sw);
+
+ idx = qb_util_stopwatch_split_last(sw);
+ do {
+      split = qb_util_stopwatch_time_split_get(sw, idx, idx);
+      qb_log(LOG_INFO, "split %d is %"PRIu64"", last, split);
+      idx--;
+ } while (split > 0);
+
+ split = qb_util_stopwatch_time_split_get(sw, 2, 1);
+ qb_log(LOG_INFO, "time between second and third split is %"PRIu64"", split);
+
+ qb_util_stopwatch_free(sw);
+

Define Documentation

+ +
+
+ + + + +
#define QB_UTIL_SW_OVERWRITE   0x01
+
+
+ +
+
+

Typedef Documentation

+ +
+
+ + + + +
typedef struct qb_thread_lock_s qb_thread_lock_t
+
+
+ +
+
+ +
+
+ + + + +
typedef void(* qb_util_log_fn_t)(const char *file_name, int32_t file_line, int32_t severity, const char *msg)
+
+
+ +
+
+ +
+
+ + + + +
typedef struct qb_util_stopwatch qb_util_stopwatch_t
+
+
+
Examples:
ipcclient.c.
+
+
+
+

Enumeration Type Documentation

+ +
+
+ + + + +
enum qb_thread_lock_type_t
+
+
+ +

QB_THREAD_LOCK_SHORT is a short term lock (spinlock if available on your system) QB_THREAD_LOCK_LONG is a mutex.

+
Enumerator:
+ + +
QB_THREAD_LOCK_SHORT  +
QB_THREAD_LOCK_LONG  +
+
+
+ +
+
+

Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
char* qb_strerror_r (int  errnum,
char *  buf,
size_t  buflen 
)
+
+
+ +

strerror_r replacement.

+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_thread_lock (qb_thread_lock_t tl ) 
+
+
+ +

Calls either pthread_mutex_lock() or pthread_spin_lock().

+ +
+
+ +
+
+ + + + + + + + + +
qb_thread_lock_t* qb_thread_lock_create (qb_thread_lock_type_t  type ) 
+
+
+ +

Create a new lock of the given type.

+
Parameters:
+ + +
type QB_THREAD_LOCK_SHORT == spinlock (where available, else mutex) QB_THREAD_LOCK_LONG == mutex
+
+
+
Returns:
pointer to qb_thread_lock_type_t or NULL on error.
+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_thread_lock_destroy (qb_thread_lock_t tl ) 
+
+
+ +

Calls either pthread_mutex_destro() or pthread_spin_destroy().

+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_thread_trylock (qb_thread_lock_t tl ) 
+
+
+ +

Calls either pthread_mutex_trylock() or pthread_spin_trylock().

+ +
+
+ +
+
+ + + + + + + + + +
int32_t qb_thread_unlock (qb_thread_lock_t tl ) 
+
+
+ +

Calls either pthread_mutex_unlock() or pthread_spin_unlock.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void qb_timespec_add_ms (struct timespec *  ts,
int32_t  ms 
)
+
+
+ +

Add milliseconds onto the timespec.

+
Parameters:
+ + + +
ts the ts to add to
ms the amount of milliseconds to increment ts
+
+
+ +
+
+ +
+
+ + + + + + + + + +
uint64_t qb_util_nano_current_get (void  ) 
+
+
+ +

Get the current number of nano secounds produced by the systems incrementing clock (CLOCK_MONOTOMIC if available).

+ +
+
+ +
+
+ + + + + + + + + +
uint64_t qb_util_nano_from_epoch_get (void  ) 
+
+
+ +

Get the time in nano seconds since epoch.

+ +
+
+ +
+
+ + + + + + + + + +
uint64_t qb_util_nano_monotonic_hz (void  ) 
+
+
+ +

Get the frequence of the clock used in qb_util_nano_current_get().

+ +
+
+ +
+
+ + + + + + + + + +
void qb_util_set_log_function (qb_util_log_fn_t  fn ) 
+
+
+ +

Use this function to output libqb internal log message as you wish.

+ +
+
+ +
+
+ + + + + + + + + +
qb_util_stopwatch_t* qb_util_stopwatch_create (void  ) 
+
+
+ +

Create a Stopwatch (to time operations).

+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_util_stopwatch_free (qb_util_stopwatch_t sw ) 
+
+
+ +

Free the stopwatch.

+ +
+
+ +
+
+ + + + + + + + + +
float qb_util_stopwatch_sec_elapsed_get (qb_util_stopwatch_t sw ) 
+
+
+ +

Get the elapsed time in seconds.

+

(it must have been started and stopped).

+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + +
uint64_t qb_util_stopwatch_split (qb_util_stopwatch_t sw ) 
+
+
+ +

Create a new time split (or lap time).

+
Parameters:
+ + +
sw the stopwatch
+
+
+
Return values:
+ + + +
the relative split time in micro seconds
0 if no more splits available
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int32_t qb_util_stopwatch_split_ctl (qb_util_stopwatch_t sw,
uint32_t  max_splits,
uint32_t  options 
)
+
+
+
Parameters:
+ + + + +
sw the stopwatch
max_splits maximum number of time splits
options (0 or QB_UTIL_SW_OVERWRITE )
+
+
+
Return values:
+ + + +
0 on success
-errno on failure
+
+
+ +
+
+ +
+
+ + + + + + + + + +
uint32_t qb_util_stopwatch_split_last (qb_util_stopwatch_t sw ) 
+
+
+ +

Get the last split index to be used by qb_util_stopwatch_time_split_get().

+
Note:
this is zero based
+
Parameters:
+ + +
sw the stopwatch
+
+
+
Returns:
the last entry index
+ +
+
+ +
+
+ + + + + + + + + +
void qb_util_stopwatch_start (qb_util_stopwatch_t sw ) 
+
+
+ +

Start the stopwatch.

+

This also acts as a reset. Essentially it sets the starting time and clears the splits.

+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + +
void qb_util_stopwatch_stop (qb_util_stopwatch_t sw ) 
+
+
+ +

Stop the stopwatch.

+

This just allows you to get the elapsed time. So you can call this multiple times. Do not call qb_util_stopwatch_start() unless you want to reset the stopwatch.

+
Examples:
ipcclient.c.
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
uint64_t qb_util_stopwatch_time_split_get (qb_util_stopwatch_t sw,
uint32_t  receint,
uint32_t  older 
)
+
+
+ +

Read the time split (in us) from "receint" to "older".

+

If older == receint then the cumulated split will be returned (from the stopwatch start).

+
Parameters:
+ + + + +
sw the stopwatch
receint split
older split
+
+
+
Return values:
+ + + +
the split time in micro seconds
0 if not a valid split
+
+
+ +
+
+ +
+
+ + + + + + + + + +
uint64_t qb_util_stopwatch_us_elapsed_get (qb_util_stopwatch_t sw ) 
+
+
+ +

Get the elapsed time in micro seconds.

+

(it must have been started and stopped).

+ +
+
+ +
+
+ + + + + + + + + +
void qb_util_timespec_from_epoch_get (struct timespec *  ts ) 
+
+
+ +

Get the time in timespec since epoch.

+
Parameters:
+ + +
ts (out) the timespec
+
+
+
Returns:
status (0 == ok, -errno on error)
+ +
+
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/qbutil_8h__dep__incl.map b/1.0rc3/doxygen/qbutil_8h__dep__incl.map new file mode 100644 index 000000000..598aca258 --- /dev/null +++ b/1.0rc3/doxygen/qbutil_8h__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/1.0rc3/doxygen/qbutil_8h__dep__incl.md5 b/1.0rc3/doxygen/qbutil_8h__dep__incl.md5 new file mode 100644 index 000000000..d950cb233 --- /dev/null +++ b/1.0rc3/doxygen/qbutil_8h__dep__incl.md5 @@ -0,0 +1 @@ +e42015502272f70df24372c7e7f6d3fa \ No newline at end of file diff --git a/1.0rc3/doxygen/qbutil_8h__dep__incl.png b/1.0rc3/doxygen/qbutil_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..5b64c24bf0f63a83badf40685999cfd4b1b7f249 GIT binary patch literal 2336 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 + + diff --git a/1.0rc3/doxygen/qbutil_8h__incl.md5 b/1.0rc3/doxygen/qbutil_8h__incl.md5 new file mode 100644 index 000000000..2287d3bd9 --- /dev/null +++ b/1.0rc3/doxygen/qbutil_8h__incl.md5 @@ -0,0 +1 @@ +caaaaa41644f520dafa00d2735bf5d6b \ No newline at end of file diff --git a/1.0rc3/doxygen/qbutil_8h__incl.png b/1.0rc3/doxygen/qbutil_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8dfec7597005e25ec5862ef4d988ffe19a2fa135 GIT binary patch literal 8487 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 literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/search/all_5f.html b/1.0rc3/doxygen/search/all_5f.html new file mode 100644 index 000000000..de5b4601b --- /dev/null +++ b/1.0rc3/doxygen/search/all_5f.html @@ -0,0 +1,44 @@ + + + + + + + +
+
Loading...
+ +
+
+ __start___verbose + qblog.h +
+
+
+
+ __stop___verbose + qblog.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_61.html b/1.0rc3/doxygen/search/all_61.html new file mode 100644 index 000000000..8bf518690 --- /dev/null +++ b/1.0rc3/doxygen/search/all_61.html @@ -0,0 +1,35 @@ + + + + + + + +
+
Loading...
+
+
+ active_connections + qb_ipcs_stats +
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_63.html b/1.0rc3/doxygen/search/all_63.html new file mode 100644 index 000000000..b0743917b --- /dev/null +++ b/1.0rc3/doxygen/search/all_63.html @@ -0,0 +1,65 @@ + + + + + + + +
+
Loading...
+
+
+ check + qb_hdb_handle +
+
+ +
+
+ closed_connections + qb_ipcs_stats +
+
+
+
+ connection_accept + qb_ipcs_service_handlers +
+
+
+
+ connection_closed + qb_ipcs_service_handlers +
+
+
+
+ connection_created + qb_ipcs_service_handlers +
+
+
+
+ connection_destroyed + qb_ipcs_service_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_64.html b/1.0rc3/doxygen/search/all_64.html new file mode 100644 index 000000000..1065cb952 --- /dev/null +++ b/1.0rc3/doxygen/search/all_64.html @@ -0,0 +1,44 @@ + + + + + + + +
+
Loading...
+
+
+ destructor + qb_hdb +
+
+
+
+ dispatch_add + qb_ipcs_poll_handlers +
+
+
+
+ dispatch_del + qb_ipcs_poll_handlers +
+
+
+
+ dispatch_mod + qb_ipcs_poll_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_65.html b/1.0rc3/doxygen/search/all_65.html new file mode 100644 index 000000000..93f934656 --- /dev/null +++ b/1.0rc3/doxygen/search/all_65.html @@ -0,0 +1,35 @@ + + + + + + + +
+
Loading...
+
+
+ event_q_length + qb_ipcs_connection_stats_2 +
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_66.html b/1.0rc3/doxygen/search/all_66.html new file mode 100644 index 000000000..0c355bbe9 --- /dev/null +++ b/1.0rc3/doxygen/search/all_66.html @@ -0,0 +1,62 @@ + + + + + + + +
+
Loading...
+
+
+ filename + qb_log_callsite +
+
+
+
+ first_run + qb_hdb +
+
+ + +
+
+ format + qb_log_callsite +
+
+
+
+ function + qb_log_callsite +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_68.html b/1.0rc3/doxygen/search/all_68.html new file mode 100644 index 000000000..e2dff7085 --- /dev/null +++ b/1.0rc3/doxygen/search/all_68.html @@ -0,0 +1,38 @@ + + + + + + + +
+
Loading...
+
+
+ handle_count + qb_hdb +
+
+
+
+ handles + qb_hdb +
+
+
+
+ HZ + qbdefs.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_69.html b/1.0rc3/doxygen/search/all_69.html new file mode 100644 index 000000000..cc7cb96ef --- /dev/null +++ b/1.0rc3/doxygen/search/all_69.html @@ -0,0 +1,38 @@ + + + + + + + +
+
Loading...
+
+
+ i32 + qb_log_ctl2_arg_t +
+
+
+
+ instance + qb_hdb_handle +
+
+
+
+ iterator + qb_hdb +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_6a.html b/1.0rc3/doxygen/search/all_6a.html new file mode 100644 index 000000000..f63d5f6eb --- /dev/null +++ b/1.0rc3/doxygen/search/all_6a.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ job_add + qb_ipcs_poll_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_6c.html b/1.0rc3/doxygen/search/all_6c.html new file mode 100644 index 000000000..55b246cc1 --- /dev/null +++ b/1.0rc3/doxygen/search/all_6c.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ lineno + qb_log_callsite +
+
+
+
+ LOG_TRACE + qblog.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_6d.html b/1.0rc3/doxygen/search/all_6d.html new file mode 100644 index 000000000..63eb90500 --- /dev/null +++ b/1.0rc3/doxygen/search/all_6d.html @@ -0,0 +1,31 @@ + + + + + + + +
+
Loading...
+
+ +
+
+
+ msg_process + qb_ipcs_service_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_6e.html b/1.0rc3/doxygen/search/all_6e.html new file mode 100644 index 000000000..9eebcafca --- /dev/null +++ b/1.0rc3/doxygen/search/all_6e.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ next + qb_list_head +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_70.html b/1.0rc3/doxygen/search/all_70.html new file mode 100644 index 000000000..b3cd5a454 --- /dev/null +++ b/1.0rc3/doxygen/search/all_70.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ prev + qb_list_head +
+
+
+
+ priority + qb_log_callsite +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_71.html b/1.0rc3/doxygen/search/all_71.html new file mode 100644 index 000000000..cb96cf505 --- /dev/null +++ b/1.0rc3/doxygen/search/all_71.html @@ -0,0 +1,2274 @@ + + + + + + + +
+
Loading...
+
+
+ QB_ABS + qbdefs.h +
+
+
+
+ qb_array_create + qbarray.h +
+
+
+
+ qb_array_create_2 + qbarray.h +
+
+
+
+ qb_array_elems_per_bin_get + qbarray.h +
+
+
+
+ qb_array_free + qbarray.h +
+
+
+
+ qb_array_grow + qbarray.h +
+
+
+
+ qb_array_index + qbarray.h +
+
+
+
+ qb_array_new_bin_cb_fn + qbarray.h +
+
+
+
+ qb_array_new_bin_cb_set + qbarray.h +
+
+
+
+ qb_array_num_bins_get + qbarray.h +
+
+
+
+ qb_array_t + qbarray.h +
+
+
+
+ qb_atomic_init + qbatomic.h +
+
+
+
+ qb_atomic_int_add + qbatomic.h +
+
+ +
+
+ qb_atomic_int_dec_and_test + qbatomic.h +
+
+
+ +
+ +
+
+ qb_atomic_int_inc + qbatomic.h +
+
+ + + + + +
+
+ qb_bit_clear + qbdefs.h +
+
+
+
+ qb_bit_is_clear + qbdefs.h +
+
+
+
+ qb_bit_is_set + qbdefs.h +
+
+
+
+ qb_bit_set + qbdefs.h +
+
+
+
+ qb_bit_value + qbdefs.h +
+
+
+
+ qb_enter + qblog.h +
+
+
+
+ QB_FALSE + qbdefs.h +
+
+
+
+ QB_GNUC_DEPRECATED + qbdefs.h +
+
+
+
+ QB_GNUC_DEPRECATED_FOR + qbdefs.h +
+
+
+
+ QB_GNUC_MAY_ALIAS + qbdefs.h +
+
+
+
+ qb_handle_t + qbhdb.h +
+
+
+
+ qb_hashtable_create + qbmap.h +
+
+
+
+ QB_HAVE_ATTRIBUTE_SECTION + qbconfig.h +
+
+
+
+ qb_hdb +
+
+
+
+ qb_hdb_base_convert + qbhdb.h +
+
+
+
+ qb_hdb_create + qbhdb.h +
+
+
+
+ QB_HDB_D_FORMAT + qbhdb.h +
+
+
+
+ QB_HDB_DECLARE + qbhdb.h +
+
+
+
+ qb_hdb_destroy + qbhdb.h +
+
+
+ +
+
+
+ qb_hdb_handle_create + qbhdb.h +
+
+
+
+ qb_hdb_handle_destroy + qbhdb.h +
+
+
+
+ qb_hdb_handle_get + qbhdb.h +
+
+
+
+ qb_hdb_handle_get_always + qbhdb.h +
+
+
+
+ qb_hdb_handle_put + qbhdb.h +
+
+
+ +
+
+
+ qb_hdb_iterator_next + qbhdb.h +
+
+
+
+ qb_hdb_iterator_reset + qbhdb.h +
+
+
+
+ qb_hdb_nocheck_convert + qbhdb.h +
+
+
+
+ QB_HDB_X_FORMAT + qbhdb.h +
+
+
+
+ QB_INIT_LIST_HEAD + qblist.h +
+
+
+
+ QB_IPC_MSG_AUTHENTICATE + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_DISCONNECT + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_NEW_EVENT_SOCK + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_NEW_MESSAGE + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_USER_START + qbipc_common.h +
+
+
+
+ QB_IPC_NATIVE + qbipc_common.h +
+
+
+
+ QB_IPC_POSIX_MQ + qbipc_common.h +
+
+ + +
+
+ QB_IPC_SHM + qbipc_common.h +
+
+
+
+ QB_IPC_SOCKET + qbipc_common.h +
+
+
+
+ QB_IPC_SYSV_MQ + qbipc_common.h +
+
+
+
+ qb_ipc_type + qbipc_common.h +
+
+
+
+ qb_ipcc_connect + qbipcc.h +
+
+
+
+ qb_ipcc_connection_t + qbipcc.h +
+
+
+
+ qb_ipcc_context_get + qbipcc.h +
+
+
+
+ qb_ipcc_context_set + qbipcc.h +
+
+
+
+ qb_ipcc_disconnect + qbipcc.h +
+
+
+
+ qb_ipcc_event_recv + qbipcc.h +
+
+
+
+ qb_ipcc_fc_enable_max_set + qbipcc.h +
+
+
+
+ qb_ipcc_fd_get + qbipcc.h +
+
+
+
+ qb_ipcc_get_buffer_size + qbipcc.h +
+
+
+
+ qb_ipcc_is_connected + qbipcc.h +
+
+
+
+ qb_ipcc_recv + qbipcc.h +
+
+
+
+ qb_ipcc_send + qbipcc.h +
+
+
+
+ qb_ipcc_sendv + qbipcc.h +
+
+
+
+ qb_ipcc_sendv_recv + qbipcc.h +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ qb_ipcs_connection_ref + qbipcs.h +
+
+ + + +
+ +
+
+ +
+
+
+ qb_ipcs_connection_t + qbipcs.h +
+
+
+
+ qb_ipcs_connection_unref + qbipcs.h +
+
+
+
+ qb_ipcs_context_get + qbipcs.h +
+
+
+
+ qb_ipcs_context_set + qbipcs.h +
+
+
+
+ qb_ipcs_create + qbipcs.h +
+
+
+
+ qb_ipcs_destroy + qbipcs.h +
+
+
+
+ qb_ipcs_disconnect + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_add_fn + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_del_fn + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_fn_t + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_mod_fn + qbipcs.h +
+
+
+ +
+
+
+ qb_ipcs_event_send + qbipcs.h +
+
+
+
+ qb_ipcs_event_sendv + qbipcs.h +
+
+
+
+ qb_ipcs_job_add_fn + qbipcs.h +
+
+
+
+ qb_ipcs_msg_process_fn + qbipcs.h +
+
+ +
+
+ qb_ipcs_poll_handlers_set + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_FAST + qbipcs.h +
+
+
+
+ qb_ipcs_rate_limit + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_NORMAL + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_OFF + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_OFF_2 + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_SLOW + qbipcs.h +
+
+
+
+ qb_ipcs_ref + qbipcs.h +
+
+
+ +
+
+
+ qb_ipcs_response_send + qbipcs.h +
+
+
+
+ qb_ipcs_response_sendv + qbipcs.h +
+
+
+
+ qb_ipcs_run + qbipcs.h +
+
+
+ +
+
+ +
+ +
+
+ qb_ipcs_service_id_get + qbipcs.h +
+
+
+
+ qb_ipcs_service_t + qbipcs.h +
+
+
+ +
+
+
+ qb_ipcs_stats_get + qbipcs.h +
+
+
+
+ qb_ipcs_unref + qbipcs.h +
+
+
+
+ qb_leave + qblog.h +
+
+
+
+ qb_list_add + qblist.h +
+
+
+
+ qb_list_add_tail + qblist.h +
+
+
+
+ QB_LIST_DECLARE + qblist.h +
+
+
+
+ qb_list_del + qblist.h +
+
+
+
+ qb_list_empty + qblist.h +
+
+
+
+ qb_list_entry + qblist.h +
+
+
+
+ qb_list_first_entry + qblist.h +
+
+
+
+ qb_list_for_each + qblist.h +
+
+
+
+ qb_list_for_each_entry + qblist.h +
+
+
+ +
+
+ +
+
+ +
+ +
+
+ qb_list_for_each_reverse + qblist.h +
+
+
+
+ qb_list_for_each_safe + qblist.h +
+
+
+ +
+
+
+ qb_list_init + qblist.h +
+
+
+
+ qb_list_is_last + qblist.h +
+
+
+
+ qb_list_length + qblist.h +
+
+
+
+ qb_list_replace + qblist.h +
+
+
+
+ qb_list_splice + qblist.h +
+
+
+
+ qb_list_splice_tail + qblist.h +
+
+
+
+ qb_log + qblog.h +
+
+
+
+ QB_LOG_BLACKBOX + qblog.h +
+
+ + + +
+
+ qb_log_callsite_get + qblog.h +
+
+
+
+ qb_log_callsites_dump + qblog.h +
+
+
+ +
+
+
+ qb_log_close_fn + qblog.h +
+
+
+
+ qb_log_conf + qblog.h +
+
+
+
+ QB_LOG_CONF_DEBUG + qblog.h +
+
+
+
+ QB_LOG_CONF_ENABLED + qblog.h +
+
+
+
+ QB_LOG_CONF_EXTENDED + qblog.h +
+
+
+
+ QB_LOG_CONF_FACILITY + qblog.h +
+
+
+
+ QB_LOG_CONF_FILE_SYNC + qblog.h +
+
+
+
+ QB_LOG_CONF_IDENT + qblog.h +
+
+
+ +
+
+
+ QB_LOG_CONF_SIZE + qblog.h +
+
+
+
+ QB_LOG_CONF_STATE_GET + qblog.h +
+
+
+
+ QB_LOG_CONF_THREADED + qblog.h +
+
+
+
+ qb_log_ctl + qblog.h +
+
+
+
+ qb_log_ctl2 + qblog.h +
+
+ +
+
+ QB_LOG_CTL2_I32 + qblog.h +
+
+
+
+ QB_LOG_CTL2_S + qblog.h +
+
+
+
+ qb_log_custom_close + qblog.h +
+
+
+
+ qb_log_custom_open + qblog.h +
+
+
+
+ qb_log_facility2int + qblog.h +
+
+
+
+ qb_log_facility2str + qblog.h +
+
+
+
+ qb_log_file_close + qblog.h +
+
+
+
+ qb_log_file_open + qblog.h +
+
+
+
+ QB_LOG_FILTER_ADD + qblog.h +
+
+
+
+ QB_LOG_FILTER_CLEAR_ALL + qblog.h +
+
+
+
+ qb_log_filter_conf + qblog.h +
+
+
+
+ qb_log_filter_ctl + qblog.h +
+
+
+
+ qb_log_filter_ctl2 + qblog.h +
+
+
+
+ QB_LOG_FILTER_FILE + qblog.h +
+
+
+
+ QB_LOG_FILTER_FILE_REGEX + qblog.h +
+
+
+
+ qb_log_filter_fn + qblog.h +
+
+
+
+ qb_log_filter_fn_set + qblog.h +
+
+
+
+ QB_LOG_FILTER_FORMAT + qblog.h +
+
+
+ +
+
+
+ QB_LOG_FILTER_FUNCTION + qblog.h +
+
+
+ +
+
+
+ QB_LOG_FILTER_REMOVE + qblog.h +
+
+
+
+ qb_log_filter_type + qblog.h +
+
+
+
+ qb_log_fini + qblog.h +
+
+
+
+ qb_log_format_set + qblog.h +
+
+
+ +
+ +
+
+ qb_log_init + qblog.h +
+
+
+
+ QB_LOG_INIT_DATA + qblog.h +
+
+
+
+ qb_log_logger_fn + qblog.h +
+
+
+
+ QB_LOG_MAX_LEN + qblog.h +
+
+
+
+ qb_log_real_ + qblog.h +
+
+
+
+ qb_log_real_va_ + qblog.h +
+
+
+
+ qb_log_reload_fn + qblog.h +
+
+
+
+ QB_LOG_STATE_DISABLED + qblog.h +
+
+
+
+ QB_LOG_STATE_ENABLED + qblog.h +
+
+
+
+ QB_LOG_STATE_UNUSED + qblog.h +
+
+
+
+ QB_LOG_STDERR + qblog.h +
+
+
+
+ QB_LOG_STDOUT + qblog.h +
+
+
+
+ QB_LOG_STRERROR_MAX_LEN + qblog.h +
+
+
+
+ QB_LOG_SYSLOG + qblog.h +
+
+
+
+ QB_LOG_TAG_CLEAR + qblog.h +
+
+
+
+ QB_LOG_TAG_CLEAR_ALL + qblog.h +
+
+
+
+ QB_LOG_TAG_LIBQB_MSG + qblog.h +
+
+
+
+ QB_LOG_TAG_LIBQB_MSG_BIT + qblog.h +
+
+
+
+ QB_LOG_TAG_SET + qblog.h +
+
+
+
+ qb_log_tags_stringify_fn + qblog.h +
+
+
+ +
+
+ +
+
+ +
+
+
+ QB_LOG_TARGET_END + qblog.h +
+
+
+
+ qb_log_target_format + qblog.h +
+
+
+
+ QB_LOG_TARGET_MAX + qblog.h +
+
+
+
+ qb_log_target_slot + qblog.h +
+
+
+
+ QB_LOG_TARGET_START + qblog.h +
+
+
+
+ qb_log_target_state + qblog.h +
+
+
+
+ QB_LOG_TARGET_STATIC_END + qblog.h +
+
+
+
+ QB_LOG_TARGET_STATIC_MAX + qblog.h +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ qb_log_thread_start + qblog.h +
+
+
+
+ qb_log_vlogger_fn + qblog.h +
+
+
+
+ qb_logt + qblog.h +
+
+
+
+ qb_loop_create + qbloop.h +
+
+
+
+ qb_loop_destroy + qbloop.h +
+
+
+
+ QB_LOOP_HIGH + qbloop.h +
+
+
+
+ qb_loop_job_add + qbloop.h +
+
+
+
+ qb_loop_job_del + qbloop.h +
+
+
+
+ qb_loop_job_dispatch_fn + qbloop.h +
+
+
+
+ QB_LOOP_LOW + qbloop.h +
+
+
+
+ QB_LOOP_MED + qbloop.h +
+
+
+
+ qb_loop_poll_add + qbloop.h +
+
+
+
+ qb_loop_poll_del + qbloop.h +
+
+
+
+ qb_loop_poll_dispatch_fn + qbloop.h +
+
+
+ +
+
+ +
+
+
+ qb_loop_poll_mod + qbloop.h +
+
+
+
+ qb_loop_priority + qbloop.h +
+
+
+
+ qb_loop_run + qbloop.h +
+
+
+
+ qb_loop_signal_add + qbloop.h +
+
+
+
+ qb_loop_signal_del + qbloop.h +
+
+
+ +
+
+
+ qb_loop_signal_handle + qbloop.h +
+
+
+
+ qb_loop_signal_mod + qbloop.h +
+
+
+
+ qb_loop_stop + qbloop.h +
+
+
+
+ qb_loop_t + qbloop.h +
+
+
+
+ qb_loop_timer_add + qbloop.h +
+
+
+
+ qb_loop_timer_del + qbloop.h +
+
+
+
+ qb_loop_timer_dispatch_fn + qbloop.h +
+
+
+ +
+
+
+ qb_loop_timer_handle + qbloop.h +
+
+
+
+ qb_loop_timer_is_running + qbloop.h +
+
+
+
+ qb_map_count_get + qbmap.h +
+
+
+
+ qb_map_destroy + qbmap.h +
+
+
+
+ qb_map_foreach + qbmap.h +
+
+
+
+ qb_map_get + qbmap.h +
+
+
+
+ qb_map_iter_create + qbmap.h +
+
+
+
+ qb_map_iter_free + qbmap.h +
+
+
+
+ qb_map_iter_next + qbmap.h +
+
+
+
+ qb_map_iter_t + qbmap.h +
+
+
+
+ qb_map_notify_add + qbmap.h +
+
+
+
+ qb_map_notify_del + qbmap.h +
+
+
+
+ qb_map_notify_del_2 + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_DELETED + qbmap.h +
+
+
+
+ qb_map_notify_fn + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_FREE + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_INSERTED + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_RECURSIVE + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_REPLACED + qbmap.h +
+
+
+
+ qb_map_pref_iter_create + qbmap.h +
+
+
+
+ qb_map_put + qbmap.h +
+
+
+
+ qb_map_rm + qbmap.h +
+
+
+
+ qb_map_t + qbmap.h +
+
+
+
+ qb_map_transverse_fn + qbmap.h +
+
+
+
+ QB_MAX + qbdefs.h +
+
+
+
+ QB_MIN + qbdefs.h +
+
+
+
+ qb_perror + qblog.h +
+
+
+
+ qb_rb_chmod + qbrb.h +
+
+
+
+ qb_rb_chown + qbrb.h +
+
+
+
+ qb_rb_chunk_alloc + qbrb.h +
+
+
+
+ qb_rb_chunk_commit + qbrb.h +
+
+
+
+ qb_rb_chunk_peek + qbrb.h +
+
+
+
+ qb_rb_chunk_read + qbrb.h +
+
+
+
+ qb_rb_chunk_reclaim + qbrb.h +
+
+
+
+ qb_rb_chunk_write + qbrb.h +
+
+
+
+ qb_rb_chunks_used + qbrb.h +
+
+
+
+ qb_rb_close + qbrb.h +
+
+
+
+ qb_rb_create_from_file + qbrb.h +
+
+
+
+ QB_RB_FLAG_CREATE + qbrb.h +
+
+
+ +
+
+
+ QB_RB_FLAG_OVERWRITE + qbrb.h +
+
+
+ +
+
+ +
+
+
+ qb_rb_name_get + qbrb.h +
+
+
+
+ qb_rb_open + qbrb.h +
+
+
+
+ qb_rb_refcount_get + qbrb.h +
+
+
+ +
+
+
+ qb_rb_space_free + qbrb.h +
+
+
+
+ qb_rb_space_used + qbrb.h +
+
+
+
+ qb_rb_write_to_file + qbrb.h +
+
+
+
+ qb_ringbuffer_t + qbrb.h +
+
+
+
+ QB_ROUNDUP + qbdefs.h +
+
+
+
+ qb_skiplist_create + qbmap.h +
+
+
+
+ qb_strerror_r + qbutil.h +
+
+
+
+ qb_thread_lock + qbutil.h +
+
+
+
+ qb_thread_lock_create + qbutil.h +
+
+
+
+ qb_thread_lock_destroy + qbutil.h +
+
+
+
+ QB_THREAD_LOCK_LONG + qbutil.h +
+
+
+
+ QB_THREAD_LOCK_SHORT + qbutil.h +
+
+
+
+ qb_thread_lock_t + qbutil.h +
+
+
+
+ qb_thread_lock_type_t + qbutil.h +
+
+
+
+ qb_thread_trylock + qbutil.h +
+
+
+
+ qb_thread_unlock + qbutil.h +
+
+
+
+ QB_TIME_MS_IN_SEC + qbdefs.h +
+
+
+
+ QB_TIME_NS_IN_MSEC + qbdefs.h +
+
+
+
+ QB_TIME_NS_IN_SEC + qbdefs.h +
+
+
+
+ QB_TIME_NS_IN_USEC + qbdefs.h +
+
+
+
+ QB_TIME_US_IN_MSEC + qbdefs.h +
+
+
+
+ QB_TIME_US_IN_SEC + qbdefs.h +
+
+
+
+ qb_timespec_add_ms + qbutil.h +
+
+
+
+ qb_trie_create + qbmap.h +
+
+
+
+ qb_trie_dump + qbmap.h +
+
+
+
+ QB_TRUE + qbdefs.h +
+
+
+
+ qb_util_log_fn_t + qbutil.h +
+
+
+
+ qb_util_nano_current_get + qbutil.h +
+
+
+ +
+
+
+ qb_util_nano_monotonic_hz + qbutil.h +
+
+
+
+ qb_util_set_log_function + qbutil.h +
+
+
+
+ qb_util_stopwatch_create + qbutil.h +
+
+
+
+ qb_util_stopwatch_free + qbutil.h +
+
+ +
+
+ qb_util_stopwatch_split + qbutil.h +
+
+
+ +
+
+ +
+
+
+ qb_util_stopwatch_start + qbutil.h +
+
+
+
+ qb_util_stopwatch_stop + qbutil.h +
+
+
+
+ qb_util_stopwatch_t + qbutil.h +
+
+ + +
+
+ QB_UTIL_SW_OVERWRITE + qbutil.h +
+
+ +
+
+ QB_XC + qblog.h +
+
+
+
+ QB_XS + qblog.h +
+
+
+
+ qbarray.h +
+
+
+ +
+
+ +
+
+
+ qbdefs.h +
+
+
+
+ qbhdb.h +
+
+ +
+
+ qbipcc.h +
+
+
+
+ qbipcs.h +
+
+
+
+ qblist.h +
+
+
+
+ qblog.h +
+
+
+
+ qbloop.h +
+
+
+
+ qbmap.h +
+
+
+
+ qbrb.h +
+
+
+
+ qbutil.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_72.html b/1.0rc3/doxygen/search/all_72.html new file mode 100644 index 000000000..4ee951593 --- /dev/null +++ b/1.0rc3/doxygen/search/all_72.html @@ -0,0 +1,53 @@ + + + + + + + +
+
Loading...
+ +
+
+ ref_count + qb_hdb_handle +
+
+ + +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_73.html b/1.0rc3/doxygen/search/all_73.html new file mode 100644 index 000000000..889da5102 --- /dev/null +++ b/1.0rc3/doxygen/search/all_73.html @@ -0,0 +1,41 @@ + + + + + + + +
+
Loading...
+
+
+ s + qb_log_ctl2_arg_t +
+
+ +
+
+ state + qb_hdb_handle +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/all_74.html b/1.0rc3/doxygen/search/all_74.html new file mode 100644 index 000000000..eb8929744 --- /dev/null +++ b/1.0rc3/doxygen/search/all_74.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ tags + qb_log_callsite +
+
+
+
+ targets + qb_log_callsite +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/classes_71.html b/1.0rc3/doxygen/search/classes_71.html new file mode 100644 index 000000000..1d1ae132c --- /dev/null +++ b/1.0rc3/doxygen/search/classes_71.html @@ -0,0 +1,80 @@ + + + + + + + +
+
Loading...
+
+
+ qb_hdb +
+
+
+ +
+ + + + + + +
+ +
+
+ +
+ + +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/close.png b/1.0rc3/doxygen/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/search/defines_68.html b/1.0rc3/doxygen/search/defines_68.html new file mode 100644 index 000000000..620ee75e6 --- /dev/null +++ b/1.0rc3/doxygen/search/defines_68.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ HZ + qbdefs.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/defines_6c.html b/1.0rc3/doxygen/search/defines_6c.html new file mode 100644 index 000000000..e62e012a8 --- /dev/null +++ b/1.0rc3/doxygen/search/defines_6c.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ LOG_TRACE + qblog.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/defines_71.html b/1.0rc3/doxygen/search/defines_71.html new file mode 100644 index 000000000..c127d02e1 --- /dev/null +++ b/1.0rc3/doxygen/search/defines_71.html @@ -0,0 +1,458 @@ + + + + + + + +
+
Loading...
+
+
+ QB_ABS + qbdefs.h +
+
+
+
+ qb_atomic_int_dec_and_test + qbatomic.h +
+
+
+
+ qb_atomic_int_get + qbatomic.h +
+
+
+
+ qb_atomic_int_inc + qbatomic.h +
+
+
+
+ qb_atomic_int_set + qbatomic.h +
+
+ +
+
+ qb_atomic_pointer_get + qbatomic.h +
+
+
+
+ qb_atomic_pointer_set + qbatomic.h +
+
+
+
+ qb_bit_clear + qbdefs.h +
+
+
+
+ qb_bit_is_clear + qbdefs.h +
+
+
+
+ qb_bit_is_set + qbdefs.h +
+
+
+
+ qb_bit_set + qbdefs.h +
+
+
+
+ qb_bit_value + qbdefs.h +
+
+
+
+ qb_enter + qblog.h +
+
+
+
+ QB_FALSE + qbdefs.h +
+
+
+
+ QB_GNUC_DEPRECATED + qbdefs.h +
+
+
+
+ QB_GNUC_DEPRECATED_FOR + qbdefs.h +
+
+
+
+ QB_GNUC_MAY_ALIAS + qbdefs.h +
+
+
+
+ QB_HAVE_ATTRIBUTE_SECTION + qbconfig.h +
+
+
+
+ QB_HDB_D_FORMAT + qbhdb.h +
+
+
+
+ QB_HDB_DECLARE + qbhdb.h +
+
+
+
+ QB_HDB_X_FORMAT + qbhdb.h +
+
+
+
+ QB_INIT_LIST_HEAD + qblist.h +
+
+
+
+ QB_IPC_MSG_AUTHENTICATE + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_DISCONNECT + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_NEW_EVENT_SOCK + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_NEW_MESSAGE + qbipc_common.h +
+
+
+
+ QB_IPC_MSG_USER_START + qbipc_common.h +
+
+
+
+ qb_leave + qblog.h +
+
+
+
+ QB_LIST_DECLARE + qblist.h +
+
+
+
+ qb_list_entry + qblist.h +
+
+
+
+ qb_list_first_entry + qblist.h +
+
+
+
+ qb_list_for_each + qblist.h +
+
+
+
+ qb_list_for_each_entry + qblist.h +
+
+
+ +
+
+ +
+
+ +
+ +
+
+ qb_list_for_each_reverse + qblist.h +
+
+
+
+ qb_list_for_each_safe + qblist.h +
+
+
+
+ qb_log + qblog.h +
+
+
+
+ QB_LOG_CTL2_I32 + qblog.h +
+
+
+
+ QB_LOG_CTL2_S + qblog.h +
+
+
+
+ QB_LOG_INIT_DATA + qblog.h +
+
+
+
+ QB_LOG_MAX_LEN + qblog.h +
+
+
+
+ QB_LOG_STRERROR_MAX_LEN + qblog.h +
+
+
+
+ QB_LOG_TAG_LIBQB_MSG + qblog.h +
+
+
+
+ QB_LOG_TAG_LIBQB_MSG_BIT + qblog.h +
+
+
+
+ qb_logt + qblog.h +
+
+
+
+ QB_MAP_NOTIFY_DELETED + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_FREE + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_INSERTED + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_RECURSIVE + qbmap.h +
+
+
+
+ QB_MAP_NOTIFY_REPLACED + qbmap.h +
+
+
+
+ QB_MAX + qbdefs.h +
+
+
+
+ QB_MIN + qbdefs.h +
+
+
+
+ qb_perror + qblog.h +
+
+
+
+ QB_RB_FLAG_CREATE + qbrb.h +
+
+
+ +
+
+
+ QB_RB_FLAG_OVERWRITE + qbrb.h +
+
+
+ +
+
+ +
+
+
+ QB_ROUNDUP + qbdefs.h +
+
+
+
+ QB_TIME_MS_IN_SEC + qbdefs.h +
+
+
+
+ QB_TIME_NS_IN_MSEC + qbdefs.h +
+
+
+
+ QB_TIME_NS_IN_SEC + qbdefs.h +
+
+
+
+ QB_TIME_NS_IN_USEC + qbdefs.h +
+
+
+
+ QB_TIME_US_IN_MSEC + qbdefs.h +
+
+
+
+ QB_TIME_US_IN_SEC + qbdefs.h +
+
+
+
+ QB_TRUE + qbdefs.h +
+
+
+
+ QB_UTIL_SW_OVERWRITE + qbutil.h +
+
+
+
+ QB_XC + qblog.h +
+
+
+
+ QB_XS + qblog.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/enums_71.html b/1.0rc3/doxygen/search/enums_71.html new file mode 100644 index 000000000..978db8628 --- /dev/null +++ b/1.0rc3/doxygen/search/enums_71.html @@ -0,0 +1,74 @@ + + + + + + + +
+
Loading...
+
+
+ qb_ipc_type + qbipc_common.h +
+
+
+
+ qb_ipcs_rate_limit + qbipcs.h +
+
+
+
+ qb_log_conf + qblog.h +
+
+
+
+ qb_log_filter_conf + qblog.h +
+
+
+
+ qb_log_filter_type + qblog.h +
+
+
+
+ qb_log_target_slot + qblog.h +
+
+
+
+ qb_log_target_state + qblog.h +
+
+
+
+ qb_loop_priority + qbloop.h +
+
+
+
+ qb_thread_lock_type_t + qbutil.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/enumvalues_71.html b/1.0rc3/doxygen/search/enumvalues_71.html new file mode 100644 index 000000000..a0fc0b01c --- /dev/null +++ b/1.0rc3/doxygen/search/enumvalues_71.html @@ -0,0 +1,332 @@ + + + + + + + +
+
Loading...
+
+
+ QB_IPC_NATIVE + qbipc_common.h +
+
+
+
+ QB_IPC_POSIX_MQ + qbipc_common.h +
+
+
+
+ QB_IPC_SHM + qbipc_common.h +
+
+
+
+ QB_IPC_SOCKET + qbipc_common.h +
+
+
+
+ QB_IPC_SYSV_MQ + qbipc_common.h +
+
+
+
+ QB_IPCS_RATE_FAST + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_NORMAL + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_OFF + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_OFF_2 + qbipcs.h +
+
+
+
+ QB_IPCS_RATE_SLOW + qbipcs.h +
+
+
+
+ QB_LOG_BLACKBOX + qblog.h +
+
+
+
+ QB_LOG_CONF_DEBUG + qblog.h +
+
+
+
+ QB_LOG_CONF_ENABLED + qblog.h +
+
+
+
+ QB_LOG_CONF_EXTENDED + qblog.h +
+
+
+
+ QB_LOG_CONF_FACILITY + qblog.h +
+
+
+
+ QB_LOG_CONF_FILE_SYNC + qblog.h +
+
+
+
+ QB_LOG_CONF_IDENT + qblog.h +
+
+
+ +
+
+
+ QB_LOG_CONF_SIZE + qblog.h +
+
+
+
+ QB_LOG_CONF_STATE_GET + qblog.h +
+
+
+
+ QB_LOG_CONF_THREADED + qblog.h +
+
+
+
+ QB_LOG_FILTER_ADD + qblog.h +
+
+
+
+ QB_LOG_FILTER_CLEAR_ALL + qblog.h +
+
+
+
+ QB_LOG_FILTER_FILE + qblog.h +
+
+
+
+ QB_LOG_FILTER_FILE_REGEX + qblog.h +
+
+
+
+ QB_LOG_FILTER_FORMAT + qblog.h +
+
+
+ +
+
+
+ QB_LOG_FILTER_FUNCTION + qblog.h +
+
+
+ +
+
+
+ QB_LOG_FILTER_REMOVE + qblog.h +
+
+
+
+ QB_LOG_STATE_DISABLED + qblog.h +
+
+
+
+ QB_LOG_STATE_ENABLED + qblog.h +
+
+
+
+ QB_LOG_STATE_UNUSED + qblog.h +
+
+
+
+ QB_LOG_STDERR + qblog.h +
+
+
+
+ QB_LOG_STDOUT + qblog.h +
+
+
+
+ QB_LOG_SYSLOG + qblog.h +
+
+
+
+ QB_LOG_TAG_CLEAR + qblog.h +
+
+
+
+ QB_LOG_TAG_CLEAR_ALL + qblog.h +
+
+
+
+ QB_LOG_TAG_SET + qblog.h +
+
+
+ +
+
+ +
+
+
+ QB_LOG_TARGET_END + qblog.h +
+
+
+
+ QB_LOG_TARGET_MAX + qblog.h +
+
+
+
+ QB_LOG_TARGET_START + qblog.h +
+
+
+
+ QB_LOG_TARGET_STATIC_END + qblog.h +
+
+
+
+ QB_LOG_TARGET_STATIC_MAX + qblog.h +
+
+
+ +
+
+
+ QB_LOOP_HIGH + qbloop.h +
+
+
+
+ QB_LOOP_LOW + qbloop.h +
+
+
+
+ QB_LOOP_MED + qbloop.h +
+
+
+
+ QB_THREAD_LOCK_LONG + qbutil.h +
+
+
+
+ QB_THREAD_LOCK_SHORT + qbutil.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/files_6d.html b/1.0rc3/doxygen/search/files_6d.html new file mode 100644 index 000000000..6ed914fe3 --- /dev/null +++ b/1.0rc3/doxygen/search/files_6d.html @@ -0,0 +1,25 @@ + + + + + + + +
+
Loading...
+
+ +
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/files_71.html b/1.0rc3/doxygen/search/files_71.html new file mode 100644 index 000000000..9a1be0561 --- /dev/null +++ b/1.0rc3/doxygen/search/files_71.html @@ -0,0 +1,90 @@ + + + + + + + +
+
Loading...
+
+
+ qbarray.h +
+
+
+ +
+
+ +
+
+
+ qbdefs.h +
+
+
+
+ qbhdb.h +
+
+ +
+
+ qbipcc.h +
+
+
+
+ qbipcs.h +
+
+
+
+ qblist.h +
+
+
+
+ qblog.h +
+
+
+
+ qbloop.h +
+
+
+
+ qbmap.h +
+
+
+
+ qbrb.h +
+
+
+
+ qbutil.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/functions_5f.html b/1.0rc3/doxygen/search/functions_5f.html new file mode 100644 index 000000000..0e94ad3b2 --- /dev/null +++ b/1.0rc3/doxygen/search/functions_5f.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/functions_71.html b/1.0rc3/doxygen/search/functions_71.html new file mode 100644 index 000000000..7b1bba36e --- /dev/null +++ b/1.0rc3/doxygen/search/functions_71.html @@ -0,0 +1,1124 @@ + + + + + + + +
+
Loading...
+
+
+ qb_array_create + qbarray.h +
+
+
+
+ qb_array_create_2 + qbarray.h +
+
+
+
+ qb_array_elems_per_bin_get + qbarray.h +
+
+
+
+ qb_array_free + qbarray.h +
+
+
+
+ qb_array_grow + qbarray.h +
+
+
+
+ qb_array_index + qbarray.h +
+
+
+
+ qb_array_new_bin_cb_set + qbarray.h +
+
+
+
+ qb_array_num_bins_get + qbarray.h +
+
+
+
+ qb_atomic_init + qbatomic.h +
+
+
+
+ qb_atomic_int_add + qbatomic.h +
+
+ +
+ +
+
+
+ qb_atomic_int_get + qbatomic.h +
+
+
+
+ qb_atomic_int_set + qbatomic.h +
+
+ +
+
+ qb_atomic_pointer_get + qbatomic.h +
+
+
+
+ qb_atomic_pointer_set + qbatomic.h +
+
+
+
+ qb_hashtable_create + qbmap.h +
+
+
+
+ qb_hdb_base_convert + qbhdb.h +
+
+
+
+ qb_hdb_create + qbhdb.h +
+
+
+
+ qb_hdb_destroy + qbhdb.h +
+
+
+
+ qb_hdb_handle_create + qbhdb.h +
+
+
+
+ qb_hdb_handle_destroy + qbhdb.h +
+
+
+
+ qb_hdb_handle_get + qbhdb.h +
+
+
+
+ qb_hdb_handle_get_always + qbhdb.h +
+
+
+
+ qb_hdb_handle_put + qbhdb.h +
+
+
+ +
+
+
+ qb_hdb_iterator_next + qbhdb.h +
+
+
+
+ qb_hdb_iterator_reset + qbhdb.h +
+
+
+
+ qb_hdb_nocheck_convert + qbhdb.h +
+
+
+
+ qb_ipcc_connect + qbipcc.h +
+
+
+
+ qb_ipcc_context_get + qbipcc.h +
+
+
+
+ qb_ipcc_context_set + qbipcc.h +
+
+
+
+ qb_ipcc_disconnect + qbipcc.h +
+
+
+
+ qb_ipcc_event_recv + qbipcc.h +
+
+
+
+ qb_ipcc_fc_enable_max_set + qbipcc.h +
+
+
+
+ qb_ipcc_fd_get + qbipcc.h +
+
+
+
+ qb_ipcc_get_buffer_size + qbipcc.h +
+
+
+
+ qb_ipcc_is_connected + qbipcc.h +
+
+
+
+ qb_ipcc_recv + qbipcc.h +
+
+
+
+ qb_ipcc_send + qbipcc.h +
+
+
+
+ qb_ipcc_sendv + qbipcc.h +
+
+
+
+ qb_ipcc_sendv_recv + qbipcc.h +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ qb_ipcs_connection_ref + qbipcs.h +
+
+ +
+ +
+
+ +
+
+
+ qb_ipcs_connection_unref + qbipcs.h +
+
+
+
+ qb_ipcs_context_get + qbipcs.h +
+
+
+
+ qb_ipcs_context_set + qbipcs.h +
+
+
+
+ qb_ipcs_create + qbipcs.h +
+
+
+
+ qb_ipcs_destroy + qbipcs.h +
+
+
+
+ qb_ipcs_disconnect + qbipcs.h +
+
+
+ +
+
+
+ qb_ipcs_event_send + qbipcs.h +
+
+
+
+ qb_ipcs_event_sendv + qbipcs.h +
+
+
+
+ qb_ipcs_poll_handlers_set + qbipcs.h +
+
+
+
+ qb_ipcs_ref + qbipcs.h +
+
+
+ +
+
+
+ qb_ipcs_response_send + qbipcs.h +
+
+
+
+ qb_ipcs_response_sendv + qbipcs.h +
+
+
+
+ qb_ipcs_run + qbipcs.h +
+
+
+ +
+
+ +
+
+
+ qb_ipcs_service_id_get + qbipcs.h +
+
+
+
+ qb_ipcs_stats_get + qbipcs.h +
+
+
+
+ qb_ipcs_unref + qbipcs.h +
+
+
+
+ qb_list_add + qblist.h +
+
+
+
+ qb_list_add_tail + qblist.h +
+
+
+
+ qb_list_del + qblist.h +
+
+
+
+ qb_list_empty + qblist.h +
+
+
+
+ qb_list_init + qblist.h +
+
+
+
+ qb_list_is_last + qblist.h +
+
+
+
+ qb_list_length + qblist.h +
+
+
+
+ qb_list_replace + qblist.h +
+
+
+
+ qb_list_splice + qblist.h +
+
+
+
+ qb_list_splice_tail + qblist.h +
+
+ + +
+
+ qb_log_callsite_get + qblog.h +
+
+
+
+ qb_log_callsites_dump + qblog.h +
+
+
+ +
+
+
+ qb_log_ctl + qblog.h +
+
+
+
+ qb_log_ctl2 + qblog.h +
+
+
+
+ qb_log_custom_close + qblog.h +
+
+
+
+ qb_log_custom_open + qblog.h +
+
+
+
+ qb_log_facility2int + qblog.h +
+
+
+
+ qb_log_facility2str + qblog.h +
+
+
+
+ qb_log_file_close + qblog.h +
+
+
+
+ qb_log_file_open + qblog.h +
+
+
+
+ qb_log_filter_ctl + qblog.h +
+
+
+
+ qb_log_filter_ctl2 + qblog.h +
+
+
+
+ qb_log_filter_fn_set + qblog.h +
+
+
+
+ qb_log_fini + qblog.h +
+
+
+
+ qb_log_format_set + qblog.h +
+
+
+ +
+ +
+
+ qb_log_init + qblog.h +
+
+
+
+ qb_log_real_ + qblog.h +
+
+
+
+ qb_log_real_va_ + qblog.h +
+
+
+ +
+
+
+ qb_log_target_format + qblog.h +
+
+
+ +
+
+ +
+
+ +
+
+
+ qb_log_thread_start + qblog.h +
+
+
+
+ qb_loop_create + qbloop.h +
+
+
+
+ qb_loop_destroy + qbloop.h +
+
+
+
+ qb_loop_job_add + qbloop.h +
+
+
+
+ qb_loop_job_del + qbloop.h +
+
+
+
+ qb_loop_poll_add + qbloop.h +
+
+
+
+ qb_loop_poll_del + qbloop.h +
+
+
+ +
+
+
+ qb_loop_poll_mod + qbloop.h +
+
+
+
+ qb_loop_run + qbloop.h +
+
+
+
+ qb_loop_signal_add + qbloop.h +
+
+
+
+ qb_loop_signal_del + qbloop.h +
+
+
+
+ qb_loop_signal_mod + qbloop.h +
+
+
+
+ qb_loop_stop + qbloop.h +
+
+
+
+ qb_loop_timer_add + qbloop.h +
+
+
+
+ qb_loop_timer_del + qbloop.h +
+
+
+ +
+
+
+ qb_loop_timer_is_running + qbloop.h +
+
+
+
+ qb_map_count_get + qbmap.h +
+
+
+
+ qb_map_destroy + qbmap.h +
+
+
+
+ qb_map_foreach + qbmap.h +
+
+
+
+ qb_map_get + qbmap.h +
+
+
+
+ qb_map_iter_create + qbmap.h +
+
+
+
+ qb_map_iter_free + qbmap.h +
+
+
+
+ qb_map_iter_next + qbmap.h +
+
+
+
+ qb_map_notify_add + qbmap.h +
+
+
+
+ qb_map_notify_del + qbmap.h +
+
+
+
+ qb_map_notify_del_2 + qbmap.h +
+
+
+
+ qb_map_pref_iter_create + qbmap.h +
+
+
+
+ qb_map_put + qbmap.h +
+
+
+
+ qb_map_rm + qbmap.h +
+
+
+
+ qb_rb_chmod + qbrb.h +
+
+
+
+ qb_rb_chown + qbrb.h +
+
+
+
+ qb_rb_chunk_alloc + qbrb.h +
+
+
+
+ qb_rb_chunk_commit + qbrb.h +
+
+
+
+ qb_rb_chunk_peek + qbrb.h +
+
+
+
+ qb_rb_chunk_read + qbrb.h +
+
+
+
+ qb_rb_chunk_reclaim + qbrb.h +
+
+
+
+ qb_rb_chunk_write + qbrb.h +
+
+
+
+ qb_rb_chunks_used + qbrb.h +
+
+
+
+ qb_rb_close + qbrb.h +
+
+
+
+ qb_rb_create_from_file + qbrb.h +
+
+
+
+ qb_rb_name_get + qbrb.h +
+
+
+
+ qb_rb_open + qbrb.h +
+
+
+
+ qb_rb_refcount_get + qbrb.h +
+
+
+ +
+
+
+ qb_rb_space_free + qbrb.h +
+
+
+
+ qb_rb_space_used + qbrb.h +
+
+
+
+ qb_rb_write_to_file + qbrb.h +
+
+
+
+ qb_skiplist_create + qbmap.h +
+
+
+
+ qb_strerror_r + qbutil.h +
+
+
+
+ qb_thread_lock + qbutil.h +
+
+
+
+ qb_thread_lock_create + qbutil.h +
+
+
+
+ qb_thread_lock_destroy + qbutil.h +
+
+
+
+ qb_thread_trylock + qbutil.h +
+
+
+
+ qb_thread_unlock + qbutil.h +
+
+
+
+ qb_timespec_add_ms + qbutil.h +
+
+
+
+ qb_trie_create + qbmap.h +
+
+
+
+ qb_trie_dump + qbmap.h +
+
+
+
+ qb_util_nano_current_get + qbutil.h +
+
+
+ +
+
+
+ qb_util_nano_monotonic_hz + qbutil.h +
+
+
+
+ qb_util_set_log_function + qbutil.h +
+
+
+
+ qb_util_stopwatch_create + qbutil.h +
+
+
+
+ qb_util_stopwatch_free + qbutil.h +
+
+ +
+
+ qb_util_stopwatch_split + qbutil.h +
+
+
+ +
+
+ +
+
+
+ qb_util_stopwatch_start + qbutil.h +
+
+
+
+ qb_util_stopwatch_stop + qbutil.h +
+
+ + + +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/nomatches.html b/1.0rc3/doxygen/search/nomatches.html new file mode 100644 index 000000000..b1ded27e9 --- /dev/null +++ b/1.0rc3/doxygen/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/1.0rc3/doxygen/search/search.css b/1.0rc3/doxygen/search/search.css new file mode 100644 index 000000000..d263b9724 --- /dev/null +++ b/1.0rc3/doxygen/search/search.css @@ -0,0 +1,198 @@ +/*---------------- Search Box */ + +#MSearchBox { + padding: 0px; + margin: 0px; + border: none; + border: 1px solid #84B0C7; + white-space: nowrap; + -moz-border-radius: 8px; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; +} +#MSearchField { + font: 9pt Arial, Verdana, sans-serif; + color: #999999; + background-color: #FFFFFF; + font-style: normal; + cursor: text; + padding: 1px 1px; + margin: 0px 6px 0px 0px; + border: none; + outline: none; + vertical-align: middle; +} +.MSearchBoxActive #MSearchField { + color: #000000; +} +#MSearchSelect { + float : none; + display : inline; + background : none; + font: 9pt Verdana, sans-serif; + border: none; + margin: 0px 0px 0px 6px; + vertical-align: middle; + padding: 0px 0px; +} + +#MSearchClose { + float : none; + display : none; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +#MSearchCloseImg { + vertical-align: middle; +} + +.MSearchBoxLeft { + display: block; + text-align: left; + float: left; + margin-left: 6px; +} +.MSearchBoxRight { + display: block; + float: right; + text-align: right; + margin-right: 6px; +} +.MSearchBoxSpacer { + font-size: 0px; + clear: both; +} +.MSearchBoxRow { + font-size: 0px; + clear: both; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #A0A0A0; + background-color: #FAFAFA; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + } +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} +a.SelectItem:hover { + color: #FFFFFF; + background-color: #2A50E4; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; + } +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000000; + background-color: #EEF3F5; + } + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} +.SRPage .SRChildren { + display: none; +} +.SRSymbol { + font-weight: bold; color: #153788; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #153788; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + diff --git a/1.0rc3/doxygen/search/search.js b/1.0rc3/doxygen/search/search.js new file mode 100644 index 000000000..c63a69dd2 --- /dev/null +++ b/1.0rc3/doxygen/search/search.js @@ -0,0 +1,742 @@ +// Search script generated by doxygen +// Copyright (C) 2009 by Dimitri van Heesch. + +// The code in this file is loosly based on main.js, part of Natural Docs, +// which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL. + +var indexSectionsWithContent = +{ + 0: "000000000000000000000000000000000000000000000000000000000000000101011110111011101111100000000000", + 1: "000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000", + 2: "000000000000000000000000000000000000000000000000000000000000000000000000000001000100000000000000", + 3: "000000000000000000000000000000000000000000000000000000000000000100000000000000000100000000000000", + 4: "000000000000000000000000000000000000000000000000000000000000000101011110111011101011100000000000", + 5: "000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000", + 6: "000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000", + 7: "000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000", + 8: "000000000000000000000000000000000000000000000000000000000000000000000000100010000100000000000000" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "files", + 3: "functions", + 4: "variables", + 5: "typedefs", + 6: "enums", + 7: "enumvalues", + 8: "defines" +}; + +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var hexCode; + if (code<16) + { + hexCode="0"+code.toString(16); + } + else + { + hexCode=code.toString(16); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + if (indexSectionsWithContent[this.searchIndex].charAt(code-32) == '1') + { + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location.href = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} diff --git a/1.0rc3/doxygen/search/search.png b/1.0rc3/doxygen/search/search.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd2396db13f27c7b5e1844540d12e0e54977189 GIT binary patch literal 527 zcmV+q0`UEbP)`f0005jNkl4#8 zyRJb|5QfiY3nD}#O1IDv32{lhg2F4H)+uxzLhBJkK|@6+NC=S-QMwdDA(0T5^Rb+r z6PJ@S#oDuG{{Np@Gh4b|uU~h&TrSex#PvU?tS~#BPQTxuPNziNZnxj>4~N5lOGu~F ziF(y)wOlTr&u8jGP^naEwK|bV#N%`jJS4I$EukQckB6(ORuWistd(@>L9MGMR8v)@U^9^?IF7hr?B*-qJ)+ z1|i-_O<8`-j|U?Gf)q9yjf%zMZ<*i*e;r)?T0%FY-erEE4^ zE|)WzOa!sPV4yI$s`L3g9J}3aHk&~s1mENFu%YdCOBdtuI2a5v5ztnv^``M-l6VPq z_WS+ea1aGG8V!n@&8AQ&tk-LY!;#HqS-}tM@x8SzUWE##TnVDJSS;Y9lF4KOfxt6a za0LG;M+*LYKA+8Iu~>{>;0g9<8{AVu2oXOXkIav?zy4Z%002ovPDHLkV1iB-@74eS literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/search/typedefs_71.html b/1.0rc3/doxygen/search/typedefs_71.html new file mode 100644 index 000000000..3443c11bc --- /dev/null +++ b/1.0rc3/doxygen/search/typedefs_71.html @@ -0,0 +1,248 @@ + + + + + + + +
+
Loading...
+
+
+ qb_array_new_bin_cb_fn + qbarray.h +
+
+
+
+ qb_array_t + qbarray.h +
+
+
+
+ qb_handle_t + qbhdb.h +
+
+
+
+ qb_ipcc_connection_t + qbipcc.h +
+
+
+ +
+
+ +
+
+ +
+ +
+
+ qb_ipcs_connection_t + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_add_fn + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_del_fn + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_fn_t + qbipcs.h +
+
+
+
+ qb_ipcs_dispatch_mod_fn + qbipcs.h +
+
+
+
+ qb_ipcs_job_add_fn + qbipcs.h +
+
+
+
+ qb_ipcs_msg_process_fn + qbipcs.h +
+
+
+
+ qb_ipcs_service_t + qbipcs.h +
+
+
+
+ qb_log_close_fn + qblog.h +
+
+
+
+ qb_log_filter_fn + qblog.h +
+
+
+
+ qb_log_logger_fn + qblog.h +
+
+
+
+ qb_log_reload_fn + qblog.h +
+
+
+
+ qb_log_tags_stringify_fn + qblog.h +
+
+
+
+ qb_log_vlogger_fn + qblog.h +
+
+
+
+ qb_loop_job_dispatch_fn + qbloop.h +
+
+
+
+ qb_loop_poll_dispatch_fn + qbloop.h +
+
+
+ +
+
+ +
+
+
+ qb_loop_signal_handle + qbloop.h +
+
+
+
+ qb_loop_t + qbloop.h +
+
+
+
+ qb_loop_timer_dispatch_fn + qbloop.h +
+
+
+
+ qb_loop_timer_handle + qbloop.h +
+
+
+
+ qb_map_iter_t + qbmap.h +
+
+
+
+ qb_map_notify_fn + qbmap.h +
+
+
+
+ qb_map_t + qbmap.h +
+
+
+
+ qb_map_transverse_fn + qbmap.h +
+
+
+
+ qb_ringbuffer_t + qbrb.h +
+
+
+
+ qb_thread_lock_t + qbutil.h +
+
+
+
+ qb_util_log_fn_t + qbutil.h +
+
+
+
+ qb_util_stopwatch_t + qbutil.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_5f.html b/1.0rc3/doxygen/search/variables_5f.html new file mode 100644 index 000000000..1a54c73aa --- /dev/null +++ b/1.0rc3/doxygen/search/variables_5f.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ __start___verbose + qblog.h +
+
+
+
+ __stop___verbose + qblog.h +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_61.html b/1.0rc3/doxygen/search/variables_61.html new file mode 100644 index 000000000..8bf518690 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_61.html @@ -0,0 +1,35 @@ + + + + + + + +
+
Loading...
+
+
+ active_connections + qb_ipcs_stats +
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_63.html b/1.0rc3/doxygen/search/variables_63.html new file mode 100644 index 000000000..b0743917b --- /dev/null +++ b/1.0rc3/doxygen/search/variables_63.html @@ -0,0 +1,65 @@ + + + + + + + +
+
Loading...
+
+
+ check + qb_hdb_handle +
+
+ +
+
+ closed_connections + qb_ipcs_stats +
+
+
+
+ connection_accept + qb_ipcs_service_handlers +
+
+
+
+ connection_closed + qb_ipcs_service_handlers +
+
+
+
+ connection_created + qb_ipcs_service_handlers +
+
+
+
+ connection_destroyed + qb_ipcs_service_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_64.html b/1.0rc3/doxygen/search/variables_64.html new file mode 100644 index 000000000..1065cb952 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_64.html @@ -0,0 +1,44 @@ + + + + + + + +
+
Loading...
+
+
+ destructor + qb_hdb +
+
+
+
+ dispatch_add + qb_ipcs_poll_handlers +
+
+
+
+ dispatch_del + qb_ipcs_poll_handlers +
+
+
+
+ dispatch_mod + qb_ipcs_poll_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_65.html b/1.0rc3/doxygen/search/variables_65.html new file mode 100644 index 000000000..93f934656 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_65.html @@ -0,0 +1,35 @@ + + + + + + + +
+
Loading...
+
+
+ event_q_length + qb_ipcs_connection_stats_2 +
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_66.html b/1.0rc3/doxygen/search/variables_66.html new file mode 100644 index 000000000..0c355bbe9 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_66.html @@ -0,0 +1,62 @@ + + + + + + + +
+
Loading...
+
+
+ filename + qb_log_callsite +
+
+
+
+ first_run + qb_hdb +
+
+ + +
+
+ format + qb_log_callsite +
+
+
+
+ function + qb_log_callsite +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_68.html b/1.0rc3/doxygen/search/variables_68.html new file mode 100644 index 000000000..d3a899c07 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_68.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ handle_count + qb_hdb +
+
+
+
+ handles + qb_hdb +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_69.html b/1.0rc3/doxygen/search/variables_69.html new file mode 100644 index 000000000..cc7cb96ef --- /dev/null +++ b/1.0rc3/doxygen/search/variables_69.html @@ -0,0 +1,38 @@ + + + + + + + +
+
Loading...
+
+
+ i32 + qb_log_ctl2_arg_t +
+
+
+
+ instance + qb_hdb_handle +
+
+
+
+ iterator + qb_hdb +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_6a.html b/1.0rc3/doxygen/search/variables_6a.html new file mode 100644 index 000000000..f63d5f6eb --- /dev/null +++ b/1.0rc3/doxygen/search/variables_6a.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ job_add + qb_ipcs_poll_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_6c.html b/1.0rc3/doxygen/search/variables_6c.html new file mode 100644 index 000000000..59bd2cd38 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_6c.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ lineno + qb_log_callsite +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_6d.html b/1.0rc3/doxygen/search/variables_6d.html new file mode 100644 index 000000000..cb8b399c9 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_6d.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ msg_process + qb_ipcs_service_handlers +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_6e.html b/1.0rc3/doxygen/search/variables_6e.html new file mode 100644 index 000000000..9eebcafca --- /dev/null +++ b/1.0rc3/doxygen/search/variables_6e.html @@ -0,0 +1,26 @@ + + + + + + + +
+
Loading...
+
+
+ next + qb_list_head +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_70.html b/1.0rc3/doxygen/search/variables_70.html new file mode 100644 index 000000000..b3cd5a454 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_70.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ prev + qb_list_head +
+
+
+
+ priority + qb_log_callsite +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_72.html b/1.0rc3/doxygen/search/variables_72.html new file mode 100644 index 000000000..4ee951593 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_72.html @@ -0,0 +1,53 @@ + + + + + + + +
+
Loading...
+ +
+
+ ref_count + qb_hdb_handle +
+
+ + +
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_73.html b/1.0rc3/doxygen/search/variables_73.html new file mode 100644 index 000000000..889da5102 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_73.html @@ -0,0 +1,41 @@ + + + + + + + +
+
Loading...
+
+
+ s + qb_log_ctl2_arg_t +
+
+ +
+
+ state + qb_hdb_handle +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/search/variables_74.html b/1.0rc3/doxygen/search/variables_74.html new file mode 100644 index 000000000..eb8929744 --- /dev/null +++ b/1.0rc3/doxygen/search/variables_74.html @@ -0,0 +1,32 @@ + + + + + + + +
+
Loading...
+
+
+ tags + qb_log_callsite +
+
+
+
+ targets + qb_log_callsite +
+
+
Searching...
+
No Matches
+ +
+ + diff --git a/1.0rc3/doxygen/simplelog_8c-example.html b/1.0rc3/doxygen/simplelog_8c-example.html new file mode 100644 index 000000000..58e6e15bb --- /dev/null +++ b/1.0rc3/doxygen/simplelog_8c-example.html @@ -0,0 +1,318 @@ + + + + + +libqb: simplelog.c + + + + + + + + + +
+

simplelog.c

/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Angus Salkeld <asalkeld@redhat.com>
+ *
+ * libqb is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * libqb is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libqb.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "os_base.h"
+#include <signal.h>
+#include <syslog.h>
+
+#include <qb/qbdefs.h>
+#include <qb/qblog.h>
+
+#define MY_TAG_ONE   (1)
+#define MY_TAG_TWO   (1 << 1)
+#define MY_TAG_THREE (1 << 2)
+
+static uint8_t _log_priority = LOG_WARNING;
+
+static void
+func_one(void)
+{
+        FILE *fd;
+
+        qb_enter();
+        qb_logt(LOG_DEBUG, MY_TAG_TWO, "arf arf?");
+        qb_logt(LOG_CRIT, MY_TAG_THREE, "arrrg!");
+        qb_logt(134, MY_TAG_THREE, "big priority");
+        qb_logt(LOG_ERR, MY_TAG_THREE, "oops, I did it again");
+        qb_log(LOG_INFO, "are you aware ...");
+
+        fd = fopen("/nothing.txt", "r+");
+        if (fd == NULL) {
+                qb_perror(LOG_ERR, "can't open(\"/nothing.txt\")");
+        } else {
+                fclose(fd);
+        }
+        qb_leave();
+}
+
+static void
+func_two(void)
+{
+        qb_enter();
+        qb_logt(LOG_DEBUG, 0, "arf arf?");
+        qb_logt(LOG_CRIT, MY_TAG_ONE, "arrrg!");
+        qb_log(LOG_ERR, "oops, I did it again");
+        qb_logt(LOG_INFO, MY_TAG_THREE, "are you aware ...");
+        qb_leave();
+}
+
+static void
+show_usage(const char *name)
+{
+        printf("usage: \n");
+        printf("%s <options>\n", name);
+        printf("\n");
+        printf("  options:\n");
+        printf("\n");
+        printf("  -v             verbose\n");
+        printf("  -t             threaded logging\n");
+        printf("  -o             log to stdout\n");
+        printf("  -e             log to stderr\n");
+        printf("  -b             log to blackbox\n");
+        printf("  -f <filename>  log to a file\n");
+        printf("  -h             show this help text\n");
+        printf("\n");
+}
+
+static int32_t do_blackbox = QB_FALSE;
+static int32_t do_threaded = QB_FALSE;
+
+static void
+sigsegv_handler(int sig)
+{
+        (void)signal(SIGSEGV, SIG_DFL);
+        if (do_blackbox) {
+                qb_log_blackbox_write_to_file("simple-log.fdata");
+        }
+        qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_FALSE);
+        raise(SIGSEGV);
+}
+
+static const char *
+my_tags_stringify(uint32_t tags)
+{
+        if (qb_bit_is_set(tags, QB_LOG_TAG_LIBQB_MSG_BIT)) {
+                return "libqb";
+        } else if (qb_bit_is_set(tags, 0)) {
+                return "ONE";
+        } else if (qb_bit_is_set(tags, 1)) {
+                return "TWO";
+        } else if (qb_bit_is_set(tags, 2)) {
+                return "THREE";
+        } else {
+                return "MAIN";
+        }
+}
+
+static void
+trace_logger(int32_t t,
+             struct qb_log_callsite *cs, time_t timestamp, const char *msg)
+{
+        char output_buffer[QB_LOG_MAX_LEN];
+        output_buffer[0] = '\0';
+        qb_log_target_format(t, cs, timestamp, msg, output_buffer);
+        fprintf(stderr, "%s\n", output_buffer);
+}
+
+static void
+m_filter(struct qb_log_callsite *cs)
+{
+        if ((cs->priority >= LOG_ALERT &&
+             cs->priority <= _log_priority) &&
+            strcmp(cs->filename, __FILE__) == 0) {
+                qb_bit_set(cs->targets, QB_LOG_STDERR);
+        } else {
+                qb_bit_clear(cs->targets, QB_LOG_STDERR);
+        }
+}
+
+int32_t
+main(int32_t argc, char *argv[])
+{
+        const char *options = "vhteobdf:";
+        int32_t opt;
+        int32_t tracer;
+        int32_t do_stderr = QB_FALSE;
+        int32_t do_stdout = QB_FALSE;
+        int32_t do_dump_blackbox = QB_FALSE;
+        char *logfile = NULL;
+        int32_t log_fd = -1;
+
+        while ((opt = getopt(argc, argv, options)) != -1) {
+                switch (opt) {
+                case 'd':
+                        do_dump_blackbox = QB_TRUE;
+                        break;
+                case 't':
+                        do_threaded = QB_TRUE;
+                        break;
+                case 'e':
+                        do_stderr = QB_TRUE;
+                        break;
+                case 'o':
+                        do_stdout = QB_TRUE;
+                        break;
+                case 'b':
+                        do_blackbox = QB_TRUE;
+                        break;
+                case 'f':
+                        logfile = optarg;
+                        break;
+                case 'v':
+                        _log_priority++;
+                        break;
+                case 'h':
+                default:
+                        show_usage(argv[0]);
+                        exit(0);
+                        break;
+                }
+        }
+
+        if (do_dump_blackbox) {
+                qb_log_blackbox_print_from_file("simple-log.fdata");
+                exit(0);
+        }
+
+        signal(SIGSEGV, sigsegv_handler);
+
+        qb_log_init("simple-log", LOG_USER, LOG_INFO);
+        qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_THREADED, do_threaded);
+        qb_log_tags_stringify_fn_set(my_tags_stringify);
+
+        if (do_stderr) {
+                qb_log_filter_fn_set(m_filter);
+                qb_log_format_set(QB_LOG_STDERR, "[%p] %4g: %f:%l %b");
+                qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE);
+
+                tracer = qb_log_custom_open(trace_logger, NULL, NULL, NULL);
+                qb_log_ctl(tracer, QB_LOG_CONF_ENABLED, QB_TRUE);
+                qb_log_format_set(tracer, "%4g: %n() %b");
+                qb_log_filter_ctl2(tracer, QB_LOG_FILTER_ADD,
+                                   QB_LOG_FILTER_FILE, __FILE__,
+                                   LOG_TRACE, 200);
+        }
+        if (do_stdout) {
+                qb_log_filter_ctl2(QB_LOG_STDOUT, QB_LOG_FILTER_ADD,
+                                   QB_LOG_FILTER_FILE, __FILE__,
+                                   LOG_ALERT, QB_MIN(LOG_DEBUG, _log_priority));
+                qb_log_format_set(QB_LOG_STDOUT, "[%p] %4g: %f:%l %b");
+                qb_log_ctl(QB_LOG_STDOUT, QB_LOG_CONF_ENABLED, QB_TRUE);
+        }
+        if (do_blackbox) {
+                qb_log_filter_ctl(QB_LOG_BLACKBOX, QB_LOG_FILTER_ADD,
+                                  QB_LOG_FILTER_FILE, "*", LOG_DEBUG);
+                qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_SIZE, 4096);
+                qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_THREADED, QB_FALSE);
+                qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_TRUE);
+        }
+        if (logfile) {
+                log_fd = qb_log_file_open(logfile);
+                qb_log_filter_ctl(log_fd, QB_LOG_FILTER_ADD,
+                                  QB_LOG_FILTER_FILE, __FILE__, _log_priority);
+                qb_log_format_set(log_fd, "[%N] %t %n() [%p] %b");
+                qb_log_ctl(log_fd, QB_LOG_CONF_THREADED, do_threaded);
+                qb_log_ctl(log_fd, QB_LOG_CONF_ENABLED, QB_TRUE);
+        }
+        if (do_threaded) {
+                qb_log_thread_start();
+        }
+        qb_log(LOG_DEBUG, "hello");
+        qb_log(LOG_INFO, "this is an info");
+        qb_log(LOG_NOTICE, "hello - notice?");
+        {
+                char * str = NULL;
+                qb_log(LOG_ERR,
+                       "%s-%d-%s-%u",
+                       NULL, 952, str, 56);
+        }
+        func_one();
+        func_two();
+
+        if (!do_threaded) {
+                /* Disabling syslog here will prevent the logs from
+                 * getting flushed in qb_log_fini() if threaded
+                 * logging is on.
+                 */
+                qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
+
+                qb_log(LOG_WARNING, "no syslog");
+                qb_log(LOG_ERR, "no syslog");
+        }
+
+        if (do_blackbox) {
+                logfile = NULL;
+                logfile[5] = 'a';
+        } else {
+                qb_log_fini();
+        }
+        return 0;
+}
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__hdb.html b/1.0rc3/doxygen/structqb__hdb.html new file mode 100644 index 000000000..9d133d06b --- /dev/null +++ b/1.0rc3/doxygen/structqb__hdb.html @@ -0,0 +1,146 @@ + + + + + +libqb: qb_hdb Struct Reference + + + + + + + + + +
+

qb_hdb Struct Reference

+

#include <qbhdb.h>

+ + + + + + + +

Data Fields

uint32_t handle_count
qb_array_thandles
uint32_t iterator
void(* destructor )(void *)
uint32_t first_run
+

Field Documentation

+ +
+
+ + + + +
void(* qb_hdb::destructor)(void *)
+
+
+ +
+
+ +
+
+ + + + +
uint32_t qb_hdb::first_run
+
+
+ +
+
+ +
+
+ + + + +
uint32_t qb_hdb::handle_count
+
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+ + + + +
uint32_t qb_hdb::iterator
+
+
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__hdb__handle.html b/1.0rc3/doxygen/structqb__hdb__handle.html new file mode 100644 index 000000000..2453fee35 --- /dev/null +++ b/1.0rc3/doxygen/structqb__hdb__handle.html @@ -0,0 +1,132 @@ + + + + + +libqb: qb_hdb_handle Struct Reference + + + + + + + + + +
+

qb_hdb_handle Struct Reference

+

#include <qbhdb.h>

+ + + + + + +

Data Fields

int32_t state
void * instance
int32_t check
int32_t ref_count
+

Field Documentation

+ +
+
+ + + + +
int32_t qb_hdb_handle::check
+
+
+ +
+
+ +
+
+ + + + +
void* qb_hdb_handle::instance
+
+
+ +
+
+ +
+
+ + + + +
int32_t qb_hdb_handle::ref_count
+
+
+ +
+
+ +
+
+ + + + +
int32_t qb_hdb_handle::state
+
+
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__ipc__request__header.html b/1.0rc3/doxygen/structqb__ipc__request__header.html new file mode 100644 index 000000000..1fd19a66e --- /dev/null +++ b/1.0rc3/doxygen/structqb__ipc__request__header.html @@ -0,0 +1,118 @@ + + + + + +libqb: qb_ipc_request_header Struct Reference + + + + + + + + + +
+

qb_ipc_request_header Struct Reference

+

#include <qbipc_common.h>

+ + + + +

Public Member Functions

int32_t id __attribute__ ((aligned(8)))
int32_t size __attribute__ ((aligned(8)))
+

Detailed Description

+
Examples:
+

ipcclient.c, and ipcserver.c.

+
+

Member Function Documentation

+ +
+
+ + + + + + + + + +
int32_t size qb_ipc_request_header::__attribute__ ((aligned(8))  ) 
+
+
+ +
+
+ +
+
+ + + + + + + + + +
int32_t id qb_ipc_request_header::__attribute__ ((aligned(8))  ) 
+
+
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__ipc__response__header.html b/1.0rc3/doxygen/structqb__ipc__response__header.html new file mode 100644 index 000000000..bb7287820 --- /dev/null +++ b/1.0rc3/doxygen/structqb__ipc__response__header.html @@ -0,0 +1,137 @@ + + + + + +libqb: qb_ipc_response_header Struct Reference + + + + + + + + + +
+

qb_ipc_response_header Struct Reference

+

#include <qbipc_common.h>

+ + + + + +

Public Member Functions

int32_t id __attribute__ ((aligned(8)))
int32_t size __attribute__ ((aligned(8)))
int32_t error __attribute__ ((aligned(8)))
+

Detailed Description

+
Examples:
+

ipcclient.c, and ipcserver.c.

+
+

Member Function Documentation

+ +
+
+ + + + + + + + + +
int32_t error qb_ipc_response_header::__attribute__ ((aligned(8))  ) 
+
+
+ +
+
+ +
+
+ + + + + + + + + +
int32_t size qb_ipc_response_header::__attribute__ ((aligned(8))  ) 
+
+
+ +
+
+ +
+
+ + + + + + + + + +
int32_t id qb_ipc_response_header::__attribute__ ((aligned(8))  ) 
+
+
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__ipcs__connection__stats.html b/1.0rc3/doxygen/structqb__ipcs__connection__stats.html new file mode 100644 index 000000000..c1be40321 --- /dev/null +++ b/1.0rc3/doxygen/structqb__ipcs__connection__stats.html @@ -0,0 +1,192 @@ + + + + + +libqb: qb_ipcs_connection_stats Struct Reference + + + + + + + + + +
+

qb_ipcs_connection_stats Struct Reference

+

#include <qbipcs.h>

+ + + + + + + + + + +

Data Fields

int32_t client_pid
uint64_t requests
uint64_t responses
uint64_t events
uint64_t send_retries
uint64_t recv_retries
int32_t flow_control_state
uint64_t flow_control_count
+

Detailed Description

+
Examples:
+

ipcserver.c.

+
+

Field Documentation

+ +
+ +
+ +
+
+ +
+
+ + + + +
uint64_t qb_ipcs_connection_stats::events
+
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__ipcs__connection__stats__2.html b/1.0rc3/doxygen/structqb__ipcs__connection__stats__2.html new file mode 100644 index 000000000..174dd12e1 --- /dev/null +++ b/1.0rc3/doxygen/structqb__ipcs__connection__stats__2.html @@ -0,0 +1,202 @@ + + + + + +libqb: qb_ipcs_connection_stats_2 Struct Reference + + + + + + + + + +
+

qb_ipcs_connection_stats_2 Struct Reference

+

#include <qbipcs.h>

+ + + + + + + + + + + +

Data Fields

int32_t client_pid
uint64_t requests
uint64_t responses
uint64_t events
uint64_t send_retries
uint64_t recv_retries
int32_t flow_control_state
uint64_t flow_control_count
uint32_t event_q_length
+

Field Documentation

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__ipcs__poll__handlers.html b/1.0rc3/doxygen/structqb__ipcs__poll__handlers.html new file mode 100644 index 000000000..7cf083f8c --- /dev/null +++ b/1.0rc3/doxygen/structqb__ipcs__poll__handlers.html @@ -0,0 +1,136 @@ + + + + + +libqb: qb_ipcs_poll_handlers Struct Reference + + + + + + + + + +
+

qb_ipcs_poll_handlers Struct Reference

+

#include <qbipcs.h>

+ + + + + + +

Data Fields

qb_ipcs_job_add_fn job_add
qb_ipcs_dispatch_add_fn dispatch_add
qb_ipcs_dispatch_mod_fn dispatch_mod
qb_ipcs_dispatch_del_fn dispatch_del
+

Detailed Description

+
Examples:
+

ipcserver.c.

+
+

Field Documentation

+ + + + + + + + +
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__ipcs__service__handlers.html b/1.0rc3/doxygen/structqb__ipcs__service__handlers.html new file mode 100644 index 000000000..06f7c6798 --- /dev/null +++ b/1.0rc3/doxygen/structqb__ipcs__service__handlers.html @@ -0,0 +1,150 @@ + + + + + +libqb: qb_ipcs_service_handlers Struct Reference + + + + + + + + + + + + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__ipcs__stats.html b/1.0rc3/doxygen/structqb__ipcs__stats.html new file mode 100644 index 000000000..25babd06c --- /dev/null +++ b/1.0rc3/doxygen/structqb__ipcs__stats.html @@ -0,0 +1,108 @@ + + + + + +libqb: qb_ipcs_stats Struct Reference + + + + + + + + + +
+

qb_ipcs_stats Struct Reference

+

#include <qbipcs.h>

+ + + + +

Data Fields

uint32_t active_connections
uint32_t closed_connections
+

Detailed Description

+
Examples:
+

ipcserver.c.

+
+

Field Documentation

+ +
+
+ + + + +
uint32_t qb_ipcs_stats::active_connections
+
+
+ +
+
+ +
+
+ + + + +
uint32_t qb_ipcs_stats::closed_connections
+
+
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__list__head.html b/1.0rc3/doxygen/structqb__list__head.html new file mode 100644 index 000000000..97ba15803 --- /dev/null +++ b/1.0rc3/doxygen/structqb__list__head.html @@ -0,0 +1,113 @@ + + + + + +libqb: qb_list_head Struct Reference + + + + + + + + + +
+

qb_list_head Struct Reference

+

#include <qblist.h>

+
+Collaboration diagram for qb_list_head:
+
+
Collaboration graph
+
[legend]
+ + + + +

Data Fields

struct qb_list_headnext
struct qb_list_headprev
+

Field Documentation

+ + + + +
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/structqb__list__head__coll__graph.map b/1.0rc3/doxygen/structqb__list__head__coll__graph.map new file mode 100644 index 000000000..8be6a309f --- /dev/null +++ b/1.0rc3/doxygen/structqb__list__head__coll__graph.map @@ -0,0 +1,2 @@ + + diff --git a/1.0rc3/doxygen/structqb__list__head__coll__graph.md5 b/1.0rc3/doxygen/structqb__list__head__coll__graph.md5 new file mode 100644 index 000000000..64787d62a --- /dev/null +++ b/1.0rc3/doxygen/structqb__list__head__coll__graph.md5 @@ -0,0 +1 @@ +85249c3082c10232b9d3ecd089b64a29 \ No newline at end of file diff --git a/1.0rc3/doxygen/structqb__list__head__coll__graph.png b/1.0rc3/doxygen/structqb__list__head__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..02bc1d3ce9245b3dc18fede95044c2226dec7730 GIT binary patch literal 4654 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 + + + + +libqb: qb_log_callsite Struct Reference + + + + + + + + + +
+

qb_log_callsite Struct Reference

+

An instance of this structure is created in a special ELF section at every dynamic debug callsite. +More...

+ +

#include <qblog.h>

+ + + + + + + + + +

Data Fields

const char * function
const char * filename
const char * format
uint8_t priority
uint32_t lineno
uint32_t targets
uint32_t tags
+

Detailed Description

+

An instance of this structure is created in a special ELF section at every dynamic debug callsite.

+

At runtime, the special section is treated as an array of these.

+
Examples:
+

simplelog.c.

+
+

Field Documentation

+ +
+
+ + + + +
const char* qb_log_callsite::filename
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + +
const char* qb_log_callsite::format
+
+
+ +
+
+ +
+
+ + + + +
const char* qb_log_callsite::function
+
+
+ +
+
+ +
+
+ + + + +
uint32_t qb_log_callsite::lineno
+
+
+ +
+
+ +
+
+ + + + +
uint8_t qb_log_callsite::priority
+
+
+
Examples:
simplelog.c.
+
+
+
+ +
+
+ + + + +
uint32_t qb_log_callsite::tags
+
+
+ +
+
+ +
+
+ + + + +
uint32_t qb_log_callsite::targets
+
+
+
Examples:
simplelog.c.
+
+
+
+
The documentation for this struct was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/tab_b.gif b/1.0rc3/doxygen/tab_b.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d623483ffdf5f9f96900108042a7ab0643fe2a3 GIT binary patch literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/tab_l.gif b/1.0rc3/doxygen/tab_l.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b1e6337c9299a700401a2a78a2c6ffced475216 GIT binary patch literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/tab_r.gif b/1.0rc3/doxygen/tab_r.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce9dd9f533cb5486d6941844f442b59d4a9e9175 GIT binary patch literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo literal 0 HcmV?d00001 diff --git a/1.0rc3/doxygen/tabs.css b/1.0rc3/doxygen/tabs.css new file mode 100644 index 000000000..a44416341 --- /dev/null +++ b/1.0rc3/doxygen/tabs.css @@ -0,0 +1,105 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs #MSearchBox +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI.current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI.current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.navpath +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; + text-align : center; + margin : 2px; + padding : 2px; +} diff --git a/1.0rc3/doxygen/tcpserver_8c-example.html b/1.0rc3/doxygen/tcpserver_8c-example.html new file mode 100644 index 000000000..1ec222a84 --- /dev/null +++ b/1.0rc3/doxygen/tcpserver_8c-example.html @@ -0,0 +1,215 @@ + + + + + +libqb: tcpserver.c + + + + + + + + + +
+

tcpserver.c

/*
+ * Copyright (c) 2011 Red Hat, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Angus Salkeld <asalkeld@redhat.com>
+ *
+ * libqb is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * libqb is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libqb.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "os_base.h"
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif /* HAVE_NETINET_IN_H */
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif /* HAVE_ARPA_INET_H */
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif /* HAVE_NETDB_H */
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif /* HAVE_SYS_SOCKET_H */
+#ifdef HAVE_SYS_POLL_H
+#include <sys/poll.h>
+#endif /* HAVE_SYS_POLL_H */
+
+#include <qb/qbdefs.h>
+#include <qb/qbloop.h>
+
+static int32_t
+sock_read_fn(int32_t fd, int32_t revents, void *data)
+{
+        char recv_data[1024];
+        char send_data[1024];
+        int bytes_recieved;
+
+        if (revents & POLLHUP) {
+                printf("Socket %d peer closed\n", fd);
+                close(fd);
+                return QB_FALSE;
+        }
+
+        bytes_recieved = recv(fd, recv_data, 1024, 0);
+        if (bytes_recieved < 0) {
+                perror("recv");
+                return QB_TRUE;
+        }
+        recv_data[bytes_recieved] = '\0';
+
+        if (strcmp(recv_data, "q") == 0 || strcmp(recv_data, "Q") == 0) {
+                printf("Quiting connection from socket %d\n", fd);
+                close(fd);
+                return QB_FALSE;
+        } else {
+                printf("Recieved: %s\n", recv_data);
+                snprintf(send_data, 1024, "ACK %d bytes", bytes_recieved);
+                if (send(fd, send_data, strlen(send_data), 0) < 0) {
+                        close(fd);
+                        return QB_FALSE;
+                }
+        }
+        return QB_TRUE;
+}
+
+static int32_t
+sock_accept_fn(int32_t fd, int32_t revents, void *data)
+{
+        struct sockaddr_in client_addr;
+        qb_loop_t *ml = (qb_loop_t *) data;
+        socklen_t sin_size = sizeof(struct sockaddr_in);
+        int connected = accept(fd, (struct sockaddr *)&client_addr, &sin_size);
+
+        if (connected < 0) {
+                perror("accept");
+                return QB_TRUE;
+        }
+        printf("I got a connection from (%s , %d)\n",
+               inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
+
+        qb_loop_poll_add(ml, QB_LOOP_MED, connected, POLLIN, ml, sock_read_fn);
+
+        return QB_TRUE;
+}
+
+static int32_t
+please_exit_fn(int32_t rsignal, void *data)
+{
+        qb_loop_t *ml = (qb_loop_t *) data;
+
+        printf("Shutting down at you request...\n");
+        qb_loop_stop(ml);
+        return QB_FALSE;
+}
+
+int
+main(int argc, char *argv[])
+{
+        int sock;
+        int true_opt = 1;
+        struct sockaddr_in server_addr;
+        qb_loop_t *ml = qb_loop_create();
+
+        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
+                perror("Socket");
+                exit(1);
+        }
+
+        if (setsockopt(sock,
+                       SOL_SOCKET,
+                       SO_REUSEADDR, &true_opt, sizeof(int)) == -1) {
+                perror("Setsockopt");
+                exit(1);
+        }
+
+        server_addr.sin_family = AF_INET;
+        server_addr.sin_port = htons(5000);
+        server_addr.sin_addr.s_addr = INADDR_ANY;
+        bzero(&(server_addr.sin_zero), 8);
+
+        printf("TCPServer binding to port 5000\n");
+        if (bind(sock,
+                 (struct sockaddr *)&server_addr,
+                 sizeof(struct sockaddr)) == -1) {
+                perror("Unable to bind");
+                exit(1);
+        }
+
+        printf("TCPServer Waiting for client on port 5000\n");
+
+        if (listen(sock, 5) == -1) {
+                perror("Listen");
+                exit(1);
+        }
+
+        qb_loop_poll_add(ml, QB_LOOP_MED, sock, POLLIN, ml, sock_accept_fn);
+
+        qb_loop_signal_add(ml, QB_LOOP_HIGH, SIGINT, ml, please_exit_fn, NULL);
+        qb_loop_run(ml);
+
+        close(sock);
+        return 0;
+}
+
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ + diff --git a/1.0rc3/doxygen/unionqb__log__ctl2__arg__t.html b/1.0rc3/doxygen/unionqb__log__ctl2__arg__t.html new file mode 100644 index 000000000..9bbcf8304 --- /dev/null +++ b/1.0rc3/doxygen/unionqb__log__ctl2__arg__t.html @@ -0,0 +1,104 @@ + + + + + +libqb: qb_log_ctl2_arg_t Union Reference + + + + + + + + + +
+

qb_log_ctl2_arg_t Union Reference

+

#include <qblog.h>

+ + + + +

Data Fields

int32_t i32
const char * s
+

Field Documentation

+ +
+
+ + + + +
int32_t qb_log_ctl2_arg_t::i32
+
+
+ +
+
+ +
+
+ + + + +
const char* qb_log_ctl2_arg_t::s
+
+
+ +
+
+
The documentation for this union was generated from the following file: +
+ + + + +
+ +
+ +
Generated on 25 Feb 2016 for libqb by  + +doxygen 1.6.1
+ +