svn merge -r113780:113785
svn+ssh://svn.lindenlab.com/svn/linden/branches/moss/gst3-t113732 QAR-1333 linux gstreamer compatibility improvements and ADD_BUILD_TEST improvements - combo mergemaster
parent
2d60d45aea
commit
7573288ab3
|
|
@ -213,6 +213,7 @@ Ian Kas
|
|||
[NO JIRA] (Ukranian localization)
|
||||
Iskar Ariantho
|
||||
VWR-1223
|
||||
VWR-11759
|
||||
Jacek Antonelli
|
||||
VWR-165
|
||||
VWR-188
|
||||
|
|
|
|||
|
|
@ -156,6 +156,8 @@ if (LINUX)
|
|||
if (VIEWER)
|
||||
add_definitions(-DAPPID=secondlife)
|
||||
add_definitions(-fvisibility=hidden)
|
||||
# don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The viewer doesn't need to catch SIGCHLD anyway.
|
||||
add_definitions(-DLL_IGNORE_SIGCHLD)
|
||||
if (NOT STANDALONE)
|
||||
# this stops us requiring a really recent glibc at runtime
|
||||
add_definitions(-fno-stack-protector)
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ set(cmake_SOURCE_FILES
|
|||
GStreamer.cmake
|
||||
GooglePerfTools.cmake
|
||||
JPEG.cmake
|
||||
LLAddBuildTest.cmake
|
||||
LLAudio.cmake
|
||||
LLCharacter.cmake
|
||||
LLCommon.cmake
|
||||
|
|
@ -70,6 +71,7 @@ set(cmake_SOURCE_FILES
|
|||
Python.cmake
|
||||
Prebuilt.cmake
|
||||
QuickTime.cmake
|
||||
RunBuildTest.cmake
|
||||
TemplateCheck.cmake
|
||||
Tut.cmake
|
||||
UI.cmake
|
||||
|
|
|
|||
|
|
@ -6,12 +6,6 @@ INCLUDE(LLMath)
|
|||
MACRO(ADD_BUILD_TEST_NO_COMMON name parent)
|
||||
# MESSAGE("${CMAKE_CURRENT_SOURCE_DIR}/tests/${name}_test.cpp")
|
||||
IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/${name}_test.cpp")
|
||||
SET(no_common_libraries
|
||||
${APRUTIL_LIBRARIES}
|
||||
${APR_LIBRARIES}
|
||||
${PTHREAD_LIBRARY}
|
||||
${WINDOWS_LIBRARIES}
|
||||
)
|
||||
SET(no_common_libraries
|
||||
${APRUTIL_LIBRARIES}
|
||||
${APR_LIBRARIES}
|
||||
|
|
@ -23,12 +17,15 @@ MACRO(ADD_BUILD_TEST_NO_COMMON name parent)
|
|||
tests/${name}_test.cpp
|
||||
${CMAKE_SOURCE_DIR}/test/test.cpp
|
||||
)
|
||||
ADD_BUILD_TEST_INTERNAL(${name} ${parent} "${no_common_libraries}" "${no_common_source_files}")
|
||||
ADD_BUILD_TEST_INTERNAL("${name}" "${parent}" "${no_common_libraries}" "${no_common_source_files}")
|
||||
ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/${name}_test.cpp")
|
||||
ENDMACRO(ADD_BUILD_TEST_NO_COMMON name parent)
|
||||
|
||||
|
||||
MACRO(ADD_BUILD_TEST name parent)
|
||||
# optional extra parameter: list of additional source files
|
||||
SET(more_source_files "${ARGN}")
|
||||
|
||||
# MESSAGE("${CMAKE_CURRENT_SOURCE_DIR}/tests/${name}_test.cpp")
|
||||
IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/${name}_test.cpp")
|
||||
|
||||
|
|
@ -44,39 +41,39 @@ MACRO(ADD_BUILD_TEST name parent)
|
|||
tests/${name}_test.cpp
|
||||
${CMAKE_SOURCE_DIR}/test/test.cpp
|
||||
${CMAKE_SOURCE_DIR}/test/lltut.cpp
|
||||
${more_source_files}
|
||||
)
|
||||
ADD_BUILD_TEST_INTERNAL(${name} ${parent} "${basic_libraries}" "${basic_source_files}")
|
||||
ADD_BUILD_TEST_INTERNAL("${name}" "${parent}" "${basic_libraries}" "${basic_source_files}")
|
||||
|
||||
ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/${name}_test.cpp")
|
||||
ENDMACRO(ADD_BUILD_TEST name parent)
|
||||
|
||||
|
||||
MACRO(ADD_VIEWER_BUILD_TEST name parent)
|
||||
# This is just like the generic ADD_BUILD_TEST, but we implicitly
|
||||
# add the necessary precompiled header .cpp file (anyone else find that
|
||||
# oxymoronic?) because the MSVC build errors will NOT point you there.
|
||||
ADD_BUILD_TEST("${name}" "${parent}" llviewerprecompiledheaders.cpp)
|
||||
ENDMACRO(ADD_VIEWER_BUILD_TEST name parent)
|
||||
|
||||
|
||||
MACRO(ADD_SIMULATOR_BUILD_TEST name parent)
|
||||
SET(sim_source_files
|
||||
llsimprecompiledheaders.cpp
|
||||
${name}.cpp
|
||||
tests/${name}_test.cpp
|
||||
../test/lltut.cpp
|
||||
../test/test.cpp
|
||||
)
|
||||
SET(basic_libraries
|
||||
${LLCOMMON_LIBRARIES}
|
||||
${APRUTIL_LIBRARIES}
|
||||
${APR_LIBRARIES}
|
||||
${PTHREAD_LIBRARY}
|
||||
${WINDOWS_LIBRARIES}
|
||||
)
|
||||
ADD_BUILD_TEST_INTERNAL(${name} ${parent} "${basic_libraries}" "${sim_source_files}")
|
||||
ADD_BUILD_TEST("${name}" "${parent}" llsimprecompiledheaders.cpp)
|
||||
|
||||
if (WINDOWS)
|
||||
SET_SOURCE_FILES_PROPERTIES(
|
||||
"tests/${name}_test.cpp"
|
||||
PROPERTIES
|
||||
COMPILE_FLAGS "/Yullsimprecompiledheaders.h"
|
||||
)
|
||||
)
|
||||
endif (WINDOWS)
|
||||
ENDMACRO(ADD_SIMULATOR_BUILD_TEST name parent)
|
||||
|
||||
MACRO(ADD_BUILD_TEST_INTERNAL name parent libraries source_files)
|
||||
# Optional additional parameter: pathname of Python wrapper script
|
||||
SET(wrapper "${ARGN}")
|
||||
#MESSAGE(STATUS "ADD_BUILD_TEST_INTERNAL ${name} wrapper = ${wrapper}")
|
||||
|
||||
SET(TEST_SOURCE_FILES ${source_files})
|
||||
SET(HEADER "${name}.h")
|
||||
set_source_files_properties(${HEADER}
|
||||
|
|
@ -87,17 +84,70 @@ MACRO(ADD_BUILD_TEST_INTERNAL name parent libraries source_files)
|
|||
TARGET_LINK_LIBRARIES(${name}_test
|
||||
${libraries}
|
||||
)
|
||||
|
||||
|
||||
GET_TARGET_PROPERTY(TEST_EXE ${name}_test LOCATION)
|
||||
SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}_test_ok.txt)
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${TEST_OUTPUT}
|
||||
COMMAND ${TEST_EXE}
|
||||
ARGS --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR}
|
||||
DEPENDS ${name}_test
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
ADD_CUSTOM_TARGET(${name}_test_ok ALL DEPENDS ${TEST_OUTPUT})
|
||||
ADD_DEPENDENCIES(${parent} ${name}_test_ok)
|
||||
|
||||
ENDMACRO(ADD_BUILD_TEST_INTERNAL name parent libraries)
|
||||
SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR})
|
||||
IF (wrapper)
|
||||
SET(TEST_CMD ${PYTHON_EXECUTABLE} ${wrapper} ${TEST_CMD})
|
||||
ENDIF (wrapper)
|
||||
|
||||
#MESSAGE(STATUS "ADD_BUILD_TEST_INTERNAL ${name} test_cmd = ${TEST_CMD}")
|
||||
SET(TEST_SCRIPT_CMD
|
||||
${CMAKE_COMMAND}
|
||||
-DLD_LIBRARY_PATH=${ARCH_PREBUILT_DIRS}:/usr/lib
|
||||
-DTEST_CMD:STRING="${TEST_CMD}"
|
||||
-P ${CMAKE_SOURCE_DIR}/cmake/RunBuildTest.cmake
|
||||
)
|
||||
|
||||
#MESSAGE(STATUS "ADD_BUILD_TEST_INTERNAL ${name} test_script = ${TEST_SCRIPT_CMD}")
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${TEST_OUTPUT}
|
||||
COMMAND ${TEST_SCRIPT_CMD}
|
||||
DEPENDS ${name}_test
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
|
||||
ADD_CUSTOM_TARGET(${name}_test_ok ALL DEPENDS ${TEST_OUTPUT})
|
||||
IF (${parent})
|
||||
ADD_DEPENDENCIES(${parent} ${name}_test_ok)
|
||||
ENDIF (${parent})
|
||||
|
||||
ENDMACRO(ADD_BUILD_TEST_INTERNAL name parent libraries source_files)
|
||||
|
||||
|
||||
MACRO(ADD_COMM_BUILD_TEST name parent wrapper)
|
||||
## MESSAGE(STATUS "ADD_COMM_BUILD_TEST ${name} wrapper = ${wrapper}")
|
||||
# optional extra parameter: list of additional source files
|
||||
SET(more_source_files "${ARGN}")
|
||||
## MESSAGE(STATUS "ADD_COMM_BUILD_TEST ${name} more_source_files = ${more_source_files}")
|
||||
|
||||
SET(libraries
|
||||
${LLMESSAGE_LIBRARIES}
|
||||
${LLMATH_LIBRARIES}
|
||||
${LLVFS_LIBRARIES}
|
||||
${LLCOMMON_LIBRARIES}
|
||||
${APRUTIL_LIBRARIES}
|
||||
${APR_LIBRARIES}
|
||||
${PTHREAD_LIBRARY}
|
||||
${WINDOWS_LIBRARIES}
|
||||
)
|
||||
SET(source_files
|
||||
${name}.cpp
|
||||
tests/${name}_test.cpp
|
||||
${CMAKE_SOURCE_DIR}/test/test.cpp
|
||||
${CMAKE_SOURCE_DIR}/test/lltut.cpp
|
||||
${more_source_files}
|
||||
)
|
||||
|
||||
ADD_BUILD_TEST_INTERNAL("${name}" "${parent}" "${libraries}" "${source_files}" "${wrapper}")
|
||||
ENDMACRO(ADD_COMM_BUILD_TEST name parent wrapper)
|
||||
|
||||
MACRO(ADD_VIEWER_COMM_BUILD_TEST name parent wrapper)
|
||||
# This is just like the generic ADD_COMM_BUILD_TEST, but we implicitly
|
||||
# add the necessary precompiled header .cpp file (anyone else find that
|
||||
# oxymoronic?) because the MSVC build errors will NOT point you there.
|
||||
## MESSAGE(STATUS "ADD_VIEWER_COMM_BUILD_TEST ${name} wrapper = ${wrapper}")
|
||||
ADD_COMM_BUILD_TEST("${name}" "${parent}" "${wrapper}" llviewerprecompiledheaders.cpp)
|
||||
ENDMACRO(ADD_VIEWER_COMM_BUILD_TEST name parent wrapper)
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ static BOOL do_ask_dialog(void)
|
|||
|
||||
win = gtk_message_dialog_new(NULL,
|
||||
flags, messagetype, buttons,
|
||||
dialog_text);
|
||||
"%s", dialog_text);
|
||||
gtk_window_set_type_hint(GTK_WINDOW(win),
|
||||
GDK_WINDOW_TYPE_HINT_DIALOG);
|
||||
gtk_window_set_title(GTK_WINDOW(win), dialog_title);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* @file is_approx_equal_fraction.h
|
||||
* @author Nat Goodspeed
|
||||
* @date 2009-01-28
|
||||
* @brief lltut.h uses is_approx_equal_fraction(). Moved to this header
|
||||
* file in llcommon so we can use lltut.h for llcommon tests without
|
||||
* making llcommon depend on llmath.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2009&license=viewergpl$
|
||||
* Copyright (c) 2009, Linden Research, Inc.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if ! defined(LL_IS_APPROX_EQUAL_FRACTION_H)
|
||||
#define LL_IS_APPROX_EQUAL_FRACTION_H
|
||||
|
||||
#include "lldefs.h"
|
||||
#include <cmath>
|
||||
|
||||
/**
|
||||
* Originally llmath.h contained two complete implementations of
|
||||
* is_approx_equal_fraction(), with signatures as below, bodies identical save
|
||||
* where they specifically mentioned F32/F64. Unifying these into a template
|
||||
* makes sense -- but to preserve the compiler's overload-selection behavior,
|
||||
* we still wrap the template implementation with the specific overloaded
|
||||
* signatures.
|
||||
*/
|
||||
template <typename FTYPE>
|
||||
inline BOOL is_approx_equal_fraction_impl(FTYPE x, FTYPE y, U32 frac_bits)
|
||||
{
|
||||
BOOL ret = TRUE;
|
||||
FTYPE diff = (FTYPE) fabs(x - y);
|
||||
|
||||
S32 diffInt = (S32) diff;
|
||||
S32 diffFracTolerance = (S32) ((diff - (FTYPE) diffInt) * (1 << frac_bits));
|
||||
|
||||
// if integer portion is not equal, not enough bits were used for packing
|
||||
// so error out since either the use case is not correct OR there is
|
||||
// an issue with pack/unpack. should fail in either case.
|
||||
// for decimal portion, make sure that the delta is no more than 1
|
||||
// based on the number of bits used for packing decimal portion.
|
||||
if (diffInt != 0 || diffFracTolerance > 1)
|
||||
{
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// F32 flavor
|
||||
inline BOOL is_approx_equal_fraction(F32 x, F32 y, U32 frac_bits)
|
||||
{
|
||||
return is_approx_equal_fraction_impl<F32>(x, y, frac_bits);
|
||||
}
|
||||
|
||||
/// F64 flavor
|
||||
inline BOOL is_approx_equal_fraction(F64 x, F64 y, U32 frac_bits)
|
||||
{
|
||||
return is_approx_equal_fraction_impl<F64>(x, y, frac_bits);
|
||||
}
|
||||
|
||||
#endif /* ! defined(LL_IS_APPROX_EQUAL_FRACTION_H) */
|
||||
|
|
@ -58,7 +58,7 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *);
|
|||
/* OSX doesn't support SIGRT* */
|
||||
S32 LL_SMACKDOWN_SIGNAL = SIGUSR1;
|
||||
S32 LL_HEARTBEAT_SIGNAL = SIGUSR2;
|
||||
# else
|
||||
# else // linux or (assumed) other similar unixoid
|
||||
/* We want reliable delivery of our signals - SIGRT* is it. */
|
||||
/* Old LinuxThreads versions eat SIGRTMIN+0 to SIGRTMIN+2, avoid those. */
|
||||
/* Note that SIGRTMIN/SIGRTMAX may expand to a glibc function call with a
|
||||
|
|
@ -559,7 +559,9 @@ void setup_signals()
|
|||
sigaction(LL_SMACKDOWN_SIGNAL, &act, NULL);
|
||||
|
||||
// Asynchronous signals that are normally ignored
|
||||
#ifndef LL_IGNORE_SIGCHLD
|
||||
sigaction(SIGCHLD, &act, NULL);
|
||||
#endif // LL_IGNORE_SIGCHLD
|
||||
sigaction(SIGUSR2, &act, NULL);
|
||||
|
||||
// Asynchronous signals that result in attempted graceful exit
|
||||
|
|
@ -593,7 +595,9 @@ void clear_signals()
|
|||
sigaction(LL_SMACKDOWN_SIGNAL, &act, NULL);
|
||||
|
||||
// Asynchronous signals that are normally ignored
|
||||
#ifndef LL_IGNORE_SIGCHLD
|
||||
sigaction(SIGCHLD, &act, NULL);
|
||||
#endif // LL_IGNORE_SIGCHLD
|
||||
|
||||
// Asynchronous signals that result in attempted graceful exit
|
||||
sigaction(SIGHUP, &act, NULL);
|
||||
|
|
|
|||
|
|
@ -38,6 +38,10 @@
|
|||
#include "lldefs.h"
|
||||
#include "llstl.h" // *TODO: Remove when LLString is gone
|
||||
#include "llstring.h" // *TODO: Remove when LLString is gone
|
||||
// lltut.h uses is_approx_equal_fraction(). This was moved to its own header
|
||||
// file in llcommon so we can use lltut.h for llcommon tests without making
|
||||
// llcommon depend on llmath.
|
||||
#include "is_approx_equal_fraction.h"
|
||||
|
||||
// work around for Windows & older gcc non-standard function names.
|
||||
#if LL_WINDOWS
|
||||
|
|
@ -142,48 +146,6 @@ inline BOOL is_approx_equal(F64 x, F64 y)
|
|||
return (std::abs((S32) ((U64&)x - (U64&)y) ) < COMPARE_MANTISSA_UP_TO_BIT);
|
||||
}
|
||||
|
||||
inline BOOL is_approx_equal_fraction(F32 x, F32 y, U32 frac_bits)
|
||||
{
|
||||
BOOL ret = TRUE;
|
||||
F32 diff = (F32) fabs(x - y);
|
||||
|
||||
S32 diffInt = (S32) diff;
|
||||
S32 diffFracTolerance = (S32) ((diff - (F32) diffInt) * (1 << frac_bits));
|
||||
|
||||
// if integer portion is not equal, not enough bits were used for packing
|
||||
// so error out since either the use case is not correct OR there is
|
||||
// an issue with pack/unpack. should fail in either case.
|
||||
// for decimal portion, make sure that the delta is no more than 1
|
||||
// based on the number of bits used for packing decimal portion.
|
||||
if (diffInt != 0 || diffFracTolerance > 1)
|
||||
{
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline BOOL is_approx_equal_fraction(F64 x, F64 y, U32 frac_bits)
|
||||
{
|
||||
BOOL ret = TRUE;
|
||||
F64 diff = (F64) fabs(x - y);
|
||||
|
||||
S32 diffInt = (S32) diff;
|
||||
S32 diffFracTolerance = (S32) ((diff - (F64) diffInt) * (1 << frac_bits));
|
||||
|
||||
// if integer portion is not equal, not enough bits were used for packing
|
||||
// so error out since either the use case is not correct OR there is
|
||||
// an issue with pack/unpack. should fail in either case.
|
||||
// for decimal portion, make sure that the delta is no more than 1
|
||||
// based on the number of bits used for packing decimal portion.
|
||||
if (diffInt != 0 || diffFracTolerance > 1)
|
||||
{
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline S32 llabs(const S32 a)
|
||||
{
|
||||
return S32(std::labs(a));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
/**
|
||||
* @file commtest.h
|
||||
* @author Nat Goodspeed
|
||||
* @date 2009-01-09
|
||||
* @brief
|
||||
*
|
||||
* $LicenseInfo:firstyear=2009&license=viewergpl$
|
||||
* Copyright (c) 2009, Linden Research, Inc.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if ! defined(LL_COMMTEST_H)
|
||||
#define LL_COMMTEST_H
|
||||
|
||||
#include "networkio.h"
|
||||
#include "llevents.h"
|
||||
#include "llsd.h"
|
||||
#include "llhost.h"
|
||||
#include "stringize.h"
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
* This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST).
|
||||
*/
|
||||
struct commtest_data
|
||||
{
|
||||
NetworkIO& netio;
|
||||
LLEventPumps& pumps;
|
||||
LLEventStream replyPump, errorPump;
|
||||
LLSD result;
|
||||
bool success;
|
||||
LLHost host;
|
||||
std::string server;
|
||||
|
||||
commtest_data():
|
||||
netio(NetworkIO::instance()),
|
||||
pumps(LLEventPumps::instance()),
|
||||
replyPump("reply"),
|
||||
errorPump("error"),
|
||||
success(false),
|
||||
host("127.0.0.1", 8000),
|
||||
server(STRINGIZE("http://" << host.getString() << "/"))
|
||||
{
|
||||
replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true));
|
||||
errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false));
|
||||
}
|
||||
|
||||
bool outcome(const LLSD& _result, bool _success)
|
||||
{
|
||||
// std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n";
|
||||
result = _result;
|
||||
success = _success;
|
||||
// Break the wait loop in NetworkIO::pump(), otherwise devs get
|
||||
// irritated at making the big monolithic test executable take longer
|
||||
pumps.obtain("done").post(success);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* ! defined(LL_COMMTEST_H) */
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
/**
|
||||
* @file networkio.h
|
||||
* @author Nat Goodspeed
|
||||
* @date 2009-01-09
|
||||
* @brief
|
||||
*
|
||||
* $LicenseInfo:firstyear=2009&license=viewergpl$
|
||||
* Copyright (c) 2009, Linden Research, Inc.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if ! defined(LL_NETWORKIO_H)
|
||||
#define LL_NETWORKIO_H
|
||||
|
||||
#include "llmemory.h" // LLSingleton
|
||||
#include "llapr.h"
|
||||
#include "llares.h"
|
||||
#include "llpumpio.h"
|
||||
#include "llhttpclient.h"
|
||||
|
||||
/*****************************************************************************
|
||||
* NetworkIO
|
||||
*****************************************************************************/
|
||||
// Doing this initialization in a class constructor makes sense. But we don't
|
||||
// want to redo it for each different test. Nor do we want to do it at static-
|
||||
// init time. Use the lazy, on-demand initialization we get from LLSingleton.
|
||||
class NetworkIO: public LLSingleton<NetworkIO>
|
||||
{
|
||||
public:
|
||||
NetworkIO():
|
||||
mServicePump(NULL),
|
||||
mDone(false)
|
||||
{
|
||||
ll_init_apr();
|
||||
if (! gAPRPoolp)
|
||||
{
|
||||
throw std::runtime_error("Can't initialize APR");
|
||||
}
|
||||
|
||||
// Create IO Pump to use for HTTP Requests.
|
||||
mServicePump = new LLPumpIO(gAPRPoolp);
|
||||
LLHTTPClient::setPump(*mServicePump);
|
||||
if (ll_init_ares() == NULL || !gAres->isInitialized())
|
||||
{
|
||||
throw std::runtime_error("Can't start DNS resolver");
|
||||
}
|
||||
|
||||
// You can interrupt pump() without waiting the full timeout duration
|
||||
// by posting an event to the LLEventPump named "done".
|
||||
LLEventPumps::instance().obtain("done").listen("self",
|
||||
boost::bind(&NetworkIO::done, this, _1));
|
||||
}
|
||||
|
||||
bool pump(F32 timeout=10)
|
||||
{
|
||||
// Reset the done flag so we don't pop out prematurely
|
||||
mDone = false;
|
||||
// Evidently the IO structures underlying LLHTTPClient need to be
|
||||
// "pumped". Do some stuff normally performed in the viewer's main
|
||||
// loop.
|
||||
LLTimer timer;
|
||||
while (timer.getElapsedTimeF32() < timeout)
|
||||
{
|
||||
if (mDone)
|
||||
{
|
||||
// std::cout << "NetworkIO::pump(" << timeout << "): breaking loop after "
|
||||
// << timer.getElapsedTimeF32() << " seconds\n";
|
||||
return true;
|
||||
}
|
||||
pumpOnce();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void pumpOnce()
|
||||
{
|
||||
gAres->process();
|
||||
mServicePump->pump();
|
||||
mServicePump->callback();
|
||||
}
|
||||
|
||||
bool done(const LLSD&)
|
||||
{
|
||||
mDone = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
LLPumpIO* mServicePump;
|
||||
bool mDone;
|
||||
};
|
||||
|
||||
#endif /* ! defined(LL_NETWORKIO_H) */
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
#!/usr/bin/python
|
||||
"""\
|
||||
@file test_llsdmessage_peer.py
|
||||
@author Nat Goodspeed
|
||||
@date 2008-10-09
|
||||
@brief This script asynchronously runs the executable (with args) specified on
|
||||
the command line, returning its result code. While that executable is
|
||||
running, we provide dummy local services for use by C++ tests.
|
||||
|
||||
$LicenseInfo:firstyear=2008&license=viewergpl$
|
||||
Copyright (c) 2008, Linden Research, Inc.
|
||||
$/LicenseInfo$
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
from threading import Thread
|
||||
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
|
||||
mydir = os.path.dirname(__file__) # expected to be .../indra/llmessage/tests/
|
||||
sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
|
||||
from indra.util.fastest_elementtree import parse as xml_parse
|
||||
from indra.base import llsd
|
||||
|
||||
def debug(*args):
|
||||
sys.stdout.writelines(args)
|
||||
sys.stdout.flush()
|
||||
# comment out the line below to enable debug output
|
||||
debug = lambda *args: None
|
||||
|
||||
class TestHTTPRequestHandler(BaseHTTPRequestHandler):
|
||||
"""This subclass of BaseHTTPRequestHandler is to receive and echo
|
||||
LLSD-flavored messages sent by the C++ LLHTTPClient.
|
||||
"""
|
||||
def read(self):
|
||||
# The following logic is adapted from the library module
|
||||
# SimpleXMLRPCServer.py.
|
||||
# Get arguments by reading body of request.
|
||||
# We read this in chunks to avoid straining
|
||||
# socket.read(); around the 10 or 15Mb mark, some platforms
|
||||
# begin to have problems (bug #792570).
|
||||
try:
|
||||
size_remaining = int(self.headers["content-length"])
|
||||
except (KeyError, ValueError):
|
||||
return ""
|
||||
max_chunk_size = 10*1024*1024
|
||||
L = []
|
||||
while size_remaining:
|
||||
chunk_size = min(size_remaining, max_chunk_size)
|
||||
chunk = self.rfile.read(chunk_size)
|
||||
L.append(chunk)
|
||||
size_remaining -= len(chunk)
|
||||
return ''.join(L)
|
||||
# end of swiped read() logic
|
||||
|
||||
def read_xml(self):
|
||||
# This approach reads the entire POST data into memory first
|
||||
return llsd.parse(self.read())
|
||||
## # This approach attempts to stream in the LLSD XML from self.rfile,
|
||||
## # assuming that the underlying XML parser reads its input file
|
||||
## # incrementally. Unfortunately I haven't been able to make it work.
|
||||
## tree = xml_parse(self.rfile)
|
||||
## debug("Finished raw parse\n")
|
||||
## debug("parsed XML tree %s\n" % tree)
|
||||
## debug("parsed root node %s\n" % tree.getroot())
|
||||
## debug("root node tag %s\n" % tree.getroot().tag)
|
||||
## return llsd.to_python(tree.getroot())
|
||||
|
||||
def do_GET(self):
|
||||
# Of course, don't attempt to read data.
|
||||
self.answer(dict(reply="success", status=500,
|
||||
reason="Your GET operation requested failure"))
|
||||
|
||||
def do_POST(self):
|
||||
# Read the provided POST data.
|
||||
self.answer(self.read_xml())
|
||||
|
||||
def answer(self, data):
|
||||
if "fail" not in self.path:
|
||||
response = llsd.format_xml(data.get("reply", llsd.LLSD("success")))
|
||||
self.send_response(200)
|
||||
self.send_header("Content-type", "application/llsd+xml")
|
||||
self.send_header("Content-Length", str(len(response)))
|
||||
self.end_headers()
|
||||
self.wfile.write(response)
|
||||
else: # fail requested
|
||||
status = data.get("status", 500)
|
||||
reason = data.get("reason",
|
||||
self.responses.get(status,
|
||||
("fail requested",
|
||||
"Your request specified failure status %s "
|
||||
"without providing a reason" % status))[1])
|
||||
self.send_error(status, reason)
|
||||
|
||||
def log_request(self, code, size=None):
|
||||
# For present purposes, we don't want the request splattered onto
|
||||
# stderr, as it would upset devs watching the test run
|
||||
pass
|
||||
|
||||
def log_error(self, format, *args):
|
||||
# Suppress error output as well
|
||||
pass
|
||||
|
||||
class TestHTTPServer(Thread):
|
||||
def run(self):
|
||||
httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler)
|
||||
debug("Starting HTTP server...\n")
|
||||
httpd.serve_forever()
|
||||
|
||||
def main(*args):
|
||||
# Start HTTP server thread. Note that this and all other comm server
|
||||
# threads should be daemon threads: we'll let them run "forever,"
|
||||
# confident that the whole process will terminate when the main thread
|
||||
# terminates, which will be when the test executable child process
|
||||
# terminates.
|
||||
httpThread = TestHTTPServer(name="httpd")
|
||||
httpThread.setDaemon(True)
|
||||
httpThread.start()
|
||||
# choice of os.spawnv():
|
||||
# - [v vs. l] pass a list of args vs. individual arguments,
|
||||
# - [no p] don't use the PATH because we specifically want to invoke the
|
||||
# executable passed as our first arg,
|
||||
# - [no e] child should inherit this process's environment.
|
||||
debug("Running %s...\n" % (" ".join(args)))
|
||||
sys.stdout.flush()
|
||||
rc = os.spawnv(os.P_WAIT, args[0], args)
|
||||
debug("%s returned %s\n" % (args[0], rc))
|
||||
return rc
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(*sys.argv[1:]))
|
||||
|
|
@ -284,10 +284,12 @@ extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
|
|||
#if LL_LINUX && defined(WINGDIAPI)
|
||||
// WINGDIAPI gets set if we are using the linux nvidia gl.h header which needs
|
||||
// the functions below setting up.
|
||||
# define LL_LINUX_NV_GL_HEADERS
|
||||
# define LL_LINUX_NV_GL_HEADERS 1
|
||||
#else
|
||||
# define LL_LINUX_NV_GL_HEADERS 0
|
||||
#endif // LL_LINUX && defined(WINGDIAPI)
|
||||
|
||||
#ifdef LL_LINUX_NV_GL_HEADERS
|
||||
#if LL_LINUX_NV_GL_HEADERS
|
||||
// Missing functions when using nvidia headers:
|
||||
extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
|
||||
extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
|
||||
|
|
|
|||
|
|
@ -124,9 +124,7 @@ bool LLWindowSDL::ll_try_gtk_init(void)
|
|||
if (!tried_gtk_init)
|
||||
{
|
||||
tried_gtk_init = TRUE;
|
||||
#if LL_GSTREAMER_ENABLED
|
||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
||||
#endif // LL_GSTREAMER_ENABLED
|
||||
maybe_lock_display();
|
||||
gtk_is_good = gtk_init_check(NULL, NULL);
|
||||
maybe_unlock_display();
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ Minimum requirements:
|
|||
* Computer Memory: 512MB (recommended: 768MB or more)
|
||||
* Linux Operating System: A reasonably modern 32-bit Linux environment
|
||||
is required. If you are running a 64-bit Linux distribution then
|
||||
you will need its 32-bit compatibility environment installed.
|
||||
you will need its 32-bit compatibility environment installed, but
|
||||
this configuration is not currently supported.
|
||||
* Video/Graphics Card:
|
||||
o nVidia GeForce 2, GeForce 4mx, or better (recommend one of the
|
||||
following: 6700, 6800, 7600, 7800, 7900, 8400, 8500, 8600,
|
||||
|
|
|
|||
|
|
@ -41,6 +41,17 @@
|
|||
## driver bug, try enabling this option and report whether it helps:
|
||||
#export LL_ATI_MOUSE_CURSOR_BUG=x
|
||||
|
||||
## - If you experience crashes with streaming video and music, you can
|
||||
## disable these by enabling this option:
|
||||
#export LL_DISABLE_GSTREAMER=x
|
||||
|
||||
## - GStreamer is automatically disabled - for now - on 64-bit systems due
|
||||
## to common fatal incompatibilities; remove/comment these lines if you want
|
||||
## to try anyway.
|
||||
if [ "`uname -m`" = "x86_64" ]; then
|
||||
export LL_DISABLE_GSTREAMER=x
|
||||
echo '64-bit Linux detected: Disabling GStreamer (streaming video and music) by default; edit ./secondlife to re-enable.'
|
||||
fi
|
||||
|
||||
## Everything below this line is just for advanced troubleshooters.
|
||||
##-------------------------------------------------------------------
|
||||
|
|
@ -117,7 +128,7 @@ if [ -n "$LL_RUN_ERR" ]; then
|
|||
LL_RUN_ERR_MSG=""
|
||||
if [ "$LL_RUN_ERR" = "runerr" ]; then
|
||||
# generic error running the binary
|
||||
echo '*** Unclean shutdown. ***'
|
||||
echo '*** Bad shutdown. ***'
|
||||
if [ "`uname -m`" = "x86_64" ]; then
|
||||
echo
|
||||
cat << EOFMARKER
|
||||
|
|
|
|||
|
|
@ -332,6 +332,12 @@ LLAppViewerLinux::~LLAppViewerLinux()
|
|||
|
||||
bool LLAppViewerLinux::init()
|
||||
{
|
||||
// g_thread_init() must be called before *any* use of glib, *and*
|
||||
// before any mutexes are held, *and* some of our third-party
|
||||
// libraries likes to use glib functions; in short, do this here
|
||||
// really early in app startup!
|
||||
if (!g_thread_supported ()) g_thread_init (NULL);
|
||||
|
||||
return LLAppViewer::init();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
#ifndef LL_LLTUT_H
|
||||
#define LL_LLTUT_H
|
||||
|
||||
#include "llmath.h"
|
||||
#include "is_approx_equal_fraction.h" // instead of llmath.h
|
||||
|
||||
#include <tut/tut.hpp>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue