On Thu, Jan 09, 2003 at 03:30:59PM +0100, Pawel Jakub Dawidek wrote:

> I got strange problem when trying to implement something like exceptions
> with setjmp()/longjmp() functions.
> 
>       [...]
>       int ret;
>       jmpbuf buf;
>       [...]
>       ret = setjmp(buf);
>       KASSERT(ret != 1, ("I never return 1 with longjmp()."));
>       [...]
>       longjmp(buf, value_diffrent_than_1);
>       [...]
> 
> And setjmp() returns only 0 or 1 (when longjmp() is called), but never
> returns value that I've put in longjmp() call.
> 
> There could be some other problems in using setjmp()/longjmp()
> in kernel? I'm paying attention on memory leaks and locks that are
> done before longjmp().

The usage of the setjmp macro in an assignment is not defined by ISO C,
which might or might not be your problem.

7.13.1.1 The setjmp macro

An invocation of the setjmp macro shall appear only in one of the following contexts:

-- the entire controlling expression of a selection or iteration statement;
-- one operand of a relational or equality operator with the other operand an integer
    constant expression, with the resulting expression being the entire controlling
    expression of a selection or iteration statement;
-- the operand of a unary ! operator with the resulting expression being the entire
    controlling expression of a selection or iteration statement; or
-- the entire expression of an expression statement (possibly cast to void).

OTOH, vinum and ficl use setjmp in the same way.

Stefan

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to