SWAT-352: when loading lleventhost, call apr_dso_error() function.
In addition to its usual apr_sterror() function, APR defines a special function specifically for errors relating to the apr_dso_*() functions. Introduce ll_apr_warn_status() and ll_apr_assert_status() overloads accepting apr_dso_handle_t* to call apr_dso_error() as well as apr_strerror() and log its output. Use new ll_apr_warn_status() in LLAppViewer::loadEventHostModule() for apr_dso_load() and apr_dso_sym() calls. Instead of shorthand ll_apr_assert_status(), use with llassert_always() so check is still performed even in Release build. Add more lleventhost-related debugging output, e.g. full pathname of the DLL. On Mac and Linux, call 'file' command to report nature of the DLL too.meow-7.2.2
parent
5b7a3d3a36
commit
e04f9ef109
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "linden_common.h"
|
||||
#include "llapr.h"
|
||||
#include "apr_dso.h"
|
||||
|
||||
apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool
|
||||
LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool.
|
||||
|
|
@ -279,14 +280,31 @@ bool ll_apr_warn_status(apr_status_t status)
|
|||
{
|
||||
if(APR_SUCCESS == status) return false;
|
||||
char buf[MAX_STRING]; /* Flawfinder: ignore */
|
||||
apr_strerror(status, buf, MAX_STRING);
|
||||
apr_strerror(status, buf, sizeof(buf));
|
||||
LL_WARNS("APR") << "APR: " << buf << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ll_apr_warn_status(apr_status_t status, apr_dso_handle_t *handle)
|
||||
{
|
||||
bool result = ll_apr_warn_status(status);
|
||||
// Despite observed truncation of actual Mac dylib load errors, increasing
|
||||
// this buffer to more than MAX_STRING doesn't help: it appears that APR
|
||||
// stores the output in a fixed 255-character internal buffer. (*sigh*)
|
||||
char buf[MAX_STRING]; /* Flawfinder: ignore */
|
||||
apr_dso_error(handle, buf, sizeof(buf));
|
||||
LL_WARNS("APR") << "APR: " << buf << LL_ENDL;
|
||||
return result;
|
||||
}
|
||||
|
||||
void ll_apr_assert_status(apr_status_t status)
|
||||
{
|
||||
llassert(ll_apr_warn_status(status) == false);
|
||||
llassert(! ll_apr_warn_status(status));
|
||||
}
|
||||
|
||||
void ll_apr_assert_status(apr_status_t status, apr_dso_handle_t *handle)
|
||||
{
|
||||
llassert(! ll_apr_warn_status(status, handle));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@
|
|||
extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
|
||||
extern apr_thread_mutex_t* gCallStacksLogMutexp;
|
||||
|
||||
struct apr_dso_handle_t;
|
||||
|
||||
/**
|
||||
* @brief initialize the common apr constructs -- apr itself, the
|
||||
* global pool, and a mutex.
|
||||
|
|
@ -259,8 +261,11 @@ public:
|
|||
* @return Returns <code>true</code> if status is an error condition.
|
||||
*/
|
||||
bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
|
||||
/// There's a whole other APR error-message function if you pass a DSO handle.
|
||||
bool LL_COMMON_API ll_apr_warn_status(apr_status_t status, apr_dso_handle_t* handle);
|
||||
|
||||
void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
|
||||
void LL_COMMON_API ll_apr_assert_status(apr_status_t status, apr_dso_handle_t* handle);
|
||||
|
||||
extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
|
||||
|
||||
|
|
|
|||
|
|
@ -4622,6 +4622,35 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
|
|||
return;
|
||||
}
|
||||
|
||||
LL_INFOS("eventhost") << "Found lleventhost at '" << dso_path << "'" << LL_ENDL;
|
||||
#if ! defined(LL_WINDOWS)
|
||||
{
|
||||
std::string outfile("/tmp/lleventhost.file.out");
|
||||
std::string command("file '" + dso_path + "' > '" + outfile + "' 2>&1");
|
||||
int rc = system(command.c_str());
|
||||
if (rc != 0)
|
||||
{
|
||||
LL_WARNS("eventhost") << command << " ==> " << rc << ':' << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS("eventhost") << command << ':' << LL_ENDL;
|
||||
}
|
||||
{
|
||||
std::ifstream reader(outfile.c_str());
|
||||
std::string line;
|
||||
while (std::getline(reader, line))
|
||||
{
|
||||
size_t len = line.length();
|
||||
if (len && line[len-1] == '\n')
|
||||
line.erase(len-1);
|
||||
LL_INFOS("eventhost") << line << LL_ENDL;
|
||||
}
|
||||
}
|
||||
remove(outfile.c_str());
|
||||
}
|
||||
#endif // LL_WINDOWS
|
||||
|
||||
apr_dso_handle_t * eventhost_dso_handle = NULL;
|
||||
apr_pool_t * eventhost_dso_memory_pool = NULL;
|
||||
|
||||
|
|
@ -4630,13 +4659,13 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
|
|||
apr_status_t rv = apr_dso_load(&eventhost_dso_handle,
|
||||
dso_path.c_str(),
|
||||
eventhost_dso_memory_pool);
|
||||
ll_apr_assert_status(rv);
|
||||
llassert_always(! ll_apr_warn_status(rv, eventhost_dso_handle));
|
||||
llassert_always(eventhost_dso_handle != NULL);
|
||||
|
||||
int (*ll_plugin_start_func)(LLSD const &) = NULL;
|
||||
rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll_plugin_start_func, eventhost_dso_handle, "ll_plugin_start");
|
||||
|
||||
ll_apr_assert_status(rv);
|
||||
llassert_always(! ll_apr_warn_status(rv, eventhost_dso_handle));
|
||||
llassert_always(ll_plugin_start_func != NULL);
|
||||
|
||||
LLSD args;
|
||||
|
|
|
|||
Loading…
Reference in New Issue