Date: Wed, 10 Sep 2008 17:06:57 -0700 (PDT) From: Matthew Dillon <dillon@apollo.backplane.com> To: John Baldwin <jhb@freebsd.org> Cc: arch@freebsd.org Subject: Re: PASSERT() - asserting for panics Message-ID: <200809110006.m8B06vOU033199@apollo.backplane.com> References: <200809101531.54646.jhb@FreeBSD.org> <200809102126.m8ALQxdK032024@apollo.backplane.com> <200809101806.38042.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
:I think part of the pollution is that what I really want to do is treat a
:panic like an exception that I can catch. I could probably make that idiom
:work with two macros so your code can be:
:
: PANIC_TRY {
: /* do stuff */
: } PANIC_CATCH("foo");
:
:That could potentially work with some evil goto's that jumped between the
:macros (i.e. have the setjmp() in PANIC_CATCH and PANIC_TRY goto's down to
:--
:John Baldwin
Hmm. Almost java-like, where an exception pops back through subroutine
levels until it finds a match. That kind of functionality would be a
real mess in C. A limited form would be possible, something like this:
#define PANIC_CATCH(label) \ (...)
static jmpbuf label # _jmpbuf
if (0) {
for (;;) {
longjmp(&label # _jmpbuf);
label:
#define PANIC_RETRY }}
#define PANIC_PANIC panic(...); }}
#define PASSERT(label, cond) \ (...)
if (__predict_false(!(cond))) {
setjmp (&label # _jmpbuf);
goto label;
}
PANIC_CATCH(badthings) {
...
PANIC_RETRY;
}
PANIC_CATCH(badthings) {
...
PANIC_PANIC;
}
PASSERT(badthings, x == 1);
Which would allow you some control over the context plus allow multiple
PASSERT's with the same label. But, OMG I don't know about doing
setjmp/longjmp in the kernel. I don't think it would be worth it.
Theoretically one could cross procedural boundaries with the longjmp,
and place the jmpbuf in a DATASET and have the kernel glue the longjmp
address. That would be a candidate for the C obfuscation contest
though.
-Matt
Matthew Dillon
<dillon@backplane.com>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809110006.m8B06vOU033199>
