diff options
Diffstat (limited to 'indra/llcommon')
| -rwxr-xr-x | indra/llcommon/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llcommon/llcallbacklist.cpp | 230 | ||||
| -rw-r--r-- | indra/llcommon/llcallbacklist.h | 79 | ||||
| -rwxr-xr-x | indra/llcommon/llmemory.h | 7 | ||||
| -rw-r--r-- | indra/llcommon/llmutex.h | 4 | ||||
| -rwxr-xr-x | indra/llcommon/llstl.h | 4 | 
6 files changed, 322 insertions, 4 deletions
| diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 1459b9ada2..5863310162 100755 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -37,6 +37,7 @@ set(llcommon_SOURCE_FILES      llbase32.cpp      llbase64.cpp      llbitpack.cpp +    llcallbacklist.cpp      llcommon.cpp      llcommonutils.cpp      llcoros.cpp @@ -129,6 +130,7 @@ set(llcommon_HEADER_FILES      llbase64.h      llbitpack.h      llboost.h +    llcallbacklist.h      llcommon.h      llcommonutils.h      llcoros.h diff --git a/indra/llcommon/llcallbacklist.cpp b/indra/llcommon/llcallbacklist.cpp new file mode 100644 index 0000000000..541ff75ee4 --- /dev/null +++ b/indra/llcommon/llcallbacklist.cpp @@ -0,0 +1,230 @@ +/**  + * @file llcallbacklist.cpp + * @brief A simple list of callback functions to call. + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llcallbacklist.h" +#include "lleventtimer.h" +#include "llerrorlegacy.h" + +// Globals +// +LLCallbackList gIdleCallbacks; + +// +// Member functions +// + +LLCallbackList::LLCallbackList() +{ +	// nothing +} + +LLCallbackList::~LLCallbackList() +{ +} + + +void LLCallbackList::addFunction( callback_t func, void *data) +{ +	if (!func) +	{ +		return; +	} + +	// only add one callback per func/data pair +	// +	if (containsFunction(func)) +	{ +		return; +	} +	 +	callback_pair_t t(func, data); +	mCallbackList.push_back(t); +} + +bool LLCallbackList::containsFunction( callback_t func, void *data) +{ +	callback_pair_t t(func, data); +	callback_list_t::iterator iter = find(func,data); +	if (iter != mCallbackList.end()) +	{ +		return TRUE; +	} +	else +	{ +		return FALSE; +	} +} + + +bool LLCallbackList::deleteFunction( callback_t func, void *data) +{ +	callback_list_t::iterator iter = find(func,data); +	if (iter != mCallbackList.end()) +	{ +		mCallbackList.erase(iter); +		return TRUE; +	} +	else +	{ +		return FALSE; +	} +} + +inline  +LLCallbackList::callback_list_t::iterator +LLCallbackList::find(callback_t func, void *data) +{ +	callback_pair_t t(func, data); +	return std::find(mCallbackList.begin(), mCallbackList.end(), t); +} + +void LLCallbackList::deleteAllFunctions() +{ +	mCallbackList.clear(); +} + + +void LLCallbackList::callFunctions() +{ +	for (callback_list_t::iterator iter = mCallbackList.begin(); iter != mCallbackList.end();  ) +	{ +		callback_list_t::iterator curiter = iter++; +		curiter->first(curiter->second); +	} +} + +// Shim class to allow arbitrary boost::bind +// expressions to be run as one-time idle callbacks. +class OnIdleCallbackOneTime +{ +public: +	OnIdleCallbackOneTime(nullary_func_t callable): +		mCallable(callable) +	{ +	} +	static void onIdle(void *data) +	{ +		gIdleCallbacks.deleteFunction(onIdle, data); +		OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data); +		self->call(); +		delete self; +	} +	void call() +	{ +		mCallable(); +	} +private: +	nullary_func_t mCallable; +}; + +void doOnIdleOneTime(nullary_func_t callable) +{ +	OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable); +	gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor); +} + +// Shim class to allow generic boost functions to be run as +// recurring idle callbacks.  Callable should return true when done, +// false to continue getting called. +class OnIdleCallbackRepeating +{ +public: +	OnIdleCallbackRepeating(bool_func_t callable): +		mCallable(callable) +	{ +	} +	// Will keep getting called until the callable returns true. +	static void onIdle(void *data) +	{ +		OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data); +		bool done = self->call(); +		if (done) +		{ +			gIdleCallbacks.deleteFunction(onIdle, data); +			delete self; +		} +	} +	bool call() +	{ +		return mCallable(); +	} +private: +	bool_func_t mCallable; +}; + +void doOnIdleRepeating(bool_func_t callable) +{ +	OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable); +	gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor); +} + +class NullaryFuncEventTimer: public LLEventTimer +{ +public: +	NullaryFuncEventTimer(nullary_func_t callable, F32 seconds): +		LLEventTimer(seconds), +		mCallable(callable) +	{ +	} + +private: +	BOOL tick() +	{ +		mCallable(); +		return TRUE; +	} + +	nullary_func_t mCallable; +}; + +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds) +{ +	new NullaryFuncEventTimer(callable, seconds); +} + +class BoolFuncEventTimer: public LLEventTimer +{ +public: +	BoolFuncEventTimer(bool_func_t callable, F32 seconds): +		LLEventTimer(seconds), +		mCallable(callable) +	{ +	} +private: +	BOOL tick() +	{ +		return mCallable(); +	} + +	bool_func_t mCallable; +}; + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds) +{ +	new BoolFuncEventTimer(callable, seconds); +} diff --git a/indra/llcommon/llcallbacklist.h b/indra/llcommon/llcallbacklist.h new file mode 100644 index 0000000000..89716cd74c --- /dev/null +++ b/indra/llcommon/llcallbacklist.h @@ -0,0 +1,79 @@ +/**  + * @file llcallbacklist.h + * @brief A simple list of callback functions to call. + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLCALLBACKLIST_H +#define LL_LLCALLBACKLIST_H + +#include "llstl.h" +#include <boost/function.hpp> +#include <list> + +class LLCallbackList +{ +public: +	typedef void (*callback_t)(void*); + +	typedef std::pair< callback_t,void* >	callback_pair_t; +	// NOTE: It is confirmed that we DEPEND on the order provided by using a list :( +	// +	typedef std::list< callback_pair_t >	callback_list_t;  +	 +	LLCallbackList(); +	~LLCallbackList(); + +	void addFunction( callback_t func, void *data = NULL );			// register a callback, which will be called as func(data) +	bool containsFunction( callback_t func, void *data = NULL );	// true if list already contains the function/data pair +	bool deleteFunction( callback_t func, void *data = NULL );		// removes the first instance of this function/data pair from the list, false if not found +	void callFunctions();														// calls all functions +	void deleteAllFunctions(); + +	static void test(); + +protected: + +	inline callback_list_t::iterator find(callback_t func, void *data); + +	callback_list_t	mCallbackList; +}; + +typedef boost::function<void ()> nullary_func_t; +typedef boost::function<bool ()> bool_func_t; + +// Call a given callable once in idle loop. +void doOnIdleOneTime(nullary_func_t callable); + +// Repeatedly call a callable in idle loop until it returns true. +void doOnIdleRepeating(bool_func_t callable); + +// Call a given callable once after specified interval. +void doAfterInterval(nullary_func_t callable, F32 seconds); + +// Call a given callable every specified number of seconds, until it returns true. +void doPeriodically(bool_func_t callable, F32 seconds); + +extern LLCallbackList gIdleCallbacks; + +#endif diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index c4c9cc0566..d3a9bbc4ae 100755 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -28,6 +28,7 @@  #include "linden_common.h"  #include "llunits.h" +#include "stdtypes.h"  #if !LL_WINDOWS  #include <stdint.h>  #endif @@ -59,7 +60,7 @@ class LLMutex ;  LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment);  #ifdef SHOW_ASSERT -#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(reinterpret_cast<uintptr_t>(ptr),((U32)alignment)) +#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(uintptr_t(ptr),((U32)alignment))  #else  #define ll_assert_aligned(ptr,alignment)  #endif @@ -69,13 +70,13 @@ LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment);  template <typename T> T* LL_NEXT_ALIGNED_ADDRESS(T* address)   {   	return reinterpret_cast<T*>( -		(reinterpret_cast<uintptr_t>(address) + 0xF) & ~0xF); +		(uintptr_t(address) + 0xF) & ~0xF);  }  template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)   {   	return reinterpret_cast<T*>( -		(reinterpret_cast<uintptr_t>(address) + 0x3F) & ~0x3F); +		(uintptr_t(address) + 0x3F) & ~0x3F);  }  #if LL_LINUX || LL_DARWIN diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h index 3659a319a2..ea535cee86 100644 --- a/indra/llcommon/llmutex.h +++ b/indra/llcommon/llmutex.h @@ -33,6 +33,10 @@  #define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO) +#if MUTEX_DEBUG +#include <map> +#endif +  struct apr_thread_mutex_t;  struct apr_pool_t;  struct apr_thread_cond_t; diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h index 02f10fa2ba..0435cb8a08 100755 --- a/indra/llcommon/llstl.h +++ b/indra/llcommon/llstl.h @@ -27,6 +27,7 @@  #ifndef LL_LLSTL_H  #define LL_LLSTL_H +#include "stdtypes.h"  #include <functional>  #include <algorithm>  #include <map> @@ -272,6 +273,7 @@ inline T get_if_there(const std::map<K,T>& inmap, const K& key, T default_value)  	}  }; +// Useful for replacing the removeObj() functionality of LLDynamicArray  // Example:  //  for (std::vector<T>::iterator iter = mList.begin(); iter != mList.end(); )  //  { @@ -530,7 +532,7 @@ bool before(const std::type_info* lhs, const std::type_info* rhs)      return strcmp(lhs->name(), rhs->name()) < 0;  #else  // not Linux, or gcc 4.4+      // Just use before(), as we normally would -    return lhs->before(*rhs); +    return lhs->before(*rhs) ? true : false;  #endif  } | 
