pthread.h: typo in #define
pthread_cleanup_push/pthread_cleanup_pop
Kostik Belousov
kostikbel at gmail.com
Tue Nov 24 15:34:27 UTC 2009
On Tue, Nov 24, 2009 at 05:18:29PM +0200, Mikolaj Golub wrote:
> On Tue, 24 Nov 2009 16:53:35 +0200 Mikolaj Golub wrote:
>
> > Hi,
> >
> > I have problems with compiling our application under 8.0.
> >
> > It fails due to these definitions in pthread.h that look like a typo or
> > incorrectly applied patch:
> >
> > 170 #define pthread_cleanup_push(cleanup_routine, cleanup_arg) \
> > 171 { \
> > 172 struct _pthread_cleanup_info __cleanup_info__; \
> > 173 __pthread_cleanup_push_imp(cleanup_routine, cleanup_arg,\
> > 174 &__cleanup_info__); \
> > 175 {
> > 176
> > 177 #define pthread_cleanup_pop(execute) \
> > 178 } \
> > 179 __pthread_cleanup_pop_imp(execute); \
> > 180 }
> >
> >
> > This patch fixes the problem for me:
>
> I was hurry when said that the patch fixed the problem. The application
> compiled but later it crashed in pthread_cleanup_pop:
>
> (gdb) bt
> #0 0xbf4f9ee0 in ?? ()
> #1 0x287d18c9 in __pthread_cleanup_pop_imp () from /lib/libthr.so.3
> #2 0x287d18ed in pthread_cleanup_pop () from /lib/libthr.so.3
> #3 0x287d123c in pthread_exit () from /lib/libthr.so.3
> #4 0x287c7757 in pthread_getprio () from /lib/libthr.so.3
> #5 0x00000000 in ?? ()
>
> So, I don't know what these macros actually were supposed to be. They were
> introduced in r179662:
>
> Revision 1.43: download - view: text, markup, annotated - select for diffs
> Mon Jun 9 01:14:10 2008 UTC (17 months, 2 weeks ago) by davidxu
> Branches: MAIN
> Diff to: previous 1.42: preferred, colored
> Changes since revision 1.42: +21 -2 lines
>
> SVN rev 179662 on 2008-06-09 01:14:10Z by davidxu
>
> Make pthread_cleanup_push() and pthread_cleanup_pop() as a pair of macros,
> use stack space to keep cleanup information, this eliminates overhead of
> calling malloc() and free() in thread library.
>
> Discussed on: thread@
>
> > --- pthread.h.orig 2009-11-24 16:44:13.000000000 +0200
> > +++ pthread.h 2009-11-24 16:44:45.000000000 +0200
> > @@ -172,10 +172,10 @@
> > struct _pthread_cleanup_info __cleanup_info__; \
> > __pthread_cleanup_push_imp(cleanup_routine, cleanup_arg,\
> > &__cleanup_info__); \
> > - {
> > + }
> >
> > #define pthread_cleanup_pop(execute) \
> > - } \
> > + { \
> > __pthread_cleanup_pop_imp(execute); \
> > }
pthread_cleanup_push/pop are supposed to be used from the common
lexical scope. Citation from SUSv4:
These functions may be implemented as macros. The application shall
ensure that they appear as statements, and in pairs within the same
lexical scope (that is, the pthread_cleanup_push() macro may be
thought to expand to a token list whose first token is '{' with
pthread_cleanup_pop() expanding to a token list whose last token is the
corresponding '}' ).
Your change is wrong.
Basically, the code should do
pthread_cleanup_push(some_func, arh);
something ...
pthread_cleanup_pop(1);
(1 denotes that some_func should be called).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20091124/35a76e19/attachment.pgp
More information about the freebsd-stable
mailing list