replacing new, getting sane allocator/iostreams behavior
Carlo Wood
carlo@alinoe.com
Tue Jul 3 20:19:00 GMT 2001
On Tue, Jul 03, 2001 at 06:03:51PM -0700, Benjamin Kosnik wrote:
> Your patch won't work: it disables the sync_with_stdio functionality, for
> starters.
It does? How? I started off with the source of 3.0 which was:
ios_base::Init::Init()
{
if (++_S_ios_base_init == 1)
{
// Standard streams default to synced with "C" operations.
ios_base::Init::_S_synced_with_stdio = true;
_S_ios_create(ios_base::Init::_S_synced_with_stdio);
}
}
and I changed that into:
ios_base::Init::Init()
{
if (_S_ios_base_init == 0)
{
// Standard streams default to synced with "C" operations.
ios_base::Init::_S_synced_with_stdio = true;
_S_ios_create(ios_base::Init::_S_synced_with_stdio);
}
++_S_ios_base_init;
}
How does that disables the sync_with_stdio functionality?
> Also, with changes to the allocator class and other bits, I'm
> not quite sure this is possible.
It should be as I looked at this independant of other code (I don't even
know how that looks like or what it does). The changes I proposed do
not change the functionality in ANY way - except that it STILL works
in cases where it now fails (namely when ios_base::Init is created
from within operator new). When there is NOT an ios_base::Init created
from within operator new, my changes (should) have no effect at all.
Therefore it is impossible that it would break something.
If I am wrong then please clarify what I am missing :)
> -benjamin
A sumary of the proposed change is as follows.
At the moment, the only possiblity is to NOT create a ios_base::Init
anywhere during a call to operator new (well, at least - that wouldn't
have any effect). This results in a program flow that can only look like:
ios_base::Init::Init()
|
V
_S_ios_create()
|
V
operator new() [ we can not use std::cout in operator new ]
|
return
|
V
_S_ios_create()
|
return
|
V
ios_base::Init::Init()
After the change, it is also allowed to have:
ios_base::Init::Init()
|
V
_S_ios_create()
|
V
operator new()
|
V
ios_base::Init::Init()
|
V
_S_ios_create() ^
| |
V |
operator new() |_ actual initialization
| |
return |
| |
V |
_S_ios_create() v
|
return
|
V
ios_base::Init::Init() (first Init object that is successfully created)
|
return
|
V
operator new() [ here we can use std::cout in operator new ]
|
return
|
V
_S_ios_create() (returns without (additional) effect)
|
return
|
V
ios_base::Init::Init() (second Init object that is successfully created)
--
Carlo Wood <carlo@alinoe.com>
More information about the Libstdc++
mailing list