3 Christian_Thäter,_Benny_Lyons
5 // doc/overview.txt:1 //
7 Everyone makes mistakes, but with NoBug you won't make them twice!
10 Nobug is a debugging library for instrumenting C and C++ programs
11 inspired by ideas originating from Design-by-Contract.
16 The following features are provided by NoBug:
18 * Three different check levels: from detailed to final no-overhead
19 * Scope tags: tell whenever a function or loop is considered to be bug free
20 * Precondition, Postcondition and Invariant checks and generic assertions
21 * Debugger support (actions are only executed while running under a
22 debugger), currently only valgrind is supported
23 * Datastructures can be dumped
24 * Application activities can be logged
25 * Runtime customizable logging via an environment variable
26 * Different logging targets to stderr, syslog, debugger, ...
27 * Annotation of your sourcecode about known bugs, things to do, etc.
28 * Tracking resources (files, locks, etc.) used by your program; help in
30 * Detecting potential deadlocks
31 * Simulate errors by injecting faults
32 * Additionally, the NoBug project is used to maintain a script and
33 some tools to setup testsuites
35 In contrast to traditional debuggers, NoBug is a non-interactive debugger which
36 is linked to your application doing hard-coded tests in an efficient,
39 .What NoBug can not do
41 NoBug is a (macro-)library, it is not a C/C++ language extension. This
42 means that code must be called at runtime to benefit from the set up
43 contracts. Whats not tested is likely slipping through the net. Being
44 part of the program itself it is affected by memory corruption,
45 certain kinds of misuse may introduce new bugs (test expressions with
46 side effectsfor example).
48 // doc/buildinstall.txt:1 //
49 Building and Installing
50 -----------------------
55 NoBug is developed on linux, using gcc. It should be possible to port
56 it to any other POSIX conforming operating system. Most platform
57 specific things are kept optional, but some things need to be
58 rewritten for the target platform. Currently Linux with a C99
59 conforming gcc is supported, for both, 32 and 64 bit architectures.
60 One gcc extentsion is used (token pasting of varadic macros) which
61 prevents portability to other compilers which don't support this. When
62 this is a problem, contact the NoBug author for implementing a workaround.
64 A Solaris and a Free BSD port is planned at the time of this writing.
66 NoBug has no mandatory dependencies on other software and libraries,
67 some things like valgrind support are optional and automatially
74 Releases are available on:
75 http://www.pipapo.org/nobug-releases/
77 Gpg signed tarballs are being used for distribution. The first step involves
78 checking the signature:
80 $ gpg nobug-VERSION.tar.gz.gpg
82 This will produce a nobug-VERSION.tar.gz and report if the signature could be
85 Since they are built with gnu autotools, the usual build and install procedure
88 $ tar xzvf nobug-VERSION.tar.gz
92 $ make check # optional, run the testsuite
96 Development Version via git
97 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
99 The development version is available via git from
100 `git://git.pipapo.org/nobug` or mirrored at repo.or.cz
101 `git://repo.or.cz/nobug.git`.
103 After you have cloned the repository, you'll then have to bootstrap the
108 Then the usual `./configure && make && make install` (as above) will work.
109 Careful users may run `make check` to run a testsuite before installing.
115 Currently, NoBug installs the following:
117 * A single nobug.h headerfile which your code will use
118 * Libraries that are used by statically linking:
119 - `libnobug.a` for singlethreaded programs.
120 - `libnobugmt.a` for multithreaded programs.
121 * Libraries for dynamic linking:
122 - `libnobug.so` for singlethreaded programs.
123 - `libnobugmt.so` for multithreaded programs.
124 - associated libtool descriptors (`libnobug*.la`)
125 * Pkgconfig control files:
126 - `nobug.pc` for singlethreaded programs.
127 - `nobugmt.pc` for multithreaded programs.
128 * The `nobug_rbdump` utility to inspect NoBug ringbuffers
130 // doc/using.txt:1 //
134 To use NoBug, one needs to include the 'nobug.h' header and link with
135 its approbiate libararies. Compiling must select a
136 xref:buildlevel[build level], else a error will be reported.
137 Many aspects of NoBug can be configured by overriding macros before
138 'nobug.h' gets included.
140 A project using NoBug may use autoconf to check for execinfo and
143 AC_CHECK_HEADER([execinfo.h], AC_DEFINE(HAVE_EXECINFO_H))
144 PKG_HAVE_DEFINE_WITH_MODULES(VALGRIND, [valgrind])
146 For Multithreaded programs, you should also check for pthreads
147 availability and flavor
151 When the resulting `HAVE_PTHREAD`, `HAVE_EXECINFO_H` and
152 `HAVE_VALGRIND_H` are defined by the configure script, the
153 corresponding features become available.
155 NoBug then defines `NOBUG_USE_PTHREAD`, `NOBUG_USE_VALGRIND` and
156 `NOBUG_USE_EXECINFO` to 1. If you do not want to use any of these features in
157 NoBug, you can override these macros to 0 before including nobug.h.
159 If `NVALGRIND` is defined, valgrind support will not be available.
161 There are many other macros which can be set and overridden by the user to
162 control behavior. Please help completing this documentation if you
165 To use NoBug with single threaded programmes, link 'libnobug' to your project;
166 multi-threaded programmes should link with 'libnobugmt'. The both libraries must
167 be initialized with `NOBUG_INIT` before any features can be used or a thread is
168 created. This is discussed in more detail at the
169 xref:multithreading[multithreading] chapter.
171 .Using Nobug from a Project using autoconf
174 PKG_CHECK_MODULES(NOBUGMT_LUMIERA, [nobugmt >= 0.3rc1],
175 AC_DEFINE(HAVE_NOBUGMT_H),
176 AC_MSG_ERROR([NoBug pkg-config metadata missing])
180 // doc/additional.txt:1 //
181 Checking for Additional Tools
182 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
184 NoBug uses a number of optional tools depending on the application
185 and the debugging information required. Such tools as valgrind, gdb and support
186 for multi-threaded applications can be tested whether they are available on a
187 particular system. This can be done, for example, by using autoconf.
189 Depending on the value of the following defines, the relevant tool or feature
192 `*NOBUG_USE_VALGRIND*`::
194 `0`:: Do not use valgrind
196 `*NOBUG_USE_PTHREAD*`::
197 `1`:: Support for multi-thread applications
198 `0`:: Single-threaded applications
200 `*NOBUG_USE_EXECINFO*`::
201 `1`:: Backtrace information
202 `0`:: No backtrace information
204 This macros get automatically defined when the configuration system
205 provides associated `HAVE_*` macros, but might be overridden on the
208 // doc/whichlibrary.txt:1 //
209 Link Appropriate Library
210 ~~~~~~~~~~~~~~~~~~~~~~~~
212 Finally, the appropriate library (for either single or multi-threaded
213 applications) is linked to the project.
215 *libnobug*:: Link-in this library for single threaded applications.
216 *libnobugmt*:: Link with this library for multi-threaded applications.
218 NoBug installed static and dynamic libraries. When your application
219 uses multiple dynamic libraries which use NoBug or you build a dynamic
220 library, then you have to link against the dynamic library.
222 You can use the `pkg-config` tool to gather information about NoBug in
225 Release builds remove all assertions, but logging is still kept. We
226 make the assumption that bugs which were not covered in alpha and beta
227 builds will not easily show up in releases because the assertions
228 there were not sufficient. Furthermore, end users are not test bunnies
229 and will not provide good bug reports anyway. If there is a problem in
230 a release build, try to track down the cause using a beta build from
233 // doc/initialization.txt:1 //
244 before using any other NoBug feature. Probably in main or any other library
245 initialization routine. Calling `NOBUG_INIT` more than once is supported and each
246 subsequent call will be a no-op, thus initialization in main and in libraries
250 Since NoBug is intended to be available through the whole lifetime,
251 destroying it is not advised. Nevertheless there is a desstoy function
252 void nobug_destroy (void)
254 for shutting down NoBug, and free all resources associated with it.
255 This is mostly used in the NoBug testsuite itself to check for leaks
256 and it might be useful for other programs which employ some kind of
262 If you want to use environment variable controlled debuging, then you have to
263 initialize each defined flag with
265 NOBUG_INIT_FLAG(flagname)
269 NOBUG_INIT_FLAG_LIMIT(flagname, default)
271 or one of the C++ compatibility macros.
273 This is documented later in the xref:logconfig[logging configuration] chapter.
278 In Multithreaded programs you should assign an identifier to each
279 thread. A thread identifier is a string which will be automatically
280 appended with an underscore and a incrementing integer. It is is created with:
282 NOBUG_THREAD_ID_SET(name)
284 Calling `NOBUG_THREAD_ID_SET("worker")` will yield in a thread
285 identifier 'worker_1' for example.
287 If you don't set an identifier, then NoBug will assign an automatic one.
288 This is further documented in the xref:multithreading[multi threading]
289 section of this manual.
294 -------------------------------------------------------
296 NOBUG_DEFINE_FLAG(example);
303 NOBUG_THREAD_ID_SET("main");
304 NOBUG_INIT_FLAG(example);
308 -------------------------------------------------------
310 // doc/buildlevels.txt:1 //
312 Debugging Information Granuality: The Build Levels
313 --------------------------------------------------
315 A project can be compiled with debugging information at three
316 different levels: alpha, beta and release:
319 This debugging level is envisaged for the development phase of a project
320 where exhaustive testing and logging are required.
322 This debugging level is more appropriate for projects beyond the
323 development phase and ready for trials in the field and users willing to
326 This level is for final, end-users.
328 .Select a Build Level
329 One of the above debugging levels is selected by defining one of the
330 following compiling options:
332 *ALPHA*:: -DEBUG_ALPHA (`#define EBUG_ALPHA`)
334 *BETA*:: -DEBUG_BETA (`#define EBUG_BETA`)
336 *RELEASE*:: -DNDEBUG (`#define NDEBUG`)
338 If none of the above switches has been set, NoBug will abort the
339 compilation with an error.
341 // doc/logging.txt:1 //
345 Nearly all NoBug Macros emit some log message. NoBug gives the user fine
346 grained control over these log messages to display only interesting information
347 without loosing details.
349 Log messages are routed to different destinations which are:
352 The underlying storage backend. Messages are appended to the
353 end of the buffer, overwriting older messages at the front of
354 the buffer. NoBug comes with a highly efficient ringbuffer
355 implementation. This ringbuffer is temporary by default but
356 can be made persistent on disk which can be inspected with the
360 This is either just stderr or if running under a supported
361 debugger then its facilities to print messages will be used.
364 The user can open files for log messages.
367 Messages are send to the standard system logging daemon.
370 There is are hooks which allows the programmer to catch logmessages and
371 display them in a application defined way.
373 Each logmessage has a priority describing its severity in the same way as
376 All non-fatal messages are associated with a programmer defined flag describing
377 the source of the message (subsystem, module, ...).
379 Putting it all together: A user can define which source/flag shall be logged at
380 what priority level and to which destination. To make this all easier NoBug
381 tries to give reasonable defaults.
383 // doc/logconfiguration.txt:1 //
390 Each Log macro has a explicit or implicit Log-Level which
391 correspondends to syslog levels. Logging is only emitted when the
392 messages is more severe or same than a defined limit.
395 .Defaults levels for logging
397 `````~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
398 , ALPHA, BETA , RELEASE,
399 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
400 *ringbuffer* , TRACE, INFO , NOTICE , ringbuffer must always be most verbose
401 *console* , INFO , NOTICE , -1 , no log to console in release
402 *file* , TRACE, NOTICE , WARNING,
403 *syslog* , -1 , NOTICE , WARNING, no syslog for test runs
404 *application*, INFO , WARNING, ERROR ,
405 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
407 Depending on the build level there is a default logging target and a default
408 limit which is choosen when the user doesn't specify one.
410 The default limits are:
412 * In *ALPHA* builds, `NOBUG_LOG_LIMIT_ALPHA` is used which defaults to `LOG_INFO`
413 * In *BETA* builds, `NOBUG_LOG_LIMIT_BETA` is used and defaults to `LOG_WARNING`
414 * In *RELEASE* builds, `NOBUG_LOG_LIMIT_RELEASE` is used and defaults to `LOG_CRIT`
416 The default targets are:
418 * In *ALPHA* builds, `NOBUG_LOG_TARGET_ALPHA` is used which defaults to
419 `NOBUG_TARGET_CONSOLE`
420 * In *BETA* builds, `NOBUG_LOG_TARGET_BETA` is used and defaults to
422 * In *RELEASE* builds, `NOBUG_LOG_TARGET_RELEASE` is used and defaults to
423 `NOBUG_TARGET_SYSLOG`
425 You can override all of those values with your own preference. Alternatively
426 `NOBUG_LOG_LIMIT` and `NOBUG_LOG_TARGET` can be defined before
427 including "nobug.h" to override all defaults.
429 // doc/logflags.txt:1 //
434 Flags are used to tell NoBug about subsystems/modules or even finer
435 grained parts of the code. Other logging libraries call this
438 A Flag should be declared in a headerfile with
441 NOBUG_DECLARE_FLAG(flagname)
443 preferably in one of your headers
445 Further it must be defined in some implementation file with
448 NOBUG_DEFINE_FLAG(flagname)
452 [[DEFINE_FLAG_LIMIT]]
453 NOBUG_DEFINE_FLAG_LIMIT(flagname, limit)
455 in one of your source files
457 There are also macros which take a 'parent' flag as parameter which is then
458 used to initialize the defaults from another flag
460 [[DEFINE_FLAG_PARENT]]
461 NOBUG_DEFINE_FLAG_PARENT(flagname, parent)
465 [[DEFINE_FLAG_PARENT_LIMIT]]
466 NOBUG_DEFINE_FLAG_PARENT_LIMIT(flagname, parent, limit)
468 This can be used to create hierachies of flags
470 PARA C++ support, c++_logflags; C++ support for log flags
472 When used in C++ programms the following additional marocs are available:
474 NOBUG_CPP_DEFINE_FLAG(name)
475 NOBUG_CPP_DEFINE_FLAG_PARENT(name, parent)
476 NOBUG_CPP_DEFINE_FLAG_LIMIT(name, default)
477 NOBUG_CPP_DEFINE_FLAG_PARENT_LIMIT(name, parent, default)
479 This macros statically initialize the flags at definition time, there is no
480 need to call `NOBUG_INIT_FLAG()` (see below).
483 .Force declarations only
485 When the preprocessor constant
490 is defined to be `1` then *all* definitions here (`NOBUG_DEFINE_*`)
491 become declarations only, when it is defined to be `0` (which is the
492 default) then all definitions behave as described.
493 This can be used to construct a headerfile which only contains
494 definitions but by default yield only declarations. This gives a
495 single point for maintaining flag configurations.
497 .Maintaining flags in a single header 'flags.h'
503 if not included from flags.c then declare the flags,
507 #define NOBUG_DECLARE_ONLY 1
510 /* use only DEFINE_FLAG here */
511 NOBUG_DEFINE_FLAG(example);
514 Reset it to 0 to cause no trouble
517 #undef NOBUG_DECLARE_ONLY
518 #define NOBUG_DECLARE_ONLY 0
531 .Logging Flag Initialization
535 NOBUG_INIT_FLAG(flagname)
539 NOBUG_INIT_FLAG_LIMIT(flagname, default)
541 once at the start of your program for every flag.
543 For flags defined with `NOBUG_DEFINE_FLAG(flagname)` the defaults are initialized
544 as in the xref:logdefaults[table above], while
545 `NOBUG_DEFINE_FLAG_LIMIT(flagname, level)` is used to initialize the
546 default target (depending on build level) to `level`.
548 // doc/logflagsenv.txt:1 //
550 Control what gets logged
551 ~~~~~~~~~~~~~~~~~~~~~~~~
553 The `NOBUG_INIT_FLAG...` calls parsing the environment variable
554 'NOBUG_LOG' to configure what gets logged at runtime. The syntax is as
557 .Formal Syntax for log control
560 logdecl_list --> logdecl, any( ',' logdecl_list).
562 logdecl --> flag, opt(limitdecl, any(targetdecl)).
564 flag --> "identifier of a flag".
566 limitdecl --> ':', "LIMITNAME".
568 targetdecl --> '@', "targetname", opt(targetopts).
570 targetopts --> '(', "options for target", ')', opt(targetopts).
573 Roughly speaking, 'NOBUG_LOG' contains a comma separated list of declarations for
574 flags which are the name of the flag followed by a limit which is written in
575 all uppercase letters and preceeded by a colon, followed by target declarations
576 which are names of the targets, introduced by a at sign. Target declarations
577 can have option, described in the next section. Limit and target
578 declarations are optional and then choosen from the defaults table above. These
579 defaults are currently just an guess what should be useable and might be
584 The Following options are available:
587 `(file=_filename_)`:: set filename backing the ringbuffer
588 `(size=_nnn_)`:: set size of the ringbuffer
589 `(append)`:: don't erase existing ringbuffer
590 `(keep)`:: keep file after application end
591 `(temp)`:: unlink file instantly at creation
594 `(fd=n)`:: redirect console output to fd n
597 `(name=_filename_)`:: log to filename
598 `(append)`:: append to (existing) log
601 `(ident=_name_)`:: global prefix for syslog
602 `(cons)`:: log to system console if syslog is down
603 `(pid)`:: include pid in log
604 `(perror)`:: log to stderr as well
607 .How the NOBUG_LOG is used
610 # set the limit of the default target a default limit (see table above)
611 NOBUG_LOG='flag,other'
613 # set the limit of the default target to DEBUG
614 NOBUG_LOG='flag:DEBUG'
616 # set console and syslog limits for flag to DEBUG
617 NOBUG_LOG='flag:DEBUG@console@syslog'
619 # trace 'other' to a persistent ringbuffer
620 NOBUG_LOG='other:TRACE@ringbuffer(file=log.rb)(size=8192)(keep)'
623 .Using log flags (example.c)
628 NOBUG_DEFINE_FLAG (test);
632 /* NOBUG_INIT; // not needed because of NOBUG_INIT_FLAG */
633 NOBUG_INIT_FLAG (test);
635 TRACE (test, "Logging enabled");
636 TRACE (NOBUG_ON, "Always on");
643 $ cc -DEBUG_ALPHA -lnobug example.c
645 0000000002: TRACE: example.c:11: main: Always on
647 $ NOBUG_LOG=test:TRACE ./a.out
648 0000000001: TRACE: example.c:10: main: Logging enabled
649 0000000002: TRACE: example.c:11: main: Always on
656 There are some debugging flags which are predefined by NoBug.
661 The flag `NOBUG_ON` is always enabled at LOG_DEBUG level. This is
662 static and can not be changed.
667 The flag `NOBUG_ANN` is used for the source annotations. This is
668 static and can not be changed. It differs from `NOBUG_ON` as in
669 never logging to syslog and only define a LOG_WARNING limit for the
670 application callback.
675 Actions on NoBug itself will be logged under the `nobug` flag itself.
676 When you want to see whats going on (useful to check if you call
677 `NOBUG_INIT_FLAG()` on all flags) you can enable it with `NOBUG_LOG=nobug:TRACE`.
679 // doc/macros.txt:1 //
683 The NoBug interface is almost completely implemented using
684 preprocessor macros. This is required because NoBug uses the
685 `+++__FILE__+++` and `+++__LINE__+++` macros to log information on the
686 current file and the current line number within that file. Moreover,
687 all the flat namespace uppercase identifiers make it ease to recognise
688 the macros in source code.
690 All macros are available without condition with a `NOBUG_...` prefix.
691 Macros are also available without this prefix as a convenience,
692 however macros without this prefix must not have been previously
693 defined. When `NOBUG_DISABLE_SHORTNAMES` is defined before including
694 'nobug.h', then only the `NOBUG_` prefixed macros are available and
695 the short forms will never be defined.
697 All assertion and logging macros have a corresponding form
698 postfixed by `..._DBG`. Such macros will only be active within a
701 A set of macros are provided by NoBug that are postfixed by `..._IF`.
702 These macros have the following form:
704 * `..._IF(when, ...)`
706 They perform the desired action only if `when` is true. For example:
708 * `REQUIRE_IF(foo != NULL, foo->something == constrained)`
710 The assertion will only be performed if `foo` is non `NULL`.
712 Debugger versions are available using `..._IF_DBG` postfixed to the name
715 // doc/parametertable.txt:1 //
719 We use names for parameters which descripe their type. This names are
720 orthogonal through all macro definitions.
723 `---------`------------------------------------------------------------------
724 `when` Assertion is only performed if expression `when` is true at runtime
725 `expr` Test without side effects
726 `fmt` printf-like format string
727 `...` If not preceded by `fmt`, then printf-like format string followed by its arguments; otherwise, only its arguments
728 `flag` Flag to enable custom logging groups
729 `type` Data type to be checked as a single identifier name
730 `pointer` Pointer to type
732 `depth` Depth for invariants and dumps
733 ---------------------------------------------------------------------------
735 // src/nobug.h:102 //
742 CHECK_IF(when, expr, ...)
744 This assertion is never optimized out. Its main purpose is for implementing
745 testsuites where one want to assert tests independent of the build level
750 REQUIRE_DBG(expr, ...)
751 REQUIRE_IF(when, expr, ...)
752 REQUIRE_IF_DBG(when, expr, ...)
754 Precondition (input) check. Use these macros to validate input a
755 function receives. The checks are enabled in *ALPHA* and *BETA* builds and
756 optimized out in *RELEASE* builds.
761 ENSURE_DBG(expr, ...)
762 ENSURE_IF(when, expr, ...)
763 ENSURE_IF_DBG(when, expr, ...)
765 Postcondition (progress/output) check. Use these macros to validate the
766 data a function produces (example: return value). The checks enabled
767 unconditionally in *ALPHA* builds and optimized out in *BETA* builds for
768 scopes which are tagged as `CHECKED`. In *RELEASE* builds this checks are
769 always optimized out, but scopes tagged as `UNCHECKED` are not permitted.
774 ASSERT_DBG(expr, ...)
775 ASSERT_IF(when, expr, ...)
776 ASSERT_IF_DBG(when, expr, ...)
778 Generic check. Use these macros when you want to validate something
779 which doesn't fall into one of the above categories. A example is when
780 a library function can return a unexpected result (scanf with syntax
781 error in the formatstring, when a constant/literal formatstring is
782 expected). The checks are enabled in *ALPHA* and *BETA* builds and
783 optimized out in *RELEASE* builds.
789 NoBug overrides the standard assert macro in *ALPHA* and *BETA* builds.
790 This is just a compatibility feature, its use is not suggested.
794 INVARIANT(type, pointer, depth)
795 INVARIANT_DBG(type, pointer, depth)
796 INVARIANT_IF(when,type, pointer, depth)
797 INVARIANT_IF_DBG(when, type, pointer, depth)
799 Checking invariants. You can provide more complex checking functions
800 which test the validity of datastructures. Invariants are only enabled
801 in *ALPHA* builds for scopes which are not tagged as `CHECKED` and
802 otherwise optimized out.
804 TODO: describe how to create invariant checks
806 // src/nobug.h:405 //
814 Never optimized out, logs at LOG_NOTICE level. Its main purpose is for implementing
815 testsuites where one want to print and log messages independent of the build level
821 ALERT_IF(when, flag, ...)
822 ALERT_IF_DBG(when, flag, ...)
824 This is the most critical condition an application might log. This might be used
825 if an error occurs which can not be handled except a safe shutdown for example.
830 CRITICAL_DBG(flag, ...)
831 CRITICAL_IF(when, flag, ...)
832 CRITICAL_IF_DBG(when, flag, ...)
834 An error which can not be handled occured but the application does not need to be
835 shutdowen, perhaps waiting for an operator to fix the cause.
839 ERROR(flag, fmt, ...)
840 ERROR_DBG(flag, fmt, ...)
841 ERROR_IF(when, flag, fmt, ...)
842 ERROR_IF_DBG(when, flag, fmt, ...)
844 Application takes a error handling brach
849 WARN_DBG(flag, fmt, ...)
850 WARN_IF(when, flag, fmt, ...)
851 WARN_IF_DBG(when, flag, fmt, ...)
853 Rare, handled but unexpected branch
858 INFO_DBG(flag, fmt, ...)
859 INFO_IF(when, flag, fmt, ...)
860 INFO_IF_DBG(when, flag, fmt, ...)
862 Message about program progress
866 NOTICE(flag, fmt, ...)
867 NOTICE_DBG(flag, fmt, ...)
868 NOTICE_IF(when, flag, fmt, ...)
869 NOTICE_IF_DBG(when, flag, fmt, ...)
871 More detailed progress message
875 TRACE(flag, fmt, ...)
876 TRACE_DBG(flag, fmt, ...)
877 TRACE_IF(when, flag, fmt, ...)
878 TRACEIF_DBG(when, flag, fmt, ...)
880 Very fine grained messages
882 NOTE: that `TRACE` corresponds to `LOG_DEBUG`, because using `DEBUG` could be ambiguous.
886 LOG(flag, lvl, fmt, ...)
887 LOG_DBG(flag, lvl, fmt, ...)
888 LOG_IF(when, flag, lvl, fmt, ...)
889 LOG_IF_DBG(when, flag, lvl, fmt, ...)
891 Generic logging macro which takes the level explicitly,
892 avoid this, unless you implement your own logging facilities.
896 NOBUG_LOG_BASELIMIT_ALPHA
897 NOBUG_LOG_BASELIMIT_BETA
898 NOBUG_LOG_BASELIMIT_RELEASE
901 anything more detailed than this base limits will be optimized out.
902 This is used to reduce the logging overhead for *RELEASE* builds.
903 By default the limit is set to `LOG_DEBUG` for *ALPHA* and *BETA*
904 builds, so all logging is retained and `LOG_NOTICE` in *RELEASE*
905 builds to log the application progress only coarsely then.
907 This macros can be defined before including 'nobug.h' to some other
908 log level (as defined in 'syslog.h').
910 NOTE: there is no logging macro for `LOG_EMERG` since this is used by the assertions as fatal message
912 // doc/dumping.txt:1 //
914 Dumping Datastructures
915 ----------------------
917 How to write DUMP handlers
919 One can write functions for dumping complex datastructures using the NoBug
920 facilities. This is done by writing a custom function for each
921 datastructure to be dumped which may recursively call other dumping
922 functions. There are macros for logging within such a dumper function
923 and for initiating a dump of a given datastructure.
925 // src/nobug.h:320 //
928 DUMP(flag, type, pointer, depth)
929 DUMP_IF(when, flag, type, pointer, depth)
931 This macros call a datastructure dump of the object (`pointer`) in question.
932 `DUMP_IF` is the only enabled dumping macro for the RELEASE build level.
937 DUMP_LOG_DBG(fmt, ...)
938 DUMP_LOG_IF(when, fmt, ...)
939 DUMP_LOG_IF_DBG(when, fmt, ...)
941 Any output from `DUMP` handlers should be done by these macros.
943 Dumping is by default done on level `LOG_DEBUG`, this can be overridden by
944 defining `NOBUG_DUMP_LEVEL` to some other level.
946 // doc/dumpexample.txt:1 //
947 PARA How to use the DUMP facilities
950 -------------------------------------------------------
954 char * STRING_MEMBER;
955 struct STRUCTNAME* next;
957 -------------------------------------------------------
959 then you define a function like:
962 -------------------------------------------------------
964 nobug_STRUCTNAME_dump (const struct STRUCTNAME* self,
970 // check for self != NULL and that the depth
971 // limit did not exceed in recursive datastructures
974 // use DUMP_LOG not LOG to print the data
975 DUMP_LOG("STRUCTNAME %p: int is %d, string is %s", self,
976 self->INTEGER_MEMBER,
977 self->STRING_MEMBER);
978 // now recurse with decremented depth
979 nobug_STRUCTNAME_dump (self->next, depth-1, file, line, func);
982 -------------------------------------------------------
984 now you can use the DUMP() macros within the code
987 -------------------------------------------------------
990 struct STRUCTNAME foo;
992 DUMP (my_flag, STRUCTNAME, &foo, 2);
994 -------------------------------------------------------
996 // src/nobug.h:651 //
1000 One can tagging features as:
1006 Something which shouldn't be used in future
1012 not yet finished feature
1018 known bug to be fixed later
1024 enhancement to be done soon
1036 used to tag code-path which shall be never executed.
1042 same as `else NOTREACHED()`, but wholly optimized out in release builds.
1044 // doc/annotationtable.txt:1 //
1046 The advantage of this tagging over plain source comments is that we can take
1047 some actions if we run in such a tag at compile or runtime:
1049 the action to be taken when such a macro is hit depends on the build level:
1052 `-------------`-----`------------`-----------------------------------------
1054 ---------------------------------------------------------------------------
1055 DEPRECATED log nothing wont compile
1056 UNIMPLEMENTED abort abort wont compile
1057 FIXME log wont compile wont compile
1058 TODO log log wont compile
1059 PLANNED log nothing nothing
1060 NOTREACHED abort abort removed
1061 ---------------------------------------------------------------------------
1065 * abort means first log and then abort
1066 * log will only log once for each sourceline (not on each hit)
1067 * wont compile will abort compilation with a error message
1068 * nothing optimized out, sane way
1069 * removed optimized out for performance reasons
1071 // doc/scopechecks.txt:1 //
1077 The programmer can tag any scope as `UNCHECKED` or `CHECKED`. In *ALPHA* and *BETA*
1078 builds, a global `UNCHECKED` is implied. In *RELEASE* builds, `UNCHECKED` scopes are
1081 // doc/assertiontable.txt:1 //
1082 .Assertions active depending on Build level and Scope
1084 `-----------`-----------------------------------------`-----------------------------`-------------------
1085 *ALPHA* *BETA* *RELEASE*
1086 *UNCHECKED* Preconditions, Postconditions, Invariants Preconditions, Postconditions compiling will abort
1087 *CHECKED* Preconditions, Postconditions Preconditions
1088 ------------------------------------------------------------------------------------------------------
1090 // src/nobug.h:778 //
1094 NoBug has some macros which can be used to simulate errorneous behaviour:
1098 INJECT_GOODBAD(expr, good, bad)
1100 substitutes to an expression and returns good when expr is false and
1101 bad when expr is true. In BETA and RELEASE builds 'good' is always returned.
1105 INJECT_FAULT(expr, bad)
1107 substitutes to a statement which executes 'bad'
1108 when expr is true. Optimitzed out in BETA and RELEASE builds.
1112 In both cases, when a fault is injected it will be logged at
1113 `NOBUG_INJECT_LEVEL` (default: `LOG_NOTICE`). This can be defined
1114 before including 'nobug.h' to override it.
1116 // doc/resourcetracking.txt:1 //
1120 With little effort, NoBug can watch all kinds of resources a program uses. This
1121 becomes useful for resources which are distributed over a multithreaded
1122 program. Resource tracking is only active in ALPHA builds and optimized out in
1123 BETA and RELEASE builds.
1128 Resources are abstracted, NoBug has little knowledge about the semantics of a
1129 resource, it only keeps records of resources and the code using it and ensures
1130 basic constraints. Detailed usage checks of resource have to be done with other
1133 Resources are identified by a arbitrary identifier which is just a
1134 pointer. Additionally a name, the type and the source locations which
1135 announced the resource are stored.
1137 Code which wants to use a resource calls a enter macro with its own identifier
1138 and state, then might alter the state and finally a leave macro when finished
1141 When a resource is used one has to pass one of this states:
1143 * NOBUG_RESOURCE_WAITING
1144 + For resources where acquisition could block (locks) you enter it with a
1145 WAITING state first and as soon you acquired it you change the state to one
1147 * NOBUG_RESOURCE_EXCLUSIVE
1148 + Acquired the resource exclusively. It must not be acquired
1149 again, not even from the same thread.
1150 * NOBUG_RESOURCE_RECURSIVE
1151 + The resource might be entered multiple times from the same
1152 thread with this state.
1153 * NOBUG_RESOURCE_SHARED
1154 + The resource might be entered multiple times from any thread
1157 Possible state transitions:
1159 ["graphviz", "resource-transistinons.png"]
1160 ---------------------------------------------------------------------
1163 edge [fontname=Courier fontsize=10]
1165 start [shape=ellipse]
1169 start -> Waiting [label="ENTER()"]
1170 start -> Exclusive [label="ENTER()"]
1171 start -> Recursive [label="ENTER()"]
1173 Waiting -> Exclusive [label="STATE()"]
1174 Waiting -> Recursive [label="STATE()"]
1176 Recursive -> Recursive [label="ENTER()\nSTATE()"]
1178 Waiting -> end [label="LEAVE()"]
1179 Exclusive -> end [label="LEAVE()"]
1180 Recursive -> end [label="LEAVE()"]
1184 ---------------------------------------------------------------------
1189 There are small race conditions in the time we
1190 announce/forget/enter/remove resources and doing the actual call to a
1191 resource. These race conditions affect the reporting exactness and are
1192 a design decision. When this poses a problem it will be fixed.
1194 The Resource Tracker relies on that announce/forget and enter/leave
1195 are properly paired. The programmer should ensure that this is done
1196 right, else it will become unusable.
1198 // src/nobug.h:995 //
1199 Resource tracking macros
1200 ~~~~~~~~~~~~~~~~~~~~~~~~
1202 [[RESOURCE_LOGGING]]
1203 [[RESOURCE_LOG_LEVEL]]
1205 Unless the user defines `NOBUG_RESOURCE_LOGGING` to 0 each of the above macros
1206 will emit a log message at `NOBUG_RESOURCE_LOG_LEVEL` which defaults to
1211 RESOURCE_HANDLE(name)
1213 Defines handles to access resources.
1214 Resources are accessed through handles.
1217 identifer to be used for the handle
1219 This macro takes care that the declaration is optimized out in the same manner
1220 the rest of the resource tracker would be disabled. You can still instantiate
1221 handles as `struct nobug_resource_header*` in structures which must have a
1222 constant size unconditional of the build level.
1224 [[RESOURCE_ANNOUNCE]]
1226 RESOURCE_ANNOUNCE(flag, type, name, identifier, handle)
1228 Publishes resources.
1231 the NoBug flag which turns logging on for this macro
1233 a string which should denote the domain of the resource,
1234 examples are "file", "mutex", "lock", "database" and so on
1236 the actual name of a named resource this as string which
1237 together with type forms a unique identifier of the resource. `type` and
1238 `name` must be available through the entire lifetime of the resource, using
1239 literal strings is recommended
1241 a pointer which should be unique for this resource, any
1242 kind of pointer will suffice, it is only used for identification. In
1243 multithreaded applications the thread identifier becomes an additional
1246 a `NOBUG_RESOURCE_HANDLE` which will be initialized to point to
1247 the newly created resource.
1249 Resources must be unique, it is a fatal error when a resource it tried to be
1250 announced more than one time.
1254 RESOURCE_FORGET(flag, handle)
1256 Removes resources that have become unavailable from the registry.
1259 the NoBug flag which turns logging on for this macro
1261 the `NOBUG_RESOURCE_HANDLE` used to track this resource
1263 The resource must still exist and no users must be attached to it, else a fatal
1268 RESOURCE_ENTER(flag, announced, name, identifier, state, handle)
1273 nobug flag which turns logging on for this macro
1275 the handle set by `RESOURCE_ANNOUNCE`
1277 a free-form identifier
1279 some pointer which must be unique for the user of the
1280 resource (see above)
1282 the initial state, one of `NOBUG_RESOURCE_WAITING`,
1283 `NOBUG_RESOURCE_EXCLUSIVE`, `NOBUG_RESOURCE_RECURSIVE` or `NOBUG_RESOURCE_SHARED`
1285 a `NOBUG_RESOURCE_HANDLE` which will be initialized to the
1290 RESOURCE_STATE(flag, entered, state)
1292 Changes resource's state.
1295 is nobug flag which turns logging on for this macro
1297 the new state Note that only certain state transitions are
1298 allowed, see discussion/diagram above
1300 the handle set by `RESOURCE_ENTER`
1304 RESOURCE_LEAVE(flag, handle)
1306 Disconnect from a resource identified with its handle.
1309 nobug flag which turns logging on for this macro
1311 the handle you got while entering the resource
1315 NOBUG_RESOURCE_DUMP(flag, handle)
1316 NOBUG_RESOURCE_DUMP_IF(when, flag, handle)
1318 Dump the state of a single resource.
1321 Condition which must be true to dump the resource
1323 Nobug flag for the log channel
1325 handle of the resource to be dumped
1327 [[RESOURCE_DUMPALL]]
1329 NOBUG_RESOURCE_DUMPALL(flag)
1330 NOBUG_RESOURCE_DUMPALL_IF(when, flag)
1332 Dump the state of all resources.
1335 Condition which must be true to dump the resources
1337 Nobug flag for the log channel
1341 NOBUG_RESOURCE_LIST(flag)
1342 NOBUG_RESOURCE_LIST_IF(when, flag)
1344 List all registered resources.
1347 Condition which must be true to list the resources
1349 Nobug flag for the log channel
1351 // doc/resourceexample.txt:1 //
1352 .How to use the Resourcetracker
1355 NOBUG_DEFINE_FLAG_LIMIT(test, LOG_DEBUG);
1359 // define a mutex and announce it
1360 pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;
1361 RESOURCE_HANDLE(resource);
1363 // 'example' is just a pointer to this function which suffices as unique id
1364 RESOURCE_ANNOUNCE(test, "mutex", "my_mutex", example, resource);
1366 // the following would be done in a different thread in a real program
1367 RESOURCE_HANDLE(enter); // define a handle
1369 RESOURCE_ENTER(flag, resource, &enter, NOBUG_RESOURCE_WAITING, enter);
1370 // announce that we want to use the resource
1371 // &enter also suffices as unique pointer
1372 pthread_mutex_lock (&my_mutex); // this might block
1373 RESOURCE_STATE(test, NOBUG_RESOURCE_EXCLUSIVE, enter); // we got it, change the state
1375 // program does something useful here
1377 pthread_mutex_lock (&my_mutex); // and instantly unlock
1378 RESOURCE_LEAVE(test, enter); // we don't need it anymore
1380 // back in the main thread
1381 RESOURCE_FORGET(test, resource); // remove the resource from the public registry
1385 // doc/resourcedeadlock.txt:1 //
1389 The Resource Tracker is able to detect potential deadlocks. This is done by
1390 learning the relations between locks (precedence). A possible deadlock results
1391 in a log message and a fatal abort. Note that only waiting on resources can
1392 lead to a deadlock. Deadlock detection is implemented in the Resource Tracker
1393 and active in ALPHA builds and optimized out on any other build level.
1395 For details about the deadlock detection algorithm see
1396 xref:deadlock_detection[Appendix: Resource Tracking Alorithm].
1398 // src/nobug.h:2209 //
1402 NoBug provides callbacks, applications can use these
1403 to present logging information in some custom way or hook some special processing in.
1404 The callbacks are initialized to NULL and never modified by NoBug, its the solve responsibility
1405 of the user to manage them.
1407 CAUTION: There are certain constraints what and what not can be done in callbacks
1408 documented below which must be followed.
1411 .type of logging callbacks
1412 typedef void (*nobug_logging_cb)(const struct nobug_flag* flag, int priority, const char *log, void* data)
1414 used for the logging callbacks
1417 Flag structure which defines the logging configuration for this event
1419 Log level of the current event
1421 Pointing to the current log line in the ringbuffer or `NULL`
1423 Global pointer defined by the user, passed arround (see below)
1426 .type of abort callback
1427 typedef void (*nobug_abort_cb)(void* data)
1429 used for the abort callback
1432 Global data defined by the user, passed arround (see below)
1435 .passing data to callbacks
1436 void* nobug_callback_data
1438 This global variable is initialized to `NULL` and will never be touched by NoBug. One can use it
1439 to pass extra data to the callback functions.
1441 [[logging_callback]]
1442 .callback when logging
1443 nobug_logging_cb nobug_logging_callback
1445 This callback gets called when something gets logged.
1446 NoBug will still hold its mutexes when calling this hook, calling NoBug logging or resource tracking
1447 functions from here recursively will deadlock and must be avoided.
1448 The `log` parameter points to the logging message in the ringbuffer.
1449 Unlike other logging targets it is not automatically limited to the log level configured
1450 in the flag but called unconditionally. The callback should implement its own limiting.
1452 When one wants to do complex calls which may include recursion into logging and resource tracking
1453 functions, the intended way is to pass contextual information possibly including a __copy__ of the
1454 `log` parameter in xref:THREAD_DATA[NOBUG_THREAD_DATA] to the postlogging callback (see below).
1455 Other internal NoBug facilties, like the ringbuffer etc, are protected by the mutexes and may be accessed
1458 [[postlogging_callback]]
1459 .callback after logging
1460 nobug_logging_cb nobug_postlogging_callback
1462 This callback gets called after something got logged. The `log` parameter is always NULL and all
1463 NoBug mutexes are released. This means that this function may call any complex things, including
1464 calling logging and resource tracking, but may not call internal NoBug facilities.
1465 Contextual created in the `nobug_logging_callback` and stored in texref:NOBUG_THREAD_DATA can be
1466 retrieved here and may need to be cleaned up here.
1469 .callback for aborting
1470 nobug_abort_cb nobug_abort_callback
1472 This callback gets called when the application shall be terminated due an error.
1473 It can be used to hook exceptions or similar things in. When it returns, `abort()`
1476 IMPORTANT: Errors detected by NoBug are always fatal. If one handles and possible
1477 throws an exception here, the application must shut down as soon as possible.
1478 Most causes for aborts are optimitzed out in `RELEASE` builds.
1480 // src/nobug.h:1404 //
1486 Using this macro one can pass a direct pointer to a flag where a name would
1487 be expected. This is sometimes convinient when flag pointers are passed around
1488 in management strutures and one wants to tie logging to dynamic targets.
1492 NOBUG_DEFINE_FLAG(myflag);
1494 struct nobug_flag* ptr = &NOBUG_FLAG(myflag);
1495 TRACE(NOBUG_FLAG_RAW(ptr), "Passed flag by pointer")
1502 The backtrace macro logs a stacktrace using the NoBug facilities.
1503 This is automatically called when NoBug finds an error and is due
1504 to abort. But one might call it manually too.
1510 This is the default implementation for aborting the program, it first calls the
1511 abort callback if defined and then `abort()`.
1515 If not overridden, evaluates to `NOBUG_ABORT_`. One can override this before including
1516 `nobug.h` to customize abortion behaviour. This will be local to the translation unit then.
1518 [[NOBUG_ALPHA_COMMA]]
1520 NOBUG_ALPHA_COMMA(something)
1521 NOBUG_ALPHA_COMMA_NULL
1523 Sometimes it is useful to have initializer code only in *ALPHA* builds, for example when you
1524 conditionally include resource handles only in *ALPHA* versions. An initializer can then
1525 use this macros to append a comman and something else only in *ALPHA* builds as in:
1526 struct foo = {"foo", "bar" NOBUG_ALPHA_COMMA_NULL };
1531 NOBUG_IF_NOT_ALPHA(...)
1533 NOBUG_IF_NOT_BETA(...)
1534 NOBUG_IF_RELEASE(...)
1535 NOBUG_IF_NOT_RELEASE(...)
1537 This macros allow one to conditionally include the code in '(...)' only if the
1538 criteria on the build level is met. If not, nothing gets substituted. Mostly used
1539 internally, but can also be used for custom things.
1541 // doc/multithreading.txt:1 //
1546 It is important that NoBug protects certain operations with locks in
1547 multithreaded programs. You have to ensure that 'HAVE_PTHREAD_H' is defined by
1548 the configuration system and use the 'libnobugmt' library for linking. It is
1549 particular important that libraries using NoBug are compiled with
1550 'HAVE_PTHREAD_H' enabled when they are intended to be used in multithreaded
1553 When Multithreading is used, log messages contain a identifier of the
1554 originating thread. This identifier should be set by
1557 .NOBUG_THREAD_ID_SET
1558 NOBUG_THREAD_ID_SET(name)
1561 New name for the thread
1563 Nobug will assemble a unique identifier by appending a underscore and a
1564 number to name, for example `NOBUG_THREAD_ID_SET("gui")` will result in a
1565 identifier like "gui_5". When you don't set a thread identifier, then NoBug
1566 assigns one automatically with the name 'thread' preprended if needed. Thread
1567 identifiers may be reset with a new call to this macro.
1570 .NOBUG_THREAD_ID_GET
1573 Will return a const char* of the thread id in multithreaded programs and
1574 a pointer to a literal empty string in singlethreaded programs.
1580 Evaluates to a variable of type `void*` which can be used to store
1581 thread local information. This is useable for xref:callbacks which may
1582 prepare context information to be reused later.
1584 This macro is also available in singlethreaded programs, refering to a
1585 single global variable.
1587 Nobug initializes this variable to `NULL` and then touches it never again.
1590 // src/nobug_rbdump.c:31 //
1592 Dumping Persistent Ringbuffers
1593 ------------------------------
1595 NoBug installs the `nobug_rbdump` tool for dumping the content of a persistent
1596 ringbuffer. It is invoked with the filename of the ringbuffer, the content is then
1599 // doc/testsuite.txt:1 //
1603 TODO Documentation to be written, use the source Luke!
1605 NoBug maintains a `test.sh` script which drives extensive testsuites.
1606 Look at into the 'tests/' folder about how to apply this.
1608 // doc/bestpractices.txt:1 //
1612 NOTE: this section is very work in progress
1617 * Write a testsuite, build your program with -O0 -g -DEBUG_ALPHA and run
1618 the testsuite under valgrind control. Hack until the program mets the
1619 specifications defined by the testsuite.
1621 * Build with desired optimization level and -g -DEBUG_BETA and give the
1622 program to your beta testers.
1624 * Build it with optimization and without -g -DEBUG_*
1626 .What and when to check
1628 * Add REQUIRE checks on your interfaces (incoming parameters). Especially if
1629 a argument might not cover the whole range of the underlying type.
1630 * Don't waste your and your CPU's time with unnecessary checks. The testsuite
1631 should validate your program. NoBug aids in debugging. You can add
1632 Postconditions (ENSURE) and Invariants when you have a bug somewhere and
1633 want to nail it down.
1634 * Added checks don't need to be removed.
1635 * When you use the CHECKED/UNCHECKED features then don't forget C scoping
1636 rules, tag things as CHECKED from the leaves to the root.
1640 * TRACE(flagname) or TRACE_DBG(flagname) at the begin of every nontrivial
1641 function will easily log the progress of your application.
1642 * Trying a RELEASE build will abort on certain conditions (known BUG, TODO's,
1643 UNCHECKED code), you can use this to find these spots.
1648 // src/nobug_resources.c:306 //
1649 [[deadlock_detection]]
1650 The Resource Tracking Algorithm
1651 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1653 Each resource registers a global 'resource_record'.
1655 Every new locking path discovered is stored as 'resource_node' structures which refer to the associated
1658 Threads keep a trail of 'resource_user' strcutures for each resource entered. This 'resource_user' struct
1659 refer to the 'resource_nodes' and thus indirectly to the associated 'resource_record'.
1661 The deadlock checker uses this information to test if the acqusition of a new resource would yield a
1664 [[nobug_resource_enter]]
1668 In multithreaded programs, whenever a thread wants to wait for a 'resource_record'
1669 the deadlock checker jumps in.
1671 The deadlock checking algorithm is anticipatory as it will find and abort on conditions which may lead
1672 to a potential deadlock by violating the locking order learned earlier.
1674 Each thread holds a stack (list) of each 'resource_user' it created. Leaving
1675 a resource will remove it from this stacklist.
1677 Each 'resource_record' stores the trail which other 'resource_records' are already entered. This relations
1678 are implemented with the 'resource_node' helper structure.
1681 TODO: insert diagram here
1694 First we find out if there is already a node from the to be acquired resource back to
1695 the topmost node of the current threads user stack.
1698 ---------------------------------------------------------------------
1699 struct nobug_resource_user* user = NULL;
1700 struct nobug_resource_node* node = NULL;
1702 if (!llist_is_empty (&tls->res_stack))
1704 user = LLIST_TO_STRUCTP (llist_tail (&tls->res_stack),
1705 struct nobug_resource_user,
1708 struct nobug_resource_node templ =
1711 user->current->resource,
1715 node = (struct nobug_resource_node*)
1716 llist_ufind (&resource->nodes,
1718 nobug_resource_node_resource_cmpfn,
1722 ---------------------------------------------------------------------
1724 Deadlock checking is only done when the node is entered in `WAITING` state and only
1725 available in multithreaded programs.
1728 ---------------------------------------------------------------------
1729 if (state == NOBUG_RESOURCE_WAITING)
1731 #if NOBUG_USE_PTHREAD
1733 ---------------------------------------------------------------------
1735 If node was found above, then this locking path is already validated and no deadlock can happen,
1736 else, if this stack already holds a resource (user is set) we have to go on with checking.
1739 ---------------------------------------------------------------------
1743 ---------------------------------------------------------------------
1745 If not then its checked that the resource to be entered is not on any parent trail of the current topmost resource,
1746 if it is then this could be a deadlock which needs to be further investigated.
1749 ---------------------------------------------------------------------
1750 LLIST_FOREACH (&user->current->resource->nodes, n)
1752 for (struct nobug_resource_node* itr =
1753 ((struct nobug_resource_node*)n)->parent;
1757 if (itr->resource == resource)
1760 ---------------------------------------------------------------------
1762 if the resource was on the trail, we search if there is a common ancestor before the resource
1763 on the trail and the threads current chain,
1764 if yes then this ancestor protects against deadlocks and we can continue.
1767 ---------------------------------------------------------------------
1768 for (struct nobug_resource_node* itr2 = itr->parent;
1770 itr2 = itr2->parent)
1772 LLIST_FOREACH_REV (&tls->res_stack, p)
1774 struct nobug_resource_user* user =
1775 LLIST_TO_STRUCTP (p,
1776 struct nobug_resource_user,
1778 if (user->current->resource == itr2->resource)
1781 ---------------------------------------------------------------------
1783 If no ancestor found, we finally abort with a potential deadlock condition.
1786 ---------------------------------------------------------------------
1787 nobug_resource_error = "possible deadlock detected";
1790 ---------------------------------------------------------------------
1793 [[nobug_resource_leave]]
1797 store the tail and next aside, we need it later
1800 ---------------------------------------------------------------------
1801 #if NOBUG_USE_PTHREAD
1802 struct nobug_resource_user* tail =
1803 LLIST_TO_STRUCTP (llist_tail (&user->thread->res_stack),
1804 struct nobug_resource_user,
1806 struct nobug_resource_user* next =
1807 LLIST_TO_STRUCTP (llist_next (&user->res_stack),
1808 struct nobug_resource_user,
1810 ---------------------------------------------------------------------
1812 remove user struct from thread stack
1813 The res_stack is now like it is supposed to look like with the 'user' removed.
1814 We now need to fix the node tree up to match this list.
1817 ---------------------------------------------------------------------
1818 llist_unlink_fast_ (&user->res_stack);
1819 ---------------------------------------------------------------------
1821 When the the user node was not the tail or only node of the thread stack, we have to check
1822 (and possibly construct) a new node chain for it. No valdation of this chain needs to be done,
1823 since it was already validated when entering the resources first.
1826 ---------------------------------------------------------------------
1827 if (user != tail && !llist_is_empty (&user->thread->res_stack))
1829 struct nobug_resource_user* parent = NULL;
1830 if (llist_head (&user->thread->res_stack) != &next->res_stack)
1833 LLIST_TO_STRUCTP (llist_prev (&next->res_stack),
1834 struct nobug_resource_user,
1837 ---------------------------------------------------------------------
1839 iterate over all users following the removed node, finding nodes pointing to this users or
1843 ---------------------------------------------------------------------
1844 LLIST_FORRANGE (&next->res_stack, &user->thread->res_stack, n)
1846 struct nobug_resource_user* cur =
1847 LLIST_TO_STRUCTP (n,
1848 struct nobug_resource_user,
1851 ---------------------------------------------------------------------
1852 // src/nobug_resources.c:652 //
1854 find the node pointing back to parent, create a new one if not found, rinse repeat
1857 ---------------------------------------------------------------------
1858 struct nobug_resource_node templ =
1865 struct nobug_resource_node* node = (struct nobug_resource_node*)
1866 llist_ufind (&resource->nodes,
1868 nobug_resource_node_parent_cmpfn,
1873 node = nobug_resource_node_new (resource, parent->current);
1876 nobug_resource_error = "internal allocation error";
1884 ---------------------------------------------------------------------
1890 xref:ABORT[Aborting]:: abort the program
1891 xref:abort_callback[callback for aborting]:: hook to handle a termination
1892 xref:abort_cb[type of abort callback]:: type of a abort callback function
1893 xref:ALERT[ALERT]:: about to die
1894 xref:ASSERT[ASSERT]:: generic assertion
1895 xref:assert[assert]:: C standard assertion
1896 xref:BACKTRACE[Backtraces]:: generate a backtrace
1897 xref:buildlevel[Build Levels]:: selecting the build level
1898 xref:callback_data[passing data to callbacks]:: data to be passed to callbacks
1899 xref:CHECK[CHECK]:: unnconditional assertion for testsuites
1900 xref:CHECKED[CHECKED, Scope]:: tag scope as reviewed
1901 xref:CRITICAL[CRITICAL]:: can not continue
1902 xref:deadlock_detection[The Resource Tracking Algorithm]:: how resources are tracked
1903 xref:DECLARE_FLAG[DECLARE_FLAG]:: declaring a flag
1904 xref:DECLARE_ONLY[DECLARE_ONLY]:: force flag declarations only
1905 xref:DEFINE_FLAG[DEFINE_FLAG]:: defining a flag
1906 xref:DEFINE_FLAG_LIMIT[DEFINE_FLAG_LIMIT]:: defining a flag w/ log limit
1907 xref:DEFINE_FLAG_PARENT[DEFINE_FLAG_PARENT]:: defining a flag hierarchy
1908 xref:DEFINE_FLAG_PARENT_LIMIT[DEFINE_FLAG_PARENT_LIMIT]:: defining a flag hierarchy, w/ log limit
1909 xref:DEPRECATED[DEPRECATED]:: to be discarded in future
1910 xref:DUMP[DUMP]:: dumping datastructures
1911 xref:DUMP_LOG[DUMP_LOG]:: logging helper for dumping
1912 xref:ECHO[ECHO]:: unconditional logging for tests
1913 xref:ELSE_NOTREACHED[ELSE_NOTREACHED]:: alternative never taken
1914 xref:ENSURE[ENSURE]:: postconditions (computation outcomes)
1915 xref:ERROR[ERROR]:: something gone wrong
1916 xref:FIXME[FIXME]:: known bug
1917 xref:INFO[INFO]:: progress message
1918 xref:INJECT_FAULT[INJECT_FAULT]:: fault injection statement
1919 xref:INJECT_GOODBAD[INJECT_GOODBAD]:: fault injection expression
1920 xref:INJECT_LEVEL[INJECT_LEVEL]:: log level for fault injection
1921 xref:INVARIANT[INVARIANT]:: validate invariant state
1922 xref:LOG[LOG]:: generic logging
1923 xref:LOG_BASELIMIT[LOG_BASELIMIT]:: minimum compliled-in logging limit
1924 xref:logflags[Log Flags]:: define hierarchies for logging output
1925 xref:logging_callback[callback when logging]:: hook when something get logged
1926 xref:logging_cb[type of logging callbacks]:: type of a logging callback function
1927 xref:multithreading[Multithreading]:: using NoBug in multithreaded programs
1928 xref:NOBUG_ALPHA_COMMA[NOBUG_ALPHA_COMMA]:: append something after a comma in *ALPHA* builds
1929 xref:NOBUG_ANN[NOBUG_ANN]:: log flag for annotations
1930 xref:NOBUG_ENV[Control what gets logged]:: environment variable for loging control
1931 xref:nobug_flag[nobug (flag)]:: log flag used to show nobug actions
1932 xref:NOBUG_FLAG_RAW[NOBUG_FLAG_RAW]:: pass direct flag pointer
1933 xref:NOBUG_IF[NOBUG_IF_*]:: include code conditionally on build level
1934 xref:NOBUG_ON[NOBUG_ON]:: log flag which is always enabled
1935 xref:nobug_resource_enter[Entering Resources]:: deadlock check on enter
1936 xref:nobug_resource_leave[Leaving Resources]:: fix resource lists
1937 xref:NOTICE[NOTICE]:: detailed progress message
1938 xref:NOTREACHED[NOTREACHED]:: code path never taken
1939 xref:PLANNED[PLANNED]:: ideas for future
1940 xref:postlogging_callback[callback after logging]:: hook after something get logged
1941 xref:rbdump[Dumping Persistent Ringbuffers]:: dumping persistent ringbuffers
1942 xref:REQUIRE[REQUIRE]:: preconditions (input parameters)
1943 xref:RESOURCE_ANNOUNCE[RESOURCE_ANNOUNCE]:: publish new resources
1944 xref:RESOURCE_DUMP[RESOURCE_DUMP]:: dump the state of a single resource
1945 xref:RESOURCE_DUMPALL[RESOURCE_DUMPALL]:: dump the state of all resources
1946 xref:RESOURCE_ENTER[RESOURCE_ENTER]:: claim a resource
1947 xref:RESOURCE_FORGET[RESOURCE_FORGET]:: remove resources
1948 xref:RESOURCE_HANDLE[RESOURCE_HANDLE]:: define an resource handle
1949 xref:RESOURCE_LEAVE[RESOURCE_LEAVE]:: relinquish a claimed resource
1950 xref:RESOURCE_LIST[RESOURCE_LIST]:: enumerate all registered resources
1951 xref:RESOURCE_LOG_LEVEL[RESOURCE_LOG_LEVEL]:: select the log level for resource logging
1952 xref:RESOURCE_LOGGING[RESOURCE_LOGGING]:: switch resource logging on and off
1953 xref:RESOURCE_STATE[RESOURCE_STATE]:: change the state of a resource
1954 xref:THREAD_DATA[NOBUG_THREAD_DATA]:: thread local data for application use
1955 xref:THREAD_ID_GET[NOBUG_THREAD_ID_GET]:: query thread id
1956 xref:THREAD_ID_SET[NOBUG_THREAD_ID_SET]:: set or reset thread id
1957 xref:TODO[TODO]:: things to be done
1958 xref:TRACE[TRACE]:: debugging level message
1959 xref:UNCHECKED[UNCHECKED, Scope]:: tag scope as unreviewed
1960 xref:UNIMPLEMENTED[UNIMPLEMENTED]:: not yet implemented
1961 xref:WARN[WARN]:: unexpected fixable error
1963 // doc/license.txt:1 //
1968 Copyright (C) 2009 Christian Thäter <ct@pipapo.org>
1970 This program is free software; you can redistribute it and/or modify
1971 it under the terms of the GNU General Public License as published by
1972 the Free Software Foundation; either version 2 of the License, or
1973 (at your option) any later version.
1975 This program is distributed in the hope that it will be useful,
1976 but WITHOUT ANY WARRANTY; without even the implied warranty of
1977 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1978 GNU General Public License for more details.
1980 You should have received a copy of the GNU General Public License along
1981 with this program; if not, write to the Free Software Foundation, Inc.,
1982 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1986 NoBug is released under the "GNU General Public License version 2 or
1987 any later" to protect its freedom. If one wants to use NoBug in a
1988 propietary program, please contact the main author for
1989 acknowledging relicensing terms.
1991 For BSD license style Free Software, this means you can not distribute
1992 binaries linking NoBug without making its source available. To make
1993 this compatible, it is suggested that you dual-license your software
1994 with your prefered BSD like license and the GPL. As long as it uses
1995 NoBug, the GPL will take over and you have to make the source
1996 available, while one can ship a BSD or LGPL Licensed headerfile which
1997 defines all NoBug macros as empty macros and remove libnobug from the
1998 linking, then NoBug isn't used anymore and you may apply BSD license
1999 terms for resulting binaries.
2002 Contributor Agreement
2003 ~~~~~~~~~~~~~~~~~~~~~
2005 Improvements and patches must be licensed as "GPL v2 or any later" to
2006 be acceptable. Further a contributor must either assign his copyright
2007 to the main NoBug author or agree with the possibility that NoBug can
2008 be relicensed for propietary use:
2010 Independent of the GPL license as stated above, The main author of
2011 NoBug explicitly reserve the right to relicense NoBug under
2012 different, even propietary terms. Any contributor agrees to such
2013 a possiblility by sending his contribution to be included into
2014 the official releases.
2016 This agreement is bilateral, every contributor who worked on a
2017 substantial part of NoBug has the right to relicense it after
2018 negotiation with the NoBug main author. Exact terms of such
2019 relicensing are worked out on a per case base.
2021 The intention is that anyone who worked on NoBug should be able to
2022 benefit from his work. This means one should be able to use it at his
2023 workplace, to gain a job or as well as relicense it for a customer.
2024 Unlike other projects which simply ask for transfering the copyright
2025 to the main author, NoBug tries to make it possible to retain the
2026 copyright by anyone who helped the project.
2028 This additional agreement has no impact on the GPL, it's sole purpose
2029 is to define relicensing policies between the NoBug main author and
2030 contributors. When you recieve NoBug it will be licensed under
2031 GPL unless you personally acknowledged other terms with the NoBug main
2032 author (or any other main contributor).
2034 If anyone feels he is not credited in the 'AUTHORS' file or in any
2035 copyright notice, please contact the main author for inclusion.