[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
libtool--gary--1.0--patch-14
From: |
Gary V. Vaughan |
Subject: |
libtool--gary--1.0--patch-14 |
Date: |
Thu, 22 Apr 2004 10:49:51 +0100 (BST) |
User-agent: |
mailnotify/0.3 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Okay to commit?
- --
Gary V. Vaughan ())_. address@hidden,gnu.org}
Research Scientist ( '/ http://tkd.kicks-ass.net
GNU Hacker / )= http://www.gnu.org/software/libtool
Technical Author `(_~)_ http://sources.redhat.com/autobook
_________________________________________________________
This patch notification generated by tlaapply version 0.5
http://tkd.kicks-ass.net/arch/address@hidden/cvs-utils--tla--1.0
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (Darwin)
iD8DBQFAh5U/FRMICSmD1gYRAnjvAJ4hYq7lh8NaIvTwqykjYakkOLqH+gCgkC69
Vrf+SMkL9rYM1jaOe05VNnc=
=DjDA
-----END PGP SIGNATURE-----
* looking for address@hidden/libtool--gary--1.0--patch-13 to compare with
* comparing to address@hidden/libtool--gary--1.0--patch-13
D libltdl/.arch-ids/lt_mutex.c.id
D libltdl/.arch-ids/lt_mutex.h.id
D libltdl/lt_mutex.c
D libltdl/lt_mutex.h
M ChangeLog
M NEWS
M config/config.guess
M config/config.sub
M doc/libtool.texi
M libltdl/Makefile.am
M libltdl/ltdl.c
M libltdl/ltdl.h
M libltdl/lt__private.h
M libltdl/loader-dld_link.c
M libltdl/loader-dlopen.c
M libltdl/loader-dyld.c
M libltdl/loader-load_add_on.c
M libltdl/loader-loadlibrary.c
M libltdl/loader-preopen.c
M libltdl/loader-shl_load.c
M libltdl/lt_error.c
M libltdl/lt_error.h
* modified files
Index: Changelog
from Gary V. Vaughan <address@hidden>
According to Howard Chu <address@hidden>:
Applications should assume that the native dlopen is NOT
thread-safe, and take care of locking themselves. All application
calls into libltdl should thus be protected by the caller.
* libltdl/lt_mutex.c, libltdl/lt_mutex.h: Removed.
* libltdl/Makefile.am (pkginclude_HEADERS): Removed lt_mutex.h.
(libltdl_la_SOURCES): Removed lt_mutex.c and lt_mutex.h.
* libltdl/ltdl.h: Don't include lt_mutex.h.
* libltdl/lt__private.h (LT__MUTEX_GETERROR, LT__MUTEX_SETERROR)
(LT__MUTEX_SETERRORSTR): Renamed to...
(LT__GETERROR, LT__SETERROR, LT__SETERRORSTR): ...this. Changed
all callers.
(LT__MUTEX_LOCK, LT__MUTEX_UNLOCK, lt_dlmutex_lock)
(lt_dlmutex_unlock, lt_dlmutex_seterror, lt_dlmutex_geterror):
Removed. Changed all callers.
* doc/libtool.texi (Thread Saftey in libltdl):
* NEWS: Updated.
--- orig/NEWS
+++ mod/NEWS
@@ -40,6 +40,9 @@
* libltdl no longer loads shared libraries with global symbol resolution,
this caused problems when the symbols were intended to be overriden further
up the stack; it is also not recommended practice.
+* libltdl no longer tries to support multi-threaded programming with
+ lt_dlmutex_register(), which was unusable with POSIX threads anyway.
+ The symbols are deprecated but exported for backwards compatibility.
* libltdl no longer uses lt_dlmalloc, lt_dlrealloc and lt_dlfree. The symbols
are still exported for backwards compatibility.
* libltdl no longer supports pre-c89 compilers. Some of the pre89 portability
--- orig/config/config.guess
+++ mod/config/config.guess
@@ -3,7 +3,7 @@
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
-timestamp='2003-10-20'
+timestamp='2004-01-05'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -1186,7 +1186,7 @@
*:QNX:*:4*)
echo i386-pc-qnx
exit 0 ;;
- NSR-[DGKLNPTVWY]:NONSTOP_KERNEL:*:*)
+ NSR-?:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE}
exit 0 ;;
*:NonStop-UX:*:*)
--- orig/config/config.sub
+++ mod/config/config.sub
@@ -3,7 +3,7 @@
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
-timestamp='2003-11-20'
+timestamp='2004-01-05'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -380,6 +380,9 @@
amd64)
basic_machine=x86_64-pc
;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
amdahl)
basic_machine=580-amdahl
os=-sysv
--- orig/doc/libtool.texi
+++ mod/doc/libtool.texi
@@ -3254,51 +3254,22 @@
@node Thread Saftey in libltdl
@section Using libtldl in a multi threaded environment
-Using the @code{lt_dlmutex_register()} function, and by providing some
-appropriate callback function definitions, libltdl can be used in a
-multi-threaded environment.
-
address@hidden {Type} void lt_dlmutex_lock (void)
-This is the type of a function pointer holding the address of a function
-which will be called at the start of parts of the libltdl implementation
-code which require a mutex lock.
-
-Because libltdl is inherantly recursive, it is important that the
-locking mechanism employed by these callback functions are reentrant, or
-else strange problems will occur.
address@hidden deftypefn
-
address@hidden {Type} void lt_dlmutex_unlock (void)
-The type of a matching unlock function.
address@hidden deftypefn
-
address@hidden {Type} void lt_dlmutex_seterror @w{(const char address@hidden);}
-Many of the functions in the libltdl @sc{api} have a special return
-value to indicate to the client that an error has occured. Normally (in
-single threaded applications) a string describing that error can be
-retrieved from internal storage with @code{lt_dlerror()}.
-
-A function of this type must be registered with the library in order for
-it to work in a multi-threaded context. The function should store any
-error message passed in thread local storage.
address@hidden deftypefn
-
address@hidden {Type} {const char *} lt_dlmutex_geterror (void)
-The type of a matching callback function to retrieve the last stored
-error message from thread local storage.
-
-When registered correctly this function will be used by
address@hidden())} from all threads to retrieve error messages for the
-client.
address@hidden deftypefn
-
address@hidden {Function} int lt_dlmutex_register (@w{lt_dlmutex_lock
address@hidden, @w{lt_dlmutex_unlock address@hidden, @w{lt_dlmutex_set_error
address@hidden, @w{lt_dlmutex_geterror address@hidden)}
-Use this function to register one of each of function types described
-above in preparation for multi-threaded use of libltdl. All arguments
-must be valid address@hidden function addresses, or else all
address@hidden to return to single threaded operation.
address@hidden deftypefn
+Libltdl provides a wrapper around whatever dynamic run-time object
+loading mechanisms are provided by the host system, many of which are
+themselves not thread safe. Consequently libltdl cannot itself be
+consistently thread safe.
+
+If you wish to use libltdl in a multithreaded environment, then you
+must mutex lock around libltdl calls, since they may in turn be calling
+non-thread-safe system calls on some target hosts.
+
+Some old releases of libtool provided a mutex locking API that was
+unusable with POSIX threads, so callers were forced to lock around all
+libltdl API calls anyway. That mutex locking API was next to useless,
+and is not present in current releases.
+Some future release of libtool may provide a new POSIX thread
+compliant mutex locking API.
@node User defined module data
@section Data associated with loaded modules
--- orig/libltdl/Makefile.am
+++ mod/libltdl/Makefile.am
@@ -26,7 +26,7 @@
if INSTALL_LTDL
include_HEADERS = ltdl.h
-pkginclude_HEADERS = lt_system.h lt_error.h lt_mutex.h
+pkginclude_HEADERS = lt_system.h lt_error.h
lib_LTLIBRARIES = libltdl.la
endif
@@ -40,7 +40,7 @@
libltdl_la_SOURCES = ltdl.h ltdl.c \
loader-preopen.c \
- lt_error.h lt_error.c lt_mutex.h lt_mutex.c \
+ lt_error.h lt_error.c \
lt__private.h lt__alloc.h lt__alloc.c \
lt__glibc.h argz.h lt__dirent.h \
lt_system.h
--- orig/libltdl/loader-dld_link.c
+++ mod/libltdl/loader-dld_link.c
@@ -41,7 +41,7 @@
if (dld_link (filename) != 0)
{
- LT__MUTEX_SETERROR (CANNOT_OPEN);
+ LT__SETERROR (CANNOT_OPEN);
FREE (module);
}
@@ -55,7 +55,7 @@
if (dld_unlink_by_file ((char*)(module), 1) != 0)
{
- LT__MUTEX_SETERROR (CANNOT_CLOSE);
+ LT__SETERROR (CANNOT_CLOSE);
++errors;
}
else
@@ -73,7 +73,7 @@
if (!address)
{
- LT__MUTEX_SETERROR (SYMBOL_NOT_FOUND);
+ LT__SETERROR (SYMBOL_NOT_FOUND);
}
return address;
--- orig/libltdl/loader-dlopen.c
+++ mod/libltdl/loader-dlopen.c
@@ -68,8 +68,8 @@
# define DLERROR(arg) LT__STRERROR (arg)
#endif
-#define DL__MUTEX_SETERROR(errorcode) \
- LT__MUTEX_SETERRORSTR (DLERROR (errorcode))
+#define DL__SETERROR(errorcode) \
+ LT__SETERRORSTR (DLERROR (errorcode))
static lt_module
sys_dl_open (lt_user_data loader_data, const char *filename)
@@ -78,7 +78,7 @@
if (!module)
{
- DL__MUTEX_SETERROR (CANNOT_OPEN);
+ DL__SETERROR (CANNOT_OPEN);
}
return module;
@@ -91,7 +91,7 @@
if (dlclose (module) != 0)
{
- DL__MUTEX_SETERROR (CANNOT_CLOSE);
+ DL__SETERROR (CANNOT_CLOSE);
++errors;
}
@@ -105,7 +105,7 @@
if (!address)
{
- DL__MUTEX_SETERROR (SYMBOL_NOT_FOUND);
+ DL__SETERROR (SYMBOL_NOT_FOUND);
}
return address;
--- orig/libltdl/loader-dyld.c
+++ mod/libltdl/loader-dyld.c
@@ -109,8 +109,8 @@
# define LT__MAGIC MH_CIGAM
#endif
-#define DYLD__MUTEX_SETERROR(errorcode) \
- LT__MUTEX_SETERRORSTR (lt__dylderror (errorcode))
+#define DYLD__SETERROR(errorcode) \
+ LT__SETERRORSTR (lt__dylderror (errorcode))
/* Return the dyld error string, or the passed in error string if none. */
static const char *
@@ -254,8 +254,6 @@
{
int errors = 0;
- LT__MUTEX_LOCK ();
-
if (! dyld_cannot_close)
{
if (!_dyld_present ())
@@ -276,8 +274,6 @@
}
}
- LT__MUTEX_UNLOCK ();
-
return errors;
}
@@ -317,7 +313,7 @@
if (!module)
{
- DYLD__MUTEX_SETERROR (LT_ERROR_CANNOT_OPEN);
+ DYLD__SETERROR (LT_ERROR_CANNOT_OPEN);
}
return module;
@@ -334,7 +330,7 @@
int flags = 0;
if (mh->magic == LT__MAGIC)
{
- DYLD__MUTEX_SETERROR(dyld_cannot_close);
+ DYLD__SETERROR(dyld_cannot_close);
++errors;
}
else
@@ -353,7 +349,7 @@
#endif
if (!NSUnLinkModule (module, flags))
{
- DYLD__MUTEX_SETERROR (LT_ERROR_CANNOT_CLOSE);
+ DYLD__SETERROR (LT_ERROR_CANNOT_CLOSE);
++errors;
}
}
@@ -405,7 +401,7 @@
if (!nssym)
{
- LT__MUTEX_SETERRORSTR (saveError);
+ LT__SETERRORSTR (saveError);
}
return nssym ? NSAddressOfSymbol (nssym) : 0;
--- orig/libltdl/loader-load_add_on.c
+++ mod/libltdl/loader-load_add_on.c
@@ -51,7 +51,7 @@
if (image <= 0)
{
- LT__MUTEX_SETERROR (CANNOT_OPEN);
+ LT__SETERROR (CANNOT_OPEN);
image = 0;
}
@@ -65,7 +65,7 @@
if (unload_add_on ((image_id) module) != B_OK)
{
- LT__MUTEX_SETERROR (CANNOT_CLOSE);
+ LT__SETERROR (CANNOT_CLOSE);
++errors;
}
@@ -80,7 +80,7 @@
if (get_image_symbol (image, symbol, B_SYMBOL_TYPE_ANY, address) != B_OK)
{
- LT__MUTEX_SETERROR (SYMBOL_NOT_FOUND);
+ LT__SETERROR (SYMBOL_NOT_FOUND);
address = 0;
}
--- orig/libltdl/loader-loadlibrary.c
+++ mod/libltdl/loader-loadlibrary.c
@@ -92,7 +92,6 @@
We check whether LoadLibrary is returning a handle to
an already loaded module, and simulate failure if we
find one. */
- LT__MUTEX_LOCK ();
cur = handles;
while (cur)
{
@@ -109,11 +108,10 @@
cur = cur->next;
}
- LT__MUTEX_UNLOCK ();
if (cur || !module)
{
- LT__MUTEX_SETERROR (CANNOT_OPEN);
+ LT__SETERROR (CANNOT_OPEN);
module = 0;
}
@@ -127,7 +125,7 @@
if (FreeLibrary(module) == 0)
{
- LT__MUTEX_SETERROR (CANNOT_CLOSE);
+ LT__SETERROR (CANNOT_CLOSE);
++errors;
}
@@ -141,7 +139,7 @@
if (!address)
{
- LT__MUTEX_SETERROR (SYMBOL_NOT_FOUND);
+ LT__SETERROR (SYMBOL_NOT_FOUND);
}
return address;
--- orig/libltdl/loader-preopen.c
+++ mod/libltdl/loader-preopen.c
@@ -46,16 +46,12 @@
{
int errors = 0;
- LT__MUTEX_LOCK ();
-
preloaded_symbols = 0;
if (default_preloaded_symbols)
{
errors = lt_dlpreload (default_preloaded_symbols);
}
- LT__MUTEX_UNLOCK ();
-
return errors;
}
@@ -64,8 +60,6 @@
{
lt_dlsymlists_t *lists;
- LT__MUTEX_LOCK ();
-
lists = preloaded_symbols;
while (lists)
{
@@ -76,8 +70,6 @@
}
preloaded_symbols = 0;
- LT__MUTEX_UNLOCK ();
-
return 0;
}
@@ -88,8 +80,6 @@
lt_dlsymlists_t *lists;
int errors = 0;
- LT__MUTEX_LOCK ();
-
lists = preloaded_symbols;
while (lists)
{
@@ -114,7 +104,6 @@
}
done:
- LT__MUTEX_UNLOCK ();
return errors;
}
@@ -124,12 +113,11 @@
lt_dlsymlists_t *lists;
lt_module module = (lt_module) 0;
- LT__MUTEX_LOCK ();
lists = preloaded_symbols;
if (!lists)
{
- LT__MUTEX_SETERROR (NO_SYMBOLS);
+ LT__SETERROR (NO_SYMBOLS);
goto done;
}
@@ -159,10 +147,9 @@
lists = lists->next;
}
- LT__MUTEX_SETERROR (FILE_NOT_FOUND);
+ LT__SETERROR (FILE_NOT_FOUND);
done:
- LT__MUTEX_UNLOCK ();
return module;
}
@@ -190,7 +177,7 @@
++syms;
}
- LT__MUTEX_SETERROR (SYMBOL_NOT_FOUND);
+ LT__SETERROR (SYMBOL_NOT_FOUND);
return 0;
}
@@ -220,12 +207,10 @@
{
presym_free_symlists();
- LT__MUTEX_LOCK ();
if (default_preloaded_symbols)
{
errors = lt_dlpreload (default_preloaded_symbols);
}
- LT__MUTEX_UNLOCK ();
}
return errors;
@@ -234,8 +219,6 @@
int
lt_dlpreload_default (const lt_dlsymlist *preloaded)
{
- LT__MUTEX_LOCK ();
default_preloaded_symbols = preloaded;
- LT__MUTEX_UNLOCK ();
return 0;
}
--- orig/libltdl/loader-shl_load.c
+++ mod/libltdl/loader-shl_load.c
@@ -100,7 +100,7 @@
if (!module)
{
- LT__MUTEX_SETERROR (CANNOT_OPEN);
+ LT__SETERROR (CANNOT_OPEN);
}
}
@@ -114,7 +114,7 @@
if (module && (shl_unload ((shl_t) (module)) != 0))
{
- LT__MUTEX_SETERROR (CANNOT_CLOSE);
+ LT__SETERROR (CANNOT_CLOSE);
++errors;
}
@@ -129,13 +129,13 @@
/* sys_shl_open should never return a NULL module handle */
if (module == (lt_module) 0)
{
- LT__MUTEX_SETERROR (INVALID_HANDLE);
+ LT__SETERROR (INVALID_HANDLE);
}
else if (!shl_findsym((shl_t*) &module, symbol, TYPE_UNDEFINED, &address))
{
if (!address)
{
- LT__MUTEX_SETERROR (SYMBOL_NOT_FOUND);
+ LT__SETERROR (SYMBOL_NOT_FOUND);
}
}
--- orig/libltdl/lt__private.h
+++ mod/libltdl/lt__private.h
@@ -97,39 +97,10 @@
#define LT__STRERROR(name) lt__error_strings[LT_CONC(LT_ERROR_,name)]
+#define LT__GETERROR(lvalue) (lvalue) = lt__last_error;
+#define LT__SETERRORSTR(errormsg) lt__last_error = (errormsg)
+#define LT__SETERROR(errorcode)
LT__SETERRORSTR(LT__STRERROR(errorcode))
-
-/* --- MUTEX LOCKING --- */
-
-/* Macros to make it easier to run the lock functions only if they have
- been registered. The reason for the complicated lock macro is to
- ensure that the stored error message from the last error is not
- accidentally erased if the current function doesn't generate an
- error of its own. */
-
-#define LT__MUTEX_LOCK() LT_STMT_START { \
- if (lt__mutex_lock_func) (*lt__mutex_lock_func)(); \
- } LT_STMT_END
-#define LT__MUTEX_UNLOCK() LT_STMT_START { \
- if (lt__mutex_unlock_func) (*lt__mutex_unlock_func)();\
- } LT_STMT_END
-#define LT__MUTEX_SETERRORSTR(errormsg) LT_STMT_START { \
- if (lt__mutex_seterror_func) \
- (*lt__mutex_seterror_func) (errormsg); \
- else lt__last_error = (errormsg); } LT_STMT_END
-#define LT__MUTEX_GETERROR(errormsg) LT_STMT_START { \
- if (lt__mutex_seterror_func) \
- (errormsg) = (*lt__mutex_geterror_func) (); \
- else (errormsg) = lt__last_error; } LT_STMT_END
-#define LT__MUTEX_SETERROR(errorcode) \
- LT__MUTEX_SETERRORSTR(LT__STRERROR(errorcode))
-
-/* The mutex functions stored here are global, and are necessarily the
- same for all threads that wish to share access to libltdl. */
-LT_SCOPE lt_dlmutex_lock *lt__mutex_lock_func;
-LT_SCOPE lt_dlmutex_unlock *lt__mutex_unlock_func;
-LT_SCOPE lt_dlmutex_seterror *lt__mutex_seterror_func;
-LT_SCOPE lt_dlmutex_geterror *lt__mutex_geterror_func;
LT_SCOPE const char *lt__last_error;
LT_END_C_DECLS
--- orig/libltdl/lt_error.c
+++ mod/libltdl/lt_error.c
@@ -27,9 +27,10 @@
*/
#include "lt_error.h"
-#include "lt_mutex.h"
#include "lt__private.h"
+LT_GLOBAL_DATA const char *lt__last_error = 0;
+
static const char **user_error_strings = 0;
static int errorcount = LT_ERROR_MAX;
@@ -42,8 +43,6 @@
assert (diagnostic);
- LT__MUTEX_LOCK ();
-
errindex = errorcount - LT_ERROR_MAX;
temp = REALLOC (const char *, user_error_strings, 1 + errindex);
if (temp)
@@ -53,8 +52,6 @@
result = errorcount++;
}
- LT__MUTEX_UNLOCK ();
-
return result;
}
@@ -63,26 +60,22 @@
{
int errors = 0;
- LT__MUTEX_LOCK ();
-
if (errindex >= errorcount || errindex < 0)
{
/* Ack! Error setting the error message! */
- LT__MUTEX_SETERROR (INVALID_ERRORCODE);
+ LT__SETERROR (INVALID_ERRORCODE);
++errors;
}
else if (errindex < LT_ERROR_MAX)
{
/* No error setting the error message! */
- LT__MUTEX_SETERRORSTR (lt__error_strings[errindex]);
+ LT__SETERRORSTR (lt__error_strings[errindex]);
}
else
{
/* No error setting the error message! */
- LT__MUTEX_SETERRORSTR (user_error_strings[errindex - LT_ERROR_MAX]);
+ LT__SETERRORSTR (user_error_strings[errindex - LT_ERROR_MAX]);
}
- LT__MUTEX_UNLOCK ();
-
return errors;
}
--- orig/libltdl/lt_error.h
+++ mod/libltdl/lt_error.h
@@ -56,7 +56,7 @@
LT_ERROR(INVALID_ERRORCODE, "invalid errorcode") \
LT_ERROR(SHUTDOWN, "library already shutdown") \
LT_ERROR(CLOSE_RESIDENT_MODULE, "can't close resident module") \
- LT_ERROR(INVALID_MUTEX_ARGS, "invalid mutex handler registration") \
+ LT_ERROR(INVALID_MUTEX_ARGS, "internal error (code withdrawn)") \
LT_ERROR(INVALID_POSITION, "invalid search path insert position")
/* Enumerate the symbolic error names. */
--- orig/libltdl/ltdl.c
+++ mod/libltdl/ltdl.c
@@ -206,7 +206,7 @@
void
lt__alloc_die_callback (void)
{
- LT__MUTEX_SETERROR (NO_MEMORY);
+ LT__SETERROR (NO_MEMORY);
}
/* Initialize libltdl. */
@@ -215,8 +215,6 @@
{
int errors = 0;
- LT__MUTEX_LOCK ();
-
/* Initialize only at first call. */
if (++initialized == 1)
{
@@ -254,18 +252,16 @@
if (lt__presym_init (lt__presym.dlloader_data))
{
- LT__MUTEX_SETERROR (INIT_LOADER);
+ LT__SETERROR (INIT_LOADER);
++errors;
}
else if (errors != 0)
{
- LT__MUTEX_SETERROR (DLOPEN_NOT_SUPPORTED);
+ LT__SETERROR (DLOPEN_NOT_SUPPORTED);
++errors;
}
}
- LT__MUTEX_UNLOCK ();
-
return errors;
}
@@ -276,12 +272,11 @@
lt_dlloader *loader;
int errors = 0;
- LT__MUTEX_LOCK ();
loader = loaders;
if (!initialized)
{
- LT__MUTEX_SETERROR (SHUTDOWN);
+ LT__SETERROR (SHUTDOWN);
++errors;
goto done;
}
@@ -337,7 +332,6 @@
}
done:
- LT__MUTEX_UNLOCK ();
return errors;
}
@@ -349,8 +343,7 @@
const char *saved_error;
int errors = 0;
- LT__MUTEX_GETERROR (saved_error);
- LT__MUTEX_LOCK ();
+ LT__GETERROR (saved_error);
cur = handles;
loader = loaders;
@@ -390,7 +383,7 @@
file_not_found() can detect what happened.
if (access (filename, R_OK) != 0)
{
- LT__MUTEX_SETERROR (FILE_NOT_FOUND);
+ LT__SETERROR (FILE_NOT_FOUND);
++errors;
goto done;
} */
@@ -428,11 +421,9 @@
}
cur->loader = loader;
- LT__MUTEX_SETERRORSTR (saved_error);
+ LT__SETERRORSTR (saved_error);
done:
- LT__MUTEX_UNLOCK ();
-
return errors;
}
@@ -601,10 +592,10 @@
switch (error)
{
case ENOMEM:
- LT__MUTEX_SETERROR (NO_MEMORY);
+ LT__SETERROR (NO_MEMORY);
break;
default:
- LT__MUTEX_SETERROR (UNKNOWN);
+ LT__SETERROR (UNKNOWN);
break;
}
@@ -630,11 +621,9 @@
char *filename = 0;
char *canonical = 0;
- LT__MUTEX_LOCK ();
-
if (!search_path || !*search_path)
{
- LT__MUTEX_SETERROR (FILE_NOT_FOUND);
+ LT__SETERROR (FILE_NOT_FOUND);
goto cleanup;
}
@@ -681,8 +670,6 @@
FREE (canonical);
FREE (filename);
- LT__MUTEX_UNLOCK ();
-
return result;
}
@@ -779,7 +766,6 @@
}
++errors;
- LT__MUTEX_LOCK ();
if (user_search_path)
{
save_search_path = lt__strdup (user_search_path);
@@ -825,8 +811,6 @@
/* restore the old search path */
MEMREASSIGN (user_search_path, save_search_path);
- LT__MUTEX_UNLOCK ();
-
if (!depcount)
{
errors = 0;
@@ -982,7 +966,7 @@
assert (phandle);
assert (*phandle == 0);
- LT__MUTEX_GETERROR (saved_error);
+ LT__GETERROR (saved_error);
/* dlopen self? */
if (!filename)
@@ -1091,11 +1075,9 @@
{
const char *search_path;
- LT__MUTEX_LOCK ();
search_path = user_search_path;
if (search_path)
file = find_file (user_search_path, base_name, &dir);
- LT__MUTEX_UNLOCK ();
if (!file)
{
@@ -1128,7 +1110,7 @@
the status flag, and bail out. */
if (!file)
{
- LT__MUTEX_SETERROR (FILE_NOT_FOUND);
+ LT__SETERROR (FILE_NOT_FOUND);
++errors;
goto cleanup;
}
@@ -1338,13 +1320,11 @@
(*phandle)->info.ref_count = 1;
MEMREASSIGN ((*phandle)->info.name, name);
- LT__MUTEX_LOCK ();
(*phandle)->next = handles;
handles = *phandle;
- LT__MUTEX_UNLOCK ();
}
- LT__MUTEX_SETERRORSTR (saved_error);
+ LT__SETERRORSTR (saved_error);
cleanup:
FREE (dir);
@@ -1374,7 +1354,7 @@
{
const char *error = 0;
- LT__MUTEX_GETERROR (error);
+ LT__GETERROR (error);
if (error == LT__STRERROR (FILE_NOT_FOUND))
return 1;
@@ -1465,7 +1445,7 @@
/* Still here? Then we really did fail to locate any of the file
names we tried. */
- LT__MUTEX_SETERROR (FILE_NOT_FOUND);
+ LT__SETERROR (FILE_NOT_FOUND);
FREE (tmp);
return 0;
}
@@ -1482,10 +1462,10 @@
switch (error)
{
case ENOMEM:
- LT__MUTEX_SETERROR (NO_MEMORY);
+ LT__SETERROR (NO_MEMORY);
break;
default:
- LT__MUTEX_SETERROR (UNKNOWN);
+ LT__SETERROR (UNKNOWN);
break;
}
return 1;
@@ -1698,8 +1678,6 @@
lt_dlhandle cur, last;
int errors = 0;
- LT__MUTEX_LOCK ();
-
/* check whether the handle is valid */
last = cur = handles;
while (cur && handle != cur)
@@ -1710,7 +1688,7 @@
if (!cur)
{
- LT__MUTEX_SETERROR (INVALID_HANDLE);
+ LT__SETERROR (INVALID_HANDLE);
++errors;
goto done;
}
@@ -1749,13 +1727,11 @@
if (LT_DLIS_RESIDENT (handle))
{
- LT__MUTEX_SETERROR (CLOSE_RESIDENT_MODULE);
+ LT__SETERROR (CLOSE_RESIDENT_MODULE);
++errors;
}
done:
- LT__MUTEX_UNLOCK ();
-
return errors;
}
@@ -1770,13 +1746,13 @@
if (!handle)
{
- LT__MUTEX_SETERROR (INVALID_HANDLE);
+ LT__SETERROR (INVALID_HANDLE);
return 0;
}
if (!symbol)
{
- LT__MUTEX_SETERROR (SYMBOL_NOT_FOUND);
+ LT__SETERROR (SYMBOL_NOT_FOUND);
return 0;
}
@@ -1792,7 +1768,7 @@
sym = MALLOC (char, lensym + LT_SYMBOL_OVERHEAD + 1);
if (!sym)
{
- LT__MUTEX_SETERROR (BUFFER_OVERFLOW);
+ LT__SETERROR (BUFFER_OVERFLOW);
return 0;
}
}
@@ -1802,7 +1778,7 @@
{
const char *saved_error;
- LT__MUTEX_GETERROR (saved_error);
+ LT__GETERROR (saved_error);
/* this is a libtool module */
if (handle->loader->sym_prefix)
@@ -1828,7 +1804,7 @@
}
return address;
}
- LT__MUTEX_SETERRORSTR (saved_error);
+ LT__SETERRORSTR (saved_error);
}
/* otherwise try "symbol" */
@@ -1856,8 +1832,8 @@
{
const char *error;
- LT__MUTEX_GETERROR (error);
- LT__MUTEX_SETERRORSTR (0);
+ LT__GETERROR (error);
+ LT__SETERRORSTR (0);
return error ? error : NULL;
}
@@ -1938,10 +1914,8 @@
if (search_dir && *search_dir)
{
- LT__MUTEX_LOCK ();
if (lt_dlpath_insertdir (&user_search_path, 0, search_dir) != 0)
++errors;
- LT__MUTEX_UNLOCK ();
}
return errors;
@@ -1954,26 +1928,21 @@
if (before)
{
- LT__MUTEX_LOCK ();
if ((before < user_search_path)
|| (before >= user_search_path + LT_STRLEN (user_search_path)))
{
- LT__MUTEX_UNLOCK ();
- LT__MUTEX_SETERROR (INVALID_POSITION);
+ LT__SETERROR (INVALID_POSITION);
return 1;
}
- LT__MUTEX_UNLOCK ();
}
if (search_dir && *search_dir)
{
- LT__MUTEX_LOCK ();
if (lt_dlpath_insertdir (&user_search_path,
(char *) before, search_dir) != 0)
{
++errors;
}
- LT__MUTEX_UNLOCK ();
}
return errors;
@@ -1984,19 +1953,15 @@
{
int errors = 0;
- LT__MUTEX_LOCK ();
FREE (user_search_path);
- LT__MUTEX_UNLOCK ();
if (!search_path || !LT_STRLEN (search_path))
{
return errors;
}
- LT__MUTEX_LOCK ();
if (canonicalize_path (search_path, &user_search_path) != 0)
++errors;
- LT__MUTEX_UNLOCK ();
return errors;
}
@@ -2006,9 +1971,7 @@
{
const char *saved_path;
- LT__MUTEX_LOCK ();
saved_path = user_search_path;
- LT__MUTEX_UNLOCK ();
return saved_path;
}
@@ -2020,7 +1983,7 @@
if (!handle)
{
- LT__MUTEX_SETERROR (INVALID_HANDLE);
+ LT__SETERROR (INVALID_HANDLE);
++errors;
}
else
@@ -2036,7 +1999,7 @@
{
if (!handle)
{
- LT__MUTEX_SETERROR (INVALID_HANDLE);
+ LT__SETERROR (INVALID_HANDLE);
return -1;
}
@@ -2053,7 +2016,7 @@
{
if (!handle)
{
- LT__MUTEX_SETERROR (INVALID_HANDLE);
+ LT__SETERROR (INVALID_HANDLE);
return 0;
}
@@ -2090,8 +2053,6 @@
int errors = 0;
lt_dlhandle cur;
- LT__MUTEX_LOCK ();
-
cur = handles;
while (cur)
{
@@ -2105,8 +2066,6 @@
}
}
- LT__MUTEX_UNLOCK ();
-
return errors;
}
@@ -2114,13 +2073,7 @@
lt_dlcaller_register (void)
{
static lt_dlcaller_id last_caller_id = 0;
- int result;
-
- LT__MUTEX_LOCK ();
- result = ++last_caller_id;
- LT__MUTEX_UNLOCK ();
-
- return result;
+ return ++last_caller_id;
}
void *
@@ -2130,10 +2083,6 @@
void *stale = (void *) 0;
int i;
- /* This needs to be locked so that the caller data can be updated
- simultaneously by different threads. */
- LT__MUTEX_LOCK ();
-
if (handle->caller_data)
while (handle->caller_data[n_elements].key)
++n_elements;
@@ -2170,8 +2119,6 @@
handle->caller_data[i].data = data;
done:
- LT__MUTEX_UNLOCK ();
-
return stale;
}
@@ -2180,10 +2127,6 @@
{
void *result = (void *) 0;
- /* This needs to be locked so that the caller data isn't updated by
- another thread part way through this function. */
- LT__MUTEX_LOCK ();
-
/* Locate the index of the element with a matching KEY. */
{
int i;
@@ -2197,8 +2140,6 @@
}
}
- LT__MUTEX_UNLOCK ();
-
return result;
}
@@ -2219,7 +2160,7 @@
|| (dlloader->module_close == 0)
|| (dlloader->find_sym == 0))
{
- LT__MUTEX_SETERROR (INVALID_LOADER);
+ LT__SETERROR (INVALID_LOADER);
return 1;
}
@@ -2237,7 +2178,6 @@
node->find_sym = dlloader->find_sym;
node->dlloader_data = dlloader->dlloader_data;
- LT__MUTEX_LOCK ();
if (!loaders)
{
/* If there are no loaders, NODE becomes the list! */
@@ -2270,7 +2210,7 @@
if (ptr->next != place)
{
- LT__MUTEX_SETERROR (INVALID_LOADER);
+ LT__SETERROR (INVALID_LOADER);
++errors;
}
else
@@ -2281,8 +2221,6 @@
}
}
- LT__MUTEX_UNLOCK ();
-
return errors;
}
@@ -2295,20 +2233,17 @@
if (!place)
{
- LT__MUTEX_SETERROR (INVALID_LOADER);
+ LT__SETERROR (INVALID_LOADER);
return 1;
}
- LT__MUTEX_LOCK ();
-
/* Fail if there are any open modules which use this loader. */
for (handle = handles; handle; handle = handle->next)
{
if (handle->loader == place)
{
- LT__MUTEX_SETERROR (REMOVE_LOADER);
- ++errors;
- goto done;
+ LT__SETERROR (REMOVE_LOADER);
+ return ++errors;
}
}
@@ -2340,22 +2275,13 @@
FREE (place);
- done:
- LT__MUTEX_UNLOCK ();
-
return errors;
}
lt_dlloader *
lt_dlloader_next (lt_dlloader *place)
{
- lt_dlloader *next;
-
- LT__MUTEX_LOCK ();
- next = place ? place->next : loaders;
- LT__MUTEX_UNLOCK ();
-
- return next;
+ return place ? place->next : loaders;
}
const char *
@@ -2365,13 +2291,11 @@
if (place)
{
- LT__MUTEX_LOCK ();
name = place ? place->loader_name : 0;
- LT__MUTEX_UNLOCK ();
}
else
{
- LT__MUTEX_SETERROR (INVALID_LOADER);
+ LT__SETERROR (INVALID_LOADER);
}
return name;
@@ -2384,13 +2308,11 @@
if (place)
{
- LT__MUTEX_LOCK ();
data = place ? &(place->dlloader_data) : 0;
- LT__MUTEX_UNLOCK ();
}
else
{
- LT__MUTEX_SETERROR (INVALID_LOADER);
+ LT__SETERROR (INVALID_LOADER);
}
return data;
@@ -2401,7 +2323,6 @@
{
lt_dlloader *place = 0;
- LT__MUTEX_LOCK ();
for (place = loaders; place; place = place->next)
{
if (strcmp (place->loader_name, loader_name) == 0)
@@ -2409,7 +2330,6 @@
break;
}
}
- LT__MUTEX_UNLOCK ();
return place;
}
@@ -2417,8 +2337,24 @@
-/* These pointers are part of the published interface to libltdl,
+/* These symbols are part of the published interface to libltdl,
although they are no longer used. */
LT_GLOBAL_DATA void *(*lt_dlmalloc) (size_t size) = 0;
LT_GLOBAL_DATA void *(*lt_dlrealloc) (void *ptr, size_t size) = 0;
LT_GLOBAL_DATA void (*lt_dlfree) (void *ptr) = 0;
+
+/*ARGSUSED*/
+int
+lt_dlmutex_register (lt_dlmutex_lock *lock, lt_dlmutex_unlock *unlock,
+ lt_dlmutex_seterror *seterror,
+ lt_dlmutex_geterror *geterror)
+{
+ static int warned = 0;
+
+ if (warned++ == 0)
+ {
+ fputs ("libltdl: WARNING: lt_dlmutex_register() is deprecated.\n"
+ "libltdl: WARNING: this version of libltdl is not thread safe.\n",
+ stderr);
+ }
+}
--- orig/libltdl/ltdl.h
+++ mod/libltdl/ltdl.h
@@ -32,7 +32,6 @@
#include <libltdl/lt_system.h>
#include <libltdl/lt_error.h>
-#include <libltdl/lt_mutex.h>
LT_BEGIN_C_DECLS
@@ -128,10 +127,21 @@
/* --- BINARY COMPATIBILITY WITH OLD LIBLTDL --- */
+typedef void lt_dlmutex_lock (void);
+typedef void lt_dlmutex_unlock (void);
+typedef void lt_dlmutex_seterror (const char *errmsg);
+typedef const char *lt_dlmutex_geterror (void);
+
LT_SCOPE void * (*lt_dlmalloc) (size_t size);
LT_SCOPE void * (*lt_dlrealloc) (void *ptr, size_t size);
LT_SCOPE void (*lt_dlfree) (void *ptr);
+
+LT_SCOPE int lt_dlmutex_register (lt_dlmutex_lock *lock,
+ lt_dlmutex_unlock *unlock,
+ lt_dlmutex_seterror *seterror,
+ lt_dlmutex_geterror *geterror);
+
# define lt_ptr void *
- libtool--gary--1.0--patch-14,
Gary V. Vaughan <=
- Re: libtool--gary--1.0--patch-14, Bob Friesenhahn, 2004/04/22
- Re: libtool--gary--1.0--patch-14, Gary V. Vaughan, 2004/04/22
- Re: libtool--gary--1.0--patch-14, Bob Friesenhahn, 2004/04/22
- Re: libtool--gary--1.0--patch-14, Richard Dawe, 2004/04/22
- Re: libtool--gary--1.0--patch-14, Gary V. Vaughan, 2004/04/23
- Re: libtool--gary--1.0--patch-14, Richard Dawe, 2004/04/23
- Re: libtool--gary--1.0--patch-14, Bob Friesenhahn, 2004/04/23
- Re: libtool--gary--1.0--patch-14, Gary V . Vaughan, 2004/04/23
- Re: libtool--gary--1.0--patch-14, Richard Dawe, 2004/04/24
- Re: libtool--gary--1.0--patch-14, Dalibor Topic, 2004/04/26