From: Vladimir T. <vtz...@gm...> - 2009-06-26 21:21:35
|
On 6/26/09, Sam Steingold <sd...@gn...> wrote: > BTW, about pin_varobject -- does it have to be in the same block as > unpin_varobject? (the code does not indicate that, but...) yes, they should be in the same block. In order to ensure that object is unpinned whatever happens (normal success/failure, thread-interrupts with non-local exit) - pinning is inside UNWIND_PROTECT frame - with two required cleanups - in case of stack unwind and normal execution flow. I wanted to write macro WITH_PINNED_OBJECT(obj) - but that would require to push obj on the lisp stack. In stream.d there are many places where this will cause quite a lot of changes (and at that time I was afraid to do them). So I went with what we have now - both pin_varobject() and unpin_varobject() should be inside the same block. BTW: similar is WITH_[XXXX]_MUTEX_LOCK() used in package.d. In it's case I copy lisp stack items to ensure "expected" stack layout after UNWIND_PROTECT frame is established. It's possible to write WITH_PINNED_OBJECT() in similar way but all gotos/return within it's body (particularly in stream.d) should be carefully rewritten. > e.g., in rawsock.c, I want to call pin_varobject inside parse_buffer_arg but > unpin_varobject outside). Compared to stream.d there are much fewer places where pin_varobject()/unpin_varobject() should be used - so may be it is better use them in the same block - or write local macro (with changed stack layout within it). Vladimir |