Boost logo

Boost :

Subject: Re: [boost] [system] Would it be possible to trial a breaking change to Boost.System and see what happens?
From: Peter Dimov (lists_at_[hidden])
Date: 2018-01-14 16:30:11


Niall Douglas wrote:

> If you link all your DLLs with the static MSVC runtime so each gets a copy
> of a system_category implementation, _Immortalize still ensures that only
> one instance ever appears to exist in the process. So each error category
> always gets its unique address in the process. At least, this is what I've
> been told.

This was an interesting claim so I looked into it.

No, categories from DLLs using the static runtime do not have the same
address, and _Immortalize doesn't help with that.

C:\Projects\test_system_error>bin\msvc-14.1\debug\runtime-link-static\single_instance_test.exe

e1: 'system:0'; { 0, 560F6B00 }
e2: 'system:0'; { 0, 57E86B00 }
No errors detected.

They do, however, compare equal.

The equality comparison simply makes sure that all system categories compare
equal:

bool operator==(const error_category& _Right) const _NOEXCEPT
    { // compare categories for equality
    return (_Addr == _Right._Addr);
    }

where

/* constexpr */ error_category() _NOEXCEPT // TRANSITION
    { // default constructor
    _Addr = reinterpret_cast<uintptr_t>(this);
    }

but

protected:
    uintptr_t _Addr;

    enum : uintptr_t
        { // imaginary addresses for Standard error_category objects
        _Future_addr = 1,
        _Generic_addr = 3,
        _Iostream_addr = 5,
        _System_addr = 7
        };

Perhaps we need to do something similar in Boost.System; the combination of
link=static and runtime-link=shared is disallowed at Boost Jamroot level,
but it could still help the "header-only in DLLs" case.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk