From: Tor Lillqvist Date: Sat, 29 Sep 2001 23:19:24 +0000 (+0000) Subject: glib/gwin32.c glib/gwin32.h Remove own implementation of dirent functions. X-Git-Tag: GLIB_1_3_9~50 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e4e2fc5134b69152c94950e6d5a2e65e30ab6699;p=platform%2Fupstream%2Fglib.git glib/gwin32.c glib/gwin32.h Remove own implementation of dirent functions. 2001-09-30 Tor Lillqvist * glib/gwin32.c * glib/gwin32.h * glib/glib.def: Remove own implementation of dirent functions. Instead, gcc (mingw) users should go ahead and use the included with the mingw gcc, and the dirent functions included in libmingw32, while MSVC users can use the same (public domain) code, extracted from mingw-runtime sources and placed in build/win32/dirent.[ch]. * glib/gwin32.c (get_package_directory_from_module, g_win32_get_package_installation_directory): Use static lock to protect static hash table. --- diff --git a/ChangeLog b/ChangeLog index adc4296..9f43694 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index adc4296..9f43694 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index adc4296..9f43694 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index adc4296..9f43694 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index adc4296..9f43694 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index adc4296..9f43694 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index adc4296..9f43694 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index adc4296..9f43694 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,18 @@ +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + Sat Sep 29 02:33:14 2001 George Lebl * tests/testglib.c (main): cast the string size to gulong and use %lu diff --git a/glib/glib.def b/glib/glib.def index c24f57e..e73bb08 100644 --- a/glib/glib.def +++ b/glib/glib.def @@ -678,15 +678,11 @@ EXPORTS g_utf8_to_utf16 g_utf8_validate g_vsnprintf - g_win32_closedir g_win32_error_message g_win32_ftruncate g_win32_get_package_installation_directory g_win32_get_package_installation_subdirectory g_win32_getlocale - g_win32_opendir - g_win32_readdir - g_win32_rewinddir glib_binary_age glib_interface_age glib_major_version diff --git a/glib/gwin32.c b/glib/gwin32.c index f4c1c05..d94b110 100644 --- a/glib/gwin32.c +++ b/glib/gwin32.c @@ -93,136 +93,6 @@ g_win32_ftruncate (gint fd, return 0; } -DIR* -g_win32_opendir (const char *dirname) -{ - DIR *result; - gchar *mask; - guint k; - - g_return_val_if_fail (dirname != NULL, NULL); - - result = g_new0 (DIR, 1); - result->find_file_data = g_new0 (WIN32_FIND_DATA, 1); - result->dir_name = g_strdup (dirname); - - k = strlen (result->dir_name); - if (k && result->dir_name[k - 1] == '\\') - { - result->dir_name[k - 1] = '\0'; - } - mask = g_strdup_printf ("%s\\*", result->dir_name); - - result->find_file_handle = (guint) FindFirstFile (mask, - (LPWIN32_FIND_DATA) result->find_file_data); - g_free (mask); - - if (result->find_file_handle == (guint) INVALID_HANDLE_VALUE) - { - int error = GetLastError (); - - g_free (result->dir_name); - g_free (result->find_file_data); - g_free (result); - switch (error) - { - default: - errno = EIO; - return NULL; - } - } - result->just_opened = TRUE; - - return result; -} - -struct dirent* -g_win32_readdir (DIR *dir) -{ - gchar *basename; - - g_return_val_if_fail (dir != NULL, NULL); - - if (dir->just_opened) - dir->just_opened = FALSE; - else - { - if (!FindNextFile ((HANDLE) dir->find_file_handle, - (LPWIN32_FIND_DATA) dir->find_file_data)) - { - int error = GetLastError (); - - switch (error) - { - case ERROR_NO_MORE_FILES: - return NULL; - default: - errno = EIO; - return NULL; - } - } - } - - basename = g_path_get_basename (((LPWIN32_FIND_DATA) dir->find_file_data)->cFileName); - - strcpy (dir->readdir_result.d_name, basename); - - g_free (basename); - - return &dir->readdir_result; -} - -void -g_win32_rewinddir (DIR *dir) -{ - gchar *mask; - - g_return_if_fail (dir != NULL); - - if (!FindClose ((HANDLE) dir->find_file_handle)) - g_warning ("gwin_rewinddir(): FindClose() failed\n"); - - mask = g_strdup_printf ("%s\\*", dir->dir_name); - dir->find_file_handle = (guint) FindFirstFile (mask, - (LPWIN32_FIND_DATA) dir->find_file_data); - g_free (mask); - - if (dir->find_file_handle == (guint) INVALID_HANDLE_VALUE) - { - int error = GetLastError (); - - switch (error) - { - default: - errno = EIO; - return; - } - } - dir->just_opened = TRUE; -} - -gint -g_win32_closedir (DIR *dir) -{ - g_return_val_if_fail (dir != NULL, -1); - - if (!FindClose ((HANDLE) dir->find_file_handle)) - { - int error = GetLastError (); - - switch (error) - { - default: - errno = EIO; return -1; - } - } - - g_free (dir->dir_name); - g_free (dir->find_file_data); - g_free (dir); - - return 0; -} #endif /* MSVC 5.0 headers don't have latest language and sublanguage codes */ @@ -711,18 +581,24 @@ static gchar * get_package_directory_from_module (gchar *module_name) { static GHashTable *module_dirs = NULL; + G_LOCK_DEFINE_STATIC (module_dirs); HMODULE hmodule = NULL; gchar *fn; gchar *p; gchar *result; + G_LOCK (module_dirs); + if (module_dirs == NULL) module_dirs = g_hash_table_new (g_str_hash, g_str_equal); result = g_hash_table_lookup (module_dirs, module_name ? module_name : ""); if (result) - return g_strdup (result); + { + G_UNLOCK (module_dirs); + return g_strdup (result); + } if (module_name) { @@ -733,7 +609,10 @@ get_package_directory_from_module (gchar *module_name) fn = g_malloc (MAX_PATH); if (!GetModuleFileName (hmodule, fn, MAX_PATH)) - return NULL; + { + G_UNLOCK (module_dirs); + return NULL; + } #ifdef G_WITH_CYGWIN /* In Cygwin we need to have POSIX paths */ @@ -756,6 +635,8 @@ get_package_directory_from_module (gchar *module_name) g_hash_table_insert (module_dirs, module_name ? module_name : "", fn); + G_UNLOCK (module_dirs); + return g_strdup (fn); } @@ -795,6 +676,7 @@ g_win32_get_package_installation_directory (gchar *package, gchar *dll_name) { static GHashTable *package_dirs = NULL; + G_LOCK_DEFINE_STATIC (package_dirs); gchar *result = NULL; gchar *key; HKEY reg_key = NULL; @@ -803,13 +685,18 @@ g_win32_get_package_installation_directory (gchar *package, if (package != NULL) { + G_LOCK (package_dirs); + if (package_dirs == NULL) package_dirs = g_hash_table_new (g_str_hash, g_str_equal); result = g_hash_table_lookup (package_dirs, package); if (result && result[0]) - return g_strdup (result); + { + G_UNLOCK (package_dirs); + return g_strdup (result); + } key = g_strconcat ("Software\\", package, NULL); @@ -835,12 +722,14 @@ g_win32_get_package_installation_directory (gchar *package, RegCloseKey (reg_key); g_free (key); - - } - if (result) - { - g_hash_table_insert (package_dirs, package, result); - return g_strdup (result); + + if (result) + { + g_hash_table_insert (package_dirs, package, result); + G_UNLOCK (package_dirs); + return g_strdup (result); + } + G_UNLOCK (package_dirs); } if (dll_name != NULL) diff --git a/glib/gwin32.h b/glib/gwin32.h index a71d774..1fbcb25 100644 --- a/glib/gwin32.h +++ b/glib/gwin32.h @@ -68,38 +68,8 @@ typedef int pid_t; */ # define ftruncate(fd, size) g_win32_ftruncate (fd, size) -/* -lmingw32 also has emulations for these, but we need our own - * for MSVC anyhow, so we might aswell use them always. - */ -# define opendir g_win32_opendir -# define readdir g_win32_readdir -# define rewinddir g_win32_rewinddir -# define closedir g_win32_closedir -# define NAME_MAX 255 - -struct dirent -{ - gchar d_name[NAME_MAX + 1]; -}; - -struct DIR -{ - gchar *dir_name; - gboolean just_opened; - guint find_file_handle; - gpointer find_file_data; - struct dirent readdir_result; -}; -typedef struct DIR DIR; - -/* emulation functions */ gint g_win32_ftruncate (gint f, guint size); -DIR* g_win32_opendir (const gchar *dirname); -struct dirent* g_win32_readdir (DIR *dir); -void g_win32_rewinddir (DIR *dir); -gint g_win32_closedir (DIR *dir); - #endif /* G_OS_WIN32 */ /* The MS setlocale uses locale names of the form "English_United