Re: Proposed implementation of getenv and friends
Danny Backx escreveu:
> Attached is a proposed implementation for getenv, setenv, unsetenv. I
> would put this in src/mingw/mingwex/getenv.c . A test program is in the
> other attachment.
Based on the Makefile.in patch looks like you meant mingw/mingwex/wince/
> I would propose using this to get libgcov to work on mingw32ce.
> Comments, or can I commit and change libgcov to use this ?
Humm, I had an instant reaction to say no, then I though about it some
more, and I was inclined to say yes, but... thinking some more, I don't
think this is appropriate for common mingw/ code. Please keep reading.
> + * We store stuff in HKEY_CURRENT_USER under the key "environment".
> + *
I think whatever comes out of this patch, it this needs to be put into
an addicional subdir, like
As it is, there is a risk of collision. Plus, if we in the future add
more keys to the registry, they'll
> +char *getenv(const char *name)
> + r = RegOpenKeyEx(HKEY_CURRENT_USER, env, 0, 0, &k);
> + if (r != ERROR_SUCCESS)
> + return -1;
Return NULL ?
The thing with this kind of global environ implementation is that since
it delegates all work to the registry it should be ok to have it in
a static lib, (each dll/exe gets a copy), there is a major difference
to the the common implementations found in other operating systems.
The problem is that all apps will read/write to/from the same keys,
which is racy, while the most (all, maybe it is specified in some standard)
other implementations guaranty that each process has a private environment.
One way to solve that, is to have the app/dll read/cache the environ at
startup, and then read/write to the cached version. This brings up
a new problem,because then a dll linked with a static getenv, would
change its local environ cache and the other dlls and the main app
wouldn't see it. The easiest way to solve that would be to put
getenv/setenv/etc, in a dll of its own... This is where I come to
the conclusion that it is better to have a local private getenv in
libgcov and use that wrapped in __MINGWCE32__. I don't have a
problem with dlls, but I don't think this case it justifies an
extra dependency. This is the same rationale I used to introduce
src/gcc/libstdc++-v3/config/os/mingw32ce/runtimeopts.h, and replaced
every getenv call in libstdc++ with runtime_opts::force_new_p().
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash