[v3] libstdc++/36104 namespace versioning, revisited
François Dumont
francois.cppdevs@free.fr
Wed Feb 2 21:17:00 GMT 2011
Hi
I really appreciate this patch even if I was right in the middle of
my devs that was very impacted by it :-)
However it introduced a small regression. As far as I know
combining debug and parallel mode was possible. Mostly because the two
modes are playing in different areas, containers for debug mode and
algos for parallel. Why have you added this in the c++config file:
# if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_PARALLEL)
# error illegal use of multiple inlined namespaces
# endif
Now I had plan to do just what you are describing in this mail that
is to say introduce real debug algos. I try to keep debug and parallel
mode compatible so here is what I have plan to do:
#if defined(_GLIBCXX_DEBUG) or defined(_GLIBCXX_PROFILE) or \
defined(_GLIBCXX_PARALLEL)
# define _GLIBCXX_STD_C __cxx1998
# define _GLIBCXX_BEGIN_NAMESPACE_CONTAINER \
namespace _GLIBCXX_STD_C { _GLIBCXX_BEGIN_NAMESPACE_VERSION
# define _GLIBCXX_END_NAMESPACE_CONTAINER \
} _GLIBCXX_END_NAMESPACE_VERSION
# define _GLIBCXX_STD_A __cxx1998
# define _GLIBCXX_BEGIN_NAMESPACE_ALGO \
namespace _GLIBCXX_STD_A { _GLIBCXX_BEGIN_NAMESPACE_VERSION
# define _GLIBCXX_END_NAMESPACE_ALGO \
} _GLIBCXX_END_NAMESPACE_VERSION
# if defined(_GLIBCXX_PARALLEL)
# if defined(_GLIBCXX_DEBUG)
# define _GLIBCXX_PARALLEL_A __parallel_algos
# else
# define _GLIBCXX_PARALLEL_A __parallel
# endif
# define _GLIBCXX_BEGIN_NAMESPACE_PARALLEL_ALGO \
namespace _GLIBCXX_PARALLEL_A { _GLIBCXX_BEGIN_NAMESPACE_VERSION
# define _GLIBCXX_END_NAMESPACE_PARALLEL_ALGO \
} _GLIBCXX_END_NAMESPACE_VERSION
# else
# define _GLIBCXX_PARALLEL_A _GLIBCXX_STD_A
# endif
# if defined(_GLIBCXX_DEBUG) or defined(_GLIBCXX_PROFILE)
# undef _GLIBCXX_EXTERN_TEMPLATE
# define _GLIBCXX_EXTERN_TEMPLATE -1
# endif
#endif
_GLIBCXX_PARALLEL_A defines the namespace containing the parallel
version of algos. When both debug and parallel mode are actives user
code will call debug algos that will then invoke parallel algos. I also
consider internal usage of algos, there are 2 situations:
- usage of algos in containers: as there is already debug containers,
containers do not have to rely on debug algos. So _GLIBCXX_PARALLEL_A
will expose the parallel algos for containers so it will also be defined
when parallel mode is not active and will use normal algos then.
- usage of algos outside containers: there are not a lot of usage of
this kind, for the moment I only detect usage of copy in
char_traits::copy but I haven't work on all algos yet. In this situation
I plan to simply directly use algos from std so that it will get debug
or/and parallel version when activated
For profile mode I plan to introduce algos simply forwarding to normal
algos for the moment just to avoid introduction of additional macros.
Does it sounds ok ?
François
On 01/30/2011 11:34 PM, Benjamin Kosnik wrote:
> This takes care of the rest of the inline namespace issues outlined in
> bugzilla, minus docs which I will complete posthaste.
>
> The main part of this patch is c++config.h, where the macros used to
> activate inline namespaces change. In a nutshell, instead of always
> using a macro on the top-level namespace (std) to push and pop
> conditional namespaces, the top-level namespace (std) is
> unconditionally defined and all inline namespaces have their own macro
> for conditional use of the form:
>
> _GLIBCXX_BEGIN_NAMESPACE_*
> _GLIBCXX_END_NAMESPACE_*
>
> I'm not John Pawson, but I'm hoping others agree with me that the new
> style c++config.h is smaller, better, faster, easier to read. Most of
> all the space dedicated to inline namespaces is...... almost nothing.
> Comparatively, of course.
>
> In addition, several advantages:
>
> 1) top-level namespaces not being a macro mean that many standard
> editors now properly indent the libstdc++ sources without extra work
>
> 2) full matrix of inline namespace combinations now work correctly with
> each other: previously, versioned + debug did not work, etc. The
> correct nesting of inline namespaces solves this general class of bugs.
>
> 3) all C++0x namespaces in std now are fair game to
> profile/debug/parallel modes
>
> 4) the additional clarity in std namespace partitions for extended modes
> means that it will be possible to add debug versions of things that are
> now sequestered in parallel sub-namespaces. I wasn't quite sure how to
> do this before, which was worrisome given the direction of work in both
> debug and parallel mode.
>
>
> tested x86_64/linux -fvisibility=hidden
>
> tested x86_64/linux
> tested x86_64/linux -D_GLIBCXX_DEBUG
> tested x86_64/linux -D_GLIBCXX_PROFILE
> tested x86_64/linux -D_GLIBCXX_PARALLEL
>
> all below configured with --enable-symvers=gnu-versioned-namespace
>
> tested x86_64/linux
> tested x86_64/linux -D_GLIBCXX_DEBUG
> tested x86_64/linux -D_GLIBCXX_PROFILE
> tested x86_64/linux -D_GLIBCXX_PARALLEL
>
>
>
>
More information about the Libstdc++
mailing list