[lttng-dev] [rp] [RFC] Userspace RCU library internal error handling

Josh Triplett josh at joshtriplett.org
Fri Jun 22 15:55:48 EDT 2012


On Fri, Jun 22, 2012 at 11:22:31AM -0400, Mathieu Desnoyers wrote:
> * Josh Triplett (josh at joshtriplett.org) wrote:
> > #undef NDEBUG
> > #include <assert.h>
> > 
> > Or if you don't consider that sufficient for some reason, you could
> > define your own assert(), but that seems like an odd thing to not count
> > on.  Nonetheless, if you define your own assert, I'd still suggest
> > making it look as much like assert() as possible, including the call to
> > abort().
> 
> #undef NDEBUG is unwanted, due to its side-effects. We use "assert()" in
> other locations of the code, for which we want the assertion check to be
> disabled if NDEBUG is defined in production.

Ah, fair enough.

> I agree with you that calling "abort()" is exactly what we want, and
> it's much more standard that sending a signal chosen with a fair roll of
> dices. How about the following ?
> 
> [...]
> diff --git a/urcu-die.h b/urcu-die.h
> new file mode 100644
> index 0000000..227c8dc
> --- /dev/null
> +++ b/urcu-die.h
> @@ -0,0 +1,37 @@
> +#ifndef _URCU_DIE_H
> +#define _URCU_DIE_H
> +
> +/*
> + * urcu-die.h
> + *
> + * Userspace RCU library unrecoverable error handling
> + *
> + * Copyright (c) 2012 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> + *
> + * This library 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.
> + *
> + * This library 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 this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <string.h>
> +
> +#define urcu_die(cause)								\
> +do {										\
> +	fprintf(stderr, "(" __FILE__ ":%s@%u) Unrecoverable error: %s\n",	\
> +		__func__, __LINE__, strerror(cause));				\
> +	abort();								\
> +} while (0)
> +
> +#endif /* _URCU_DIE_H */
> [...]

That looks reasonable; you've effectively recreated assert, but in a
form that will always have the same effect regardless of NDEBUG.

- Josh Triplett



More information about the lttng-dev mailing list