view .hgtags @ 12765:2dd4569e0640

[LIBXC] Add an error reporting API to the libxc library.

- An 'xc_error' struct is used to pass around error
details. Currently contains two members 'code' an enumeration of
error types, and 'message' a free text description of the specific

- The xc_get_last_error() method returns a const pointer to the
internal instance of this struct manged by libxc. By returning a
const pointer we can add extra members to the end of the struct at
any time without worrying about ABI of callers. This will let us
provide more fine-grained info if needed in the future.

- The xc_error instance is statically defined inside libxc and marked
__thread. This ensures that errors are recorded per-thread, and
that when dealing with errors we never need to call malloc - all
storage needed is statically allocated.

- The xc_clear_last_error() method resets any currently recorded
error details

- The xc_error_code_to_desc() method converts the integer error code
into a generic user facing messsage. eg "Invalid kernel". Together
with the 'message' field from xc_error, this provides the user
visible feedback. eg "Invalid kernel: Non PAE-kernel on PAE host."

- A callback can be registered with xc_set_error_handler to receive
notification whenever an error is recorded, rather than querying
for error details after the fact with xc_get_last_error

- If built with -DDEBUG set, a default error handler will be
registered which calls fprintf(stderr), thus maintaining current
behaviour of logging errors to stderr during developer builds.

- The python binding for libxc is updated to use xc_get_last_error
to pull out error details whenever appropriate, instead of
returning info based on 'errno'

- The xc_set_error method is private to libxc internals, and is used
for setting error details

- The ERROR and PERROR macros have been updated to call xc_set_error
automatically specifying XC_INTERNAL_ERROR as the error code. This
gives a generic error report for all current failure points

- Some uses of the ERROR macro have been replaced with explicit
calls to xc_set_error to enable finer grained error reporting. In
particular the code dealing with invalid kernel types uses this
to report about PAE/architecture/wordsize mismatches

The patch has been tested by calling xm create against a varietry of
config files defining invalid kernels of various kinds. It has also
been tested with libvirt talking to xend. In both cases the error
messages were propagated all the way back up the stack.

There is only one place where I need to do further work. The suspend
& restore APIs in Xend invoke external helper programs rather than
calling libxc directly. This means that error details are essentially
lost. Since there is already code in XenD which scans STDERR from
these programs I will investigate adapting this to extract actual
error messages from these helpers.

Signed-off-by: Daniel P. Berrange <>
author kfraser@localhost.localdomain
date Thu Dec 07 11:36:26 2006 +0000 (2006-12-07)
parents 3cc0b589c235
children f80f1cc7f85e
line source
1 42882b3e0dda89f3a8ec00da568f86e9b3c230f1 RELEASE-2.0.0
2 475a162b66e2c19b1e9468b234a4ba705334905e RELEASE-2.0.1
3 dc2f08429f17e6614fd2f1ab88cc09ca0a850f32 RELEASE-2.0.2
4 6e1bbc13911751efa0b1c018425c1b085820fa02 RELEASE-2.0.3
5 fb875591fd72e15c31879c0e9034d99b80225595 RELEASE-2.0.4
6 1a522944f76540ea9d73fcc1b0d13d0f670183f0 RELEASE-2.0.5
7 2a5814ad2e5634a5fa291b703a152e7fc0b4faf0 RELEASE-2.0.6
8 487b2ee37d1cecb5f3e7a546b05ad097a0226f2f beta1
9 6a65fe0f84c8339b5b89362d0ec34d8abab752b0 ia64-stable
10 3d330e41f41ce1bc118c02346e18949ad5d67f6b latest-semistable
11 30c521db4c71960b0cf1d9c9e1b658e77b535a3e latest-stable
12 9afec5bc14aeb197ef37ea54a57eacd427463fc3 semistable
13 30c521db4c71960b0cf1d9c9e1b658e77b535a3e split-1.0
14 3d330e41f41ce1bc118c02346e18949ad5d67f6b split-1.1
15 c8fdb0caa77b429cf47f9707926e83947778cb48 RELEASE-3.0.0
16 af0573e9e5258db0a9d28aa954dd302ddd2c2d23 3.0.2-rc
17 d0d3fef37685be264a7f52201f8ef44c030daad3 3.0.2-branched
18 6ed4368b4a9e1924c983774c4b1a2b6baf8e98a6 3.0.3-branched