This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Statement expression with function-call variable lifetime


On 6/29/05, Daniel Jacobowitz <drow@false.org> wrote:
> On Wed, Jun 29, 2005 at 10:34:20AM -0700, Shaun Jackman wrote:
> > the statement expression macro? My best idea was to use alloca, but it
> > wouldn't look pretty. Can someone confirm that memory allocated with
> > alloca would last the lifetime of the function call, and not the
> > lifetime of the statement expression?
> 
> Yes, that's correct (and the only way to do this).

Great! I've rewritten the vfork macro to use alloca. Here's the big
catch, the pointer returned by alloca is stored on the stack, and it
gets trashed upon leaving the statement expression. Where can I store
the pointer returned by alloca? Please don't say allocate some memory
for the pointer using alloca. <evil grin> My best idea so far was to
make the pointer returned by alloca (struct context *c, see below)
static, so that each time the macro is invoked, a little static memory
is put aside for it. I think this would work, but it doesn't seem to
me to be the best solution.

Here's the revised vfork macro that uses alloca:

jmp_buf *vfork_jmp_buf;

struct context {
	jmp_buf *prev_jmp_buf;
	jmp_buf new_jmp_buf;
};

# define vfork() ({ \
	int setjmp_ret; \
	struct context *c = alloca(sizeof *c); \
	c->prev_jmp_buf = vfork_jmp_buf; \
	vfork_jmp_buf = &c->new_jmp_buf; \
	if( (setjmp_ret = setjmp(*vfork_jmp_buf)) != 0 ) \
		vfork_jmp_buf = c->prev_jmp_buf; \
	setjmp_ret; \
})

Cheers,
Shaun


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]