Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] Re: More V4 Video API Q's



Rob.McConnell@Zarlink.Com wrote:


Now the question is should the corresponding pthread_cleanup_pop be placed
at the same level as the push or at a higher level to ensure the cleanup
handler is removed properly.

e.g. pthread_cleanup_push(cleanup_handler, NULL);

ioctl(DVB_VIDEO_GET_EVENT, ......); [BLOCKED]

pthread_cleanup_pop(0);

Here if another thread/process calls pthread_cancel to cancel this thread,
then it will exit immediately before it gets to pthread_cleanup_pop. The
man page recommends keeping the push/pop calls in the same function, but
I'm not convinced of this.

Any comments?

Maybe you want to take a look into the push/pop() declaration and implementation: they are macros and start a new {}-block:

-------------------- /usr/include/pthread.h ------------------------

/* Install a cleanup handler: ROUTINE will be called with arguments ARG
when the thread is cancelled or calls pthread_exit. ROUTINE will also
be called with arguments ARG when the matching pthread_cleanup_pop
is executed with non-zero EXECUTE argument.
pthread_cleanup_push and pthread_cleanup_pop are macros and must always
be used in matching pairs at the same nesting level of braces. */

#define pthread_cleanup_push(routine,arg) \
{ struct _pthread_cleanup_buffer _buffer; \
_pthread_cleanup_push (&_buffer, (routine), (arg));

extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer,
void (*__routine) (void *),
void *__arg) __THROW;

/* Remove a cleanup handler installed by the matching pthread_cleanup_push.
If EXECUTE is non-zero, the handler function is called. */

#define pthread_cleanup_pop(execute) \
_pthread_cleanup_pop (&_buffer, (execute)); }

extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *__buffer,
int __execute) __THROW;

-----------------------------

So they definitely need to live in the same function.

Holger





Home | Main Index | Thread Index