digitalmars.D.learn - Is stdout.flush() unsafe?
- tsbockman (9/11) Dec 29 2015 Trying to compile this:
- Steven Schveighoffer (15/25) Dec 29 2015 Hm... what is needed is an accessor for stdout:
Trying to compile this: void main() safe { import std.stdio; stdout.flush(); } Fails with this message:Error: safe function 'main' cannot access __gshared data 'stdout'Is this necessary? If so, what are the synchronization requirements for access to `stdout`?
Dec 29 2015
On 12/29/15 4:57 AM, tsbockman wrote:Trying to compile this: void main() safe { import std.stdio; stdout.flush(); } Fails with this message:Hm... what is needed is an accessor for stdout: void main() safe { import std.stdio; auto safe_stdout() trusted { return stdout; } safe_stdout.flush(); } The issue is the storage class __gshared is banned from accessing in safe code (because it is subject to races). So you have to claim to the compiler "I know this is generally not safe, but I have encapsulated it in a way to make it safe". Likely, this is what we should do for all the standard streams, not being able to access streams in safe code seems a steep restriction. -SteveError: safe function 'main' cannot access __gshared data 'stdout'Is this necessary? If so, what are the synchronization requirements for access to `stdout`?
Dec 29 2015