Boost logo

Boost :

Subject: Re: [boost] [log] Release candidate 1
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2013-03-11 08:33:42


On Mon, Mar 11, 2013 at 4:27 PM, Stefan Strasser <strasser_at_[hidden]> wrote:
> Am 11.03.2013 12:51, schrieb Andrey Semashev:
>
>>> then it's an implemention detail, I'd suggest making all the functions of
>>> logging::core static, or make logging::core a namespace.
>>> if you wanna add the feature you've mentioned later on, you could for
>>> example ask the user to construct and hold a core::log_during_termination
>>> object, which - again as an implementation detail - holds a shared_ptr to
>>> the internal core.
>>
>>
>> This won't work because every static function would have to obtain the
>> pointer to the core which may be invalidated because its global
>> destructor has been invoked already.
>
> I'm not suggesting any changes to the internals, only to the interface.
> Maybe the following code makes it a little clearer:
>
>
> class core{
> public:
> static void set_filter(){ get()->set_filter_impl(); }

Like I said, you crash in set_filter()/get() because it accesses a
destroyed shared_ptr. Or do you have some non-obvious implementation
of get() in mind?

> private:
> static shared_ptr<core> get();
> void set_filter_impl();
> friend class log_during_termination;
> };
>
> class log_during_termination{
> public:
> log_during_termination() : hold(core::get()){}
> private:
> shared_ptr<core> hold;
> };
>
>
> user code:
> -----------
>
> A(){
> public:
> ~A(){
> //logging core is not destructed yet
> }
> private:
> log::log_during_termination logterm;
> }
>
> static A a;


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