delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1998/02/23/03:19:48

From: tvoverbe AT wk DOT estec DOT esa DOT nl (Ton van Overbeek)
Subject: Re; Initializing gnuwin DLLs
23 Feb 1998 03:19:48 -0800 :
Message-ID: <9802230926.AA01721.cygnus.gnu-win32@wk.estec.esa.nl>
To: mlx AT san DOT rr DOT com
Cc: gnu-win32 AT cygnus DOT com, mbrett AT wren DOT rpms DOT ac DOT uk

Hi,

I have had some success in initializing cygwin.dll from my own dll.
In my case 'own dll' is a Matlab mex-function.
I am not finished yet, but the results up till now are promising.

In a normal cygwin compiled main the runtime start-up (cygwin_crt0())
calls dll_crt0() which jumps into cygwin.dll by calling dll_crt0_1().
This one does all the initializing (heap, environment, file I/O,signals,
preparation for fork, and things like setting up _impure_ptr).
Finally it calls main() and then exit().

My idea is kind of a brute force approach:
 Just call cygwin_crt0() from my own dll. This one of course
 will call a main() provided by me. This main() should not
 finish, otherwise exit() will be called and the process with
 my own dll will be terminated.
 In the PROCESS_ATTACH entry of the dll entry function I create
 a new thread which contains the call to cygwin_crt0() and my main().
 This thread is given the highest priority and the dll entry function
 returns after creating the thread and setting its priority.
 The 'never ending main()' is realised by creating a non-signalled
 Windows32 event and then waiting for it to become signalled.

This approach seems to work, at least I can do file I/O (which involves
use of malloc()) and read environment variables (which are copied in the
cygwin.dll initialization).
Remaining problems to deal with: 
- Multiple dlls in the same process using cygwin.dll.
  We only want to initialize once, otherwise we end up
  with 3 extra threads for each initialization (1 doing
  the initialization and 2 from cygwin.dll (coolview nov 97 version).
  This can probably be solved by using a Mutex.
- Repeated loading/unloading of my own dll. (Matlab uses LoadLibrary
  to load the dll).

I hope this information is usefull also for people trying to combine
MSVC compiled programs with cygwin compiled dlls.

What we really need is a proper initialization function in cygwin.dll which
can be called by dll's in non-cygwin applications.
Alternatively the cygwin.dll dll entry function at PROCESS_ATTACH time
should somehow be able to check if it has to do some initialization itself or not.

Regards,
Ton van Overbeek, tvoverbe AT wk DOT estec DOT esa DOT nl
-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request AT cygnus DOT com" with one line of text: "help".

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019