Author: wrowe
Date: Sat Jan  1 12:56:44 2005
New Revision: 123856

URL: http://svn.apache.org/viewcvs?view=rev&rev=123856
Log:

  Refactor asp_module_lock;

    * Track the version, use an appropriate asp_module_lock() function
      to use non-Unicode API on Win98/ME, Unicode otherwise.

    * Unlock the self-lock of the mod_aspdotnet.so module at the 
      true termination of Apache.

    * Clean up some code which is no longer needed, we can't co-locate
      Apache.Web.dll outside of the GAC.



Modified:
   httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp

Modified: httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp
Url: 
http://svn.apache.org/viewcvs/httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp?view=diff&rev=123856&p1=httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp&r1=123855&p2=httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp&r2=123856
==============================================================================
--- httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp     (original)
+++ httpd/mod_aspdotnet/trunk/mod/mod_aspdotnet.cpp     Sat Jan  1 12:56:44 2005
@@ -79,7 +79,8 @@
     apr_hash_t *hosts;  // Hash of asp_net_host_conf_t records
     ICorRuntimeHost *pCorRuntime;
     IApacheWebHostFactory *pHostFactory;
-    HANDLE lock_module;
+    HMODULE lock_module;
+    OSVERSIONINFO osver;
 } *global_conf;
 
 // Initialized for each restart
@@ -193,31 +194,60 @@
         global_conf->pCorRuntime->Stop();
         global_conf->pCorRuntime->Release();
     }
+
+    if (global_conf->lock_module)
+        FreeLibrary(global_conf->lock_module);
+
     return APR_SUCCESS;
 }
 
-static HRESULT init_asp_engine(void)
+static void asp_module_lock98(void)
 {
-    HRESULT hr;
+    // Get the path to this mod_aspdotnet module so that we can
+    // lock ourselves in-place for the lifetime of the server
+    char AspNetPath[APR_PATH_MAX];
+    HMODULE hModule = GetModuleHandleA("mod_aspdotnet.so");
+    if (!GetModuleFileNameA(hModule, AspNetPath, APR_PATH_MAX)) {
+        HRESULT hr = GetLastError();
+        apr_status_t rv = APR_FROM_OS_ERROR(hr);
+        ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
+                     "mod_aspdotnet: Failed to discover the full file path to "
+                     "mod_aspdotnet.so.  (Was it renamed?)");
+        _com_raise_error(hr);
+    }
 
+    // Lock in our module by incrementing its refcount.
+    global_conf->lock_module = LoadLibraryA(AspNetPath);
+}
+
+static void asp_module_lock(void)
+{
     // Get the path to this mod_aspdotnet module so that we can
     // lock ourselves in-place for the lifetime of the server
     wchar_t wAspNetPath[APR_PATH_MAX];
     HMODULE hModule = GetModuleHandleW(L"mod_aspdotnet.so");
-    if (!GetModuleFileNameW(hModule, wAspNetPath, APR_PATH_MAX)
-            || (wcslen(wAspNetPath) >= APR_PATH_MAX - 1)) {
-        hr = GetLastError();
+    if (!GetModuleFileNameW(hModule, wAspNetPath, APR_PATH_MAX)) {
+        HRESULT hr = GetLastError();
         apr_status_t rv = APR_FROM_OS_ERROR(hr);
-        if (!rv) {
-            hr = E_FAIL;
-            rv = APR_ENAMETOOLONG;
-        }
         ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
                      "mod_aspdotnet: Failed to discover the full file path to "
                      "mod_aspdotnet.so.  (Was it renamed?)");
         _com_raise_error(hr);
     }
+
+    // Lock in our module by incrementing its refcount.
     global_conf->lock_module = LoadLibraryW(wAspNetPath);
+}
+
+static HRESULT init_asp_engine(void)
+{
+    global_conf->osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+    GetVersionEx(&(global_conf->osver));
+
+    if (global_conf->osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
+        asp_module_lock98();
+    else
+        asp_module_lock();
 
     // Now we are prepared to register our cleanup in the global
     // process pool, because we trust the module cannot be unloaded
@@ -225,43 +255,23 @@
     apr_pool_cleanup_register(global_conf->pool, NULL, asp_net_stop, 
                               apr_pool_cleanup_null);
 
-    // Now get the path to the apache.exe binary, as Apache.Web
-    // reside in the same path as the server's dll libraries.
-    if (!GetModuleFileNameW(NULL, wAspNetPath, APR_PATH_MAX)
-            || (wcslen(wAspNetPath) >= APR_PATH_MAX - 17)) {
-        hr = GetLastError();
-        apr_status_t rv = APR_FROM_OS_ERROR(hr);
-        if (!rv) {
-            hr = E_FAIL;
-            rv = APR_ENAMETOOLONG;
-        }
-        ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
-                     "mod_aspdotnet: Unable to determine apache.exe path!");
-        _com_raise_error(hr);
-    }
-
-    wchar_t *repl = wcsrchr(wAspNetPath, L'\\');
-    if (!repl) {
-        ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, NULL,
-                     "mod_aspdotnet: Unable to determine apache.exe path!");
-        _com_raise_error(E_FAIL);
-    }
-
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL,
-                 "mod_aspdotnet: Module initialization commencing...");
+                "mod_aspdotnet: Module initialization commencing...");
 
+    wchar_t wCORVersion[APR_PATH_MAX];
     DWORD len;
-    hr = GetCORVersion(wAspNetPath, sizeof(wAspNetPath) 
+    HRESULT hr;
+    hr = GetCORVersion(wCORVersion, sizeof(wCORVersion) 
                                      / sizeof(WCHAR) - 1, &len);
     if (FAILED(hr)) {
-        wAspNetPath[len] = L'\0';
+        wCORVersion[len] = L'\0';
         ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(hr), NULL,
                      "mod_aspdotnet: GetCORVersion failed to return "
                      "the .NET CLR engine version.");
         _com_raise_error(hr);
     }
 
-    hr = CorBindToRuntimeEx(wAspNetPath, 
+    hr = CorBindToRuntimeEx(wCORVersion, 
                             L"svr",  // Or "wks" 
                             STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN_HOST | 
                             STARTUP_CONCURRENT_GC, 

Reply via email to