summaryrefslogtreecommitdiff
path: root/ACE/ace/DLL_Manager.cpp
diff options
context:
space:
mode:
authormcorino <mcorino@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2014-09-11 10:29:17 +0000
committermcorino <mcorino@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2014-09-11 10:29:17 +0000
commit73b360449da833a92533d1eb9cf8d08c9298052c (patch)
treed6d29099f522f0b934b96734980af78410d895c2 /ACE/ace/DLL_Manager.cpp
parent381c1523171a57e7dec6bdfba8696c3c0c75b5ce (diff)
downloadATCD-73b360449da833a92533d1eb9cf8d08c9298052c.tar.gz
Thu Sep 11 10:14:17 UTC 2014 Martin Corino <mcorino@remedy.nl>
Diffstat (limited to 'ACE/ace/DLL_Manager.cpp')
-rw-r--r--ACE/ace/DLL_Manager.cpp128
1 files changed, 91 insertions, 37 deletions
diff --git a/ACE/ace/DLL_Manager.cpp b/ACE/ace/DLL_Manager.cpp
index ad9477b7a8c..b957ef006ed 100644
--- a/ACE/ace/DLL_Manager.cpp
+++ b/ACE/ace/DLL_Manager.cpp
@@ -43,7 +43,8 @@ ACE_DLL_Handle::dll_name (void) const
int
ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
int open_mode,
- ACE_SHLIB_HANDLE handle)
+ ACE_SHLIB_HANDLE handle,
+ ERROR_STACK *errors)
{
ACE_TRACE ("ACE_DLL_Handle::open");
ACE_MT (ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->lock_, 0));
@@ -121,6 +122,7 @@ ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
if (ACE::debug ())
{
+ ACE_TString err;
ACELIB_DEBUG ((LM_DEBUG,
ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ")
ACE_TEXT ("(\"%s\", 0x%x) -> %s: %s\n"),
@@ -129,7 +131,7 @@ ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
((this->handle_ != ACE_SHLIB_INVALID_HANDLE)
? ACE_TEXT ("succeeded")
: ACE_TEXT ("failed")),
- this->error()->c_str()));
+ this->error (err).c_str()));
}
if (this->handle_ != ACE_SHLIB_INVALID_HANDLE) // Good one?
@@ -141,14 +143,27 @@ ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
// mask it.
// @TODO: If we've found our DLL _and_ it's
// broken, should we continue at all?
- if ((errno != 0) && (errno != ENOENT) && ACE::debug ())
- ACELIB_ERROR ((LM_ERROR,
- ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ")
- ACE_TEXT ("(\'%s\') failed, errno=")
- ACE_TEXT ("%d: <%s>\n"),
- name->c_str (),
- ACE_ERRNO_GET,
- this->error ()->c_str ()));
+ if ((errno != 0) && (errno != ENOENT) && (errors || ACE::debug ()))
+ {
+ ACE_TString errtmp;
+ if (errors)
+ {
+ errors->push (this->error (errtmp));
+ }
+
+ if (ACE::debug ())
+ {
+ if (!errors)
+ this->error (errtmp);
+ ACELIB_ERROR ((LM_ERROR,
+ ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ")
+ ACE_TEXT ("(\'%s\') failed, errno=")
+ ACE_TEXT ("%d: <%s>\n"),
+ name->c_str (),
+ ACE_ERRNO_GET,
+ errtmp.c_str ()));
+ }
+ }
#if defined (AIX)
// AIX often puts the shared library file (most often named
@@ -166,6 +181,7 @@ ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
if (ACE::debug ())
{
+ ACE_TString err;
ACELIB_DEBUG ((LM_DEBUG,
ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ")
ACE_TEXT ("(\"%s\", 0x%x) -> %s: %s\n"),
@@ -174,7 +190,7 @@ ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
(this->handle_ != ACE_SHLIB_INVALID_HANDLE
? ACE_TEXT ("succeeded")
: ACE_TEXT ("failed")),
- this->error()->c_str()));
+ this->error(err).c_str()));
}
this->handle_ = ACE_OS::dlopen (aix_pathname, open_mode);
@@ -187,14 +203,27 @@ ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
//
// @TODO: If we've found our DLL _and_ it's broken,
// should we continue at all?
- if (ACE::debug () && (errno != 0) && (errno != ENOENT))
- ACELIB_ERROR ((LM_ERROR,
- ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ")
- ACE_TEXT ("(\'%s\') failed, errno=")
- ACE_TEXT ("%d: %s\n"),
- name->c_str (),
- errno,
- this->error ()->c_str ()));
+ if ((errno != 0) && (errno != ENOENT) && (errors || ACE::debug ()))
+ {
+ ACE_TString errtmp;
+ if (errors)
+ {
+ errors->push (this->error (errtmp));
+ }
+
+ if (ACE::debug ())
+ {
+ if (!errors)
+ this->error (errtmp);
+ ACELIB_ERROR ((LM_ERROR,
+ ACE_TEXT ("ACE (%P|%t) DLL_Handle::open ")
+ ACE_TEXT ("(\'%s\') failed, errno=")
+ ACE_TEXT ("%d: <%s>\n"),
+ name->c_str (),
+ ACE_ERRNO_GET,
+ errtmp.c_str ()));
+ }
+ }
}
#endif /* AIX */
@@ -204,12 +233,25 @@ ACE_DLL_Handle::open (const ACE_TCHAR *dll_name,
if (this->handle_ == ACE_SHLIB_INVALID_HANDLE)
{
- if (ACE::debug ())
- ACELIB_ERROR ((LM_ERROR,
- ACE_TEXT ("ACE (%P|%t) DLL_Handle::open (\"%s\"): ")
- ACE_TEXT ("Invalid handle error: %s\n"),
- this->dll_name_,
- this->error ()->c_str ()));
+ if (errors || ACE::debug ())
+ {
+ ACE_TString errtmp;
+ if (errors)
+ {
+ errors->push (this->error (errtmp));
+ }
+
+ if (ACE::debug ())
+ {
+ if (!errors)
+ this->error (errtmp);
+ ACELIB_ERROR ((LM_ERROR,
+ ACE_TEXT ("ACE (%P|%t) DLL_Handle::open (\"%s\"): ")
+ ACE_TEXT ("Invalid handle error: %s\n"),
+ this->dll_name_,
+ errtmp.c_str ()));
+ }
+ }
return -1;
}
@@ -286,10 +328,13 @@ ACE_DLL_Handle::close (int unload)
retval = ACE_OS::dlclose (h);
if (retval != 0 && ACE::debug ())
- ACELIB_ERROR ((LM_ERROR,
- ACE_TEXT ("ACE (%P|%t) DLL_Handle::close - ")
- ACE_TEXT ("Failed with: \"%s\".\n"),
- this->error ()->c_str ()));
+ {
+ ACE_TString err;
+ ACELIB_ERROR ((LM_ERROR,
+ ACE_TEXT ("ACE (%P|%t) DLL_Handle::close - ")
+ ACE_TEXT ("Failed with: \"%s\".\n"),
+ this->error (err).c_str ()));
+ }
}
return retval;
@@ -304,6 +349,13 @@ ACE_DLL_Handle::refcount (void) const
void *
ACE_DLL_Handle::symbol (const ACE_TCHAR *sym_name, bool ignore_errors)
{
+ ACE_TString error;
+ return this->symbol (sym_name, ignore_errors, error);
+}
+
+void *
+ACE_DLL_Handle::symbol (const ACE_TCHAR *sym_name, bool ignore_errors, ACE_TString &error)
+{
ACE_TRACE ("ACE_DLL_Handle::symbol");
ACE_MT (ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->lock_, 0));
@@ -324,12 +376,14 @@ ACE_DLL_Handle::symbol (const ACE_TCHAR *sym_name, bool ignore_errors)
// an error.
if (!sym && !ignore_errors)
{
+ this->error (error);
+
if (ACE::debug ())
ACELIB_ERROR ((LM_ERROR,
ACE_TEXT ("ACE (%P|%t) DLL_Handle::symbol (\"%s\") ")
ACE_TEXT (" failed with \"%s\".\n"),
auto_name.get (),
- this->error ()->c_str ()));
+ error.c_str ()));
return 0;
}
@@ -375,14 +429,13 @@ ACE_DLL_Handle::get_handle (bool become_owner)
// This method is used return the last error of a library operation.
-auto_ptr <ACE_TString>
-ACE_DLL_Handle::error (void)
+ACE_TString &
+ACE_DLL_Handle::error (ACE_TString &err)
{
ACE_TRACE ("ACE_DLL_Handle::error");
const ACE_TCHAR *error = ACE_OS::dlerror ();
- auto_ptr<ACE_TString> str
- (new ACE_TString (error ? error : ACE_TEXT ("no error")));
- return str;
+ err = (error ? error : ACE_TEXT ("no error"));
+ return err;
}
void
@@ -548,7 +601,8 @@ ACE_DLL_Manager::~ACE_DLL_Manager (void)
ACE_DLL_Handle *
ACE_DLL_Manager::open_dll (const ACE_TCHAR *dll_name,
int open_mode,
- ACE_SHLIB_HANDLE handle)
+ ACE_SHLIB_HANDLE handle,
+ ACE_DLL_Handle::ERROR_STACK *errors)
{
ACE_TRACE ("ACE_DLL_Manager::open_dll");
@@ -572,7 +626,7 @@ ACE_DLL_Manager::open_dll (const ACE_TCHAR *dll_name,
if (dll_handle)
{
- if (dll_handle->open (dll_name, open_mode, handle) != 0)
+ if (dll_handle->open (dll_name, open_mode, handle, errors) != 0)
{
// Error while opening dll. Free temp handle
if (ACE::debug ())