diff options
author | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2001-11-27 02:31:55 +0000 |
---|---|---|
committer | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2001-11-27 02:31:55 +0000 |
commit | 40065d05e0033ede877c105c0e1d6c79976092f5 (patch) | |
tree | aa5d348c14cae065248869b0073f96d272125dac /misc | |
parent | 0a46146b486bbe38eab1fd8be65ed1ae40f4a10f (diff) | |
download | libapr-40065d05e0033ede877c105c0e1d6c79976092f5.tar.gz |
Introduce apr_os_level, an apr-private internal value for optimizing
the resolution of os versions under Win32. Since so many APIs rely on
this determination, this should improve the performance. Pre-determine
the version within the apr_initialize() call.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@62556 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'misc')
-rw-r--r-- | misc/unix/start.c | 9 | ||||
-rw-r--r-- | misc/win32/misc.c | 68 |
2 files changed, 45 insertions, 32 deletions
diff --git a/misc/unix/start.c b/misc/unix/start.c index 6c67925a2..a1c441a86 100644 --- a/misc/unix/start.c +++ b/misc/unix/start.c @@ -74,6 +74,9 @@ APR_DECLARE(apr_status_t) apr_initialize(void) WSADATA wsaData; int err; #endif +#if defined WIN32 + apr_oslevel_e osver; +#endif if (initialized++) { return APR_SUCCESS; @@ -83,6 +86,12 @@ APR_DECLARE(apr_status_t) apr_initialize(void) return APR_ENOPOOL; } +#ifdef WIN32 + /* Initialize apr_os_level global */ + if (apr_get_oslevel(global_apr_pool, &osver) != APR_SUCCESS) { + return APR_EEXIST; + } +#endif #if !defined(BEOS) && !defined(OS2) && !defined(WIN32) && !defined(NETWARE) apr_unix_setup_lock(); apr_proc_mutex_unix_setup_lock(); diff --git a/misc/win32/misc.c b/misc/win32/misc.c index bb5535102..a2f9a40f2 100644 --- a/misc/win32/misc.c +++ b/misc/win32/misc.c @@ -55,15 +55,15 @@ #include "apr_private.h" #include "misc.h" +apr_oslevel_e apr_os_level = APR_WIN_UNK; + apr_status_t apr_get_oslevel(apr_pool_t *cont, apr_oslevel_e *level) { static OSVERSIONINFO oslev; static unsigned int servpack = 0; - static BOOL first = TRUE; char *pservpack; - if (first) { - first = FALSE; + if (apr_os_level == APR_WIN_UNK) { oslev.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&oslev); if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT) { @@ -73,43 +73,47 @@ apr_status_t apr_get_oslevel(apr_pool_t *cont, apr_oslevel_e *level) if (*pservpack) servpack = atoi(pservpack); } - } - if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT) { - if (oslev.dwMajorVersion == 5) { - (*level) = APR_WIN_2000; - } - else if (oslev.dwMajorVersion == 4) { - if (servpack >= 6) { - (*level) = APR_WIN_NT_4_SP6; - } - else if (servpack >= 4) { - (*level) = APR_WIN_NT_4_SP4; - } - else if (servpack >= 3) { - (*level) = APR_WIN_NT_4_SP3; + if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT) { + if (oslev.dwMajorVersion == 5) { + (*level) = APR_WIN_2000; } - else if (servpack >= 2) { - (*level) = APR_WIN_NT_4_SP2; + else if (oslev.dwMajorVersion == 4) { + if (servpack >= 6) { + (*level) = APR_WIN_NT_4_SP6; + } + else if (servpack >= 4) { + (*level) = APR_WIN_NT_4_SP4; + } + else if (servpack >= 3) { + (*level) = APR_WIN_NT_4_SP3; + } + else if (servpack >= 2) { + (*level) = APR_WIN_NT_4_SP2; + } + else { + (*level) = APR_WIN_NT_4; + } } else { - (*level) = APR_WIN_NT_4; + (*level) = APR_WIN_NT; } - } - else { - (*level) = APR_WIN_NT; - } - return APR_SUCCESS; - } - else if (oslev.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { - if (oslev.dwMinorVersion == 0) { - (*level) = APR_WIN_95; return APR_SUCCESS; } - else if (oslev.dwMinorVersion > 0) { - (*level) = APR_WIN_98; - return APR_SUCCESS; + else if (oslev.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { + if (oslev.dwMinorVersion == 0) { + (*level) = APR_WIN_95; + return APR_SUCCESS; + } + else if (oslev.dwMinorVersion > 0) { + (*level) = APR_WIN_98; + return APR_SUCCESS; + } } } + else { + *level = apr_os_level; + return APR_SUCCESS; + } return APR_EEXIST; } |