OSDN Git Service

* path.cc (conv_path_list): Take cygwin_conv_path_t as third parameter.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / dll_init.h
index ca2cc2c..d1be162 100644 (file)
@@ -1,6 +1,7 @@
 /* dll_init.h
 
-   Copyright 1998 Cygnus Solutions
+   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008,
+   2009 Red Hat, Inc.
 
 This file is part of Cygwin.
 
@@ -8,95 +9,140 @@ This software is a copyrighted work licensed under the terms of the
 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 details. */
 
-//-----------------------------------------------------------------------------
-// list of loaded DLL (used by fork & init)
-class DllList
+struct per_module
 {
-public:
-  static DllList& the ();
-
-  // return dll index used for freeDll
-  int recordDll (HMODULE, per_process*);
-  void detachDll (int dll_index);
-
-  // called after initialization of main module in dll_crt0
-  void initAll ();
-
-  // global destructors of loaded dlls
-  void doGlobalDestructorsOfDlls ();
-
-  // number of dlls dlopened
-  int numberOfOpenedDlls ();
-
-  // boolean to determine if forked process must reload dlls opened with
-  // LoadLibrary or dlopen ...
-  // default = 0 (FALSE)
-  int forkeeMustReloadDlls ();
-  void forkeeMustReloadDlls (int);
-
-  void forkeeLoadDlls ();
-
-  // set name of current library opened with dlopen
-  void currentDlOpenedLib (const char*);
+  char ***envptr;
+  void (**ctors)(void);
+  void (**dtors)(void);
+  void *data_start;
+  void *data_end;
+  void *bss_start;
+  void *bss_end;
+  int (*main)(int, char **, char **);
+  per_module &operator = (per_process *p)
+  {
+    envptr = p->envptr;
+    ctors = p->ctors;
+    dtors = p->dtors;
+    data_start = p->data_start;
+    data_end = p->data_end;
+    bss_start = p->bss_start;
+    bss_end = p->bss_end;
+    main = p->main;
+    return *this;
+  }
+  void run_ctors ();
+  void run_dtors ();
 };
 
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
 
-class DllListIterator
+typedef enum
 {
-  int _type;
-  int _index;
-
-protected:
-  DllListIterator (int type);
-  int index () const { return _index; }
+  DLL_NONE,
+  DLL_LINK,
+  DLL_LOAD,
+  DLL_ANY
+} dll_type;
 
-public:
-  virtual ~DllListIterator();
-
-  int ok() { return _index!=-1; }
-  void operator++ ();
-  void operator++ (int) { operator++ (); }
-  operator per_process* ();
+struct dll
+{
+  struct dll *next, *prev;
+  per_module p;
+  HMODULE handle;
+  int count;
+  bool has_dtors;
+  dll_type type;
+  long ndeps;
+  dll** deps;
+  PWCHAR modname;
+  DWORD image_size;
+  void* preferred_base;
+  WCHAR name[1];
+  void detach ();
+  int init ();
+  void run_dtors ()
+  {
+    if (has_dtors)
+      {
+       has_dtors = 0;
+       p.run_dtors ();
+      }
+  }
 };
 
-//-----------------------------------------------------------------------------
+#define MAX_DLL_BEFORE_INIT     100
 
-class LinkedDllIterator : public DllListIterator
+class dll_list
 {
+  dll *end;
+  dll *hold;
+  dll_type hold_type;
+  static muto protect;
 public:
-  LinkedDllIterator ();
-  ~LinkedDllIterator ();
+  dll start;
+  int loaded_dlls;
+  int reload_on_fork;
+  dll *operator [] (const PWCHAR name);
+  dll *alloc (HINSTANCE, per_process *, dll_type);
+  dll *find (void *);
+  void detach (void *);
+  void init ();
+  void load_after_fork (HANDLE);
+  void reserve_space ();
+  void load_after_fork_impl (HANDLE, dll* which, int retries);
+  dll *find_by_modname (const PWCHAR name);
+  void populate_deps (dll* d);
+  void topsort ();
+  void topsort_visit (dll* d, bool goto_tail);
+  void append (dll* d);
+
+  dll *inext ()
+  {
+    while ((hold = hold->next))
+      if (hold_type == DLL_ANY || hold->type == hold_type)
+       break;
+    return hold;
+  }
+
+  dll *istart (dll_type t)
+  {
+    hold_type = t;
+    hold = &start;
+    return inext ();
+  }
+  void guard(bool lockit)
+  {
+    if (lockit)
+      protect.acquire ();
+    else
+      protect.release ();
+  }
+  friend void dll_global_dtors ();
+  dll_list () { protect.init ("dll_list"); }
 };
 
-//-----------------------------------------------------------------------------
-
-class LoadedDllIterator : public DllListIterator
+/* References:
+   http://msdn.microsoft.com/en-us/windows/hardware/gg463125
+   http://msdn.microsoft.com/en-us/library/ms809762.aspx
+*/
+struct pefile
 {
-public:
-  LoadedDllIterator ();
-  ~LoadedDllIterator ();
+  IMAGE_DOS_HEADER dos_hdr;
+
+  char* rva (long offset) { return (char*) this + offset; }
+  PIMAGE_NT_HEADERS32 pe_hdr () { return (PIMAGE_NT_HEADERS32) rva (dos_hdr.e_lfanew); }
+  PIMAGE_OPTIONAL_HEADER32 optional_hdr () { return &pe_hdr ()->OptionalHeader; }
+  PIMAGE_DATA_DIRECTORY idata_dir (DWORD which)
+  {
+    PIMAGE_OPTIONAL_HEADER32 oh = optional_hdr ();
+    return (which < oh->NumberOfRvaAndSizes)? oh->DataDirectory + which : 0;
+  }
 };
 
-//-----------------------------------------------------------------------------
-
-#define DO_LINKED_DLL(var)                                                   \
-{                                                                            \
-LinkedDllIterator iterator;                                                  \
-while (iterator.ok ())                                                       \
-{                                                                            \
-  per_process *var = (per_process *) iterator;
-
-#define DO_LOADED_DLL(var)                                                   \
-{                                                                            \
-LoadedDllIterator iterator;                                                  \
-while (iterator.ok ())                                                       \
-{                                                                            \
-  per_process *var = (per_process *) iterator;
-
-#define DLL_DONE                                                             \
-  iterator++;                                                                \
-}                                                                            \
-}
+extern dll_list dlls;
+void dll_global_dtors ();
 
+/* These probably belong in a newlib header but we can keep them here
+   for now.  */
+extern "C" int __cxa_atexit(void (*)(void*), void*, void*);
+extern "C" int __cxa_finalize(void*);