summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2001-11-27 02:31:55 +0000
committerwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2001-11-27 02:31:55 +0000
commit40065d05e0033ede877c105c0e1d6c79976092f5 (patch)
treeaa5d348c14cae065248869b0073f96d272125dac /misc
parent0a46146b486bbe38eab1fd8be65ed1ae40f4a10f (diff)
downloadlibapr-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.c9
-rw-r--r--misc/win32/misc.c68
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;
}