From: <axl...@us...> - 2008-12-13 00:11:14
|
Revision: 70 http://hgengine.svn.sourceforge.net/hgengine/?rev=70&view=rev Author: axlecrusher Date: 2008-12-13 00:11:10 +0000 (Sat, 13 Dec 2008) Log Message: ----------- experimental threaded updater Added Paths: ----------- Mercury2/src/UpdateThreader.cpp Mercury2/src/UpdateThreader.h Added: Mercury2/src/UpdateThreader.cpp =================================================================== --- Mercury2/src/UpdateThreader.cpp (rev 0) +++ Mercury2/src/UpdateThreader.cpp 2008-12-13 00:11:10 UTC (rev 70) @@ -0,0 +1,87 @@ +#include <UpdateThreader.h> + +void* UpdateThreader::ThreadClbk(void*) +{ + UpdateThreader& ut = UpdateThreader::GetInstance(); + while ( ut.HasWork() ) + { + MercuryNode* n = ut.GetWorkNode(); + n->ThreadedUpdate(0.01f); + } + return NULL; +} + +UpdateThreader& UpdateThreader::GetInstance() +{ + static UpdateThreader* instance = NULL; + if (!instance) + instance = new UpdateThreader; + return *instance; + +} + +bool UpdateThreader::AddNode(MercuryNode* node) +{ + AutoMutexLock lock( m_mutex ); + m_nodes.push( node ); + return true; +} + +void UpdateThreader::DoWork() +{ + MercuryThread thread1,thread2; + thread1.HaltOnDestroy(false); + thread2.HaltOnDestroy(false); + thread1.Create( ThreadClbk, NULL, false ); + thread2.Create( ThreadClbk, NULL, false ); + thread1.Wait(); + thread2.Wait(); +} + +bool UpdateThreader::HasWork() +{ + AutoMutexLock lock(m_mutex); + return !m_nodes.empty(); +} + +MercuryNode* UpdateThreader::GetWorkNode() +{ + MercuryNode* n = NULL; + AutoMutexLock lock(m_mutex); + n = m_nodes.front(); + m_nodes.pop(); + return n; +} + + +/**************************************************************************** + * Copyright (C) 2008 by Joshua Allen * + * * + * * + * All rights reserved. * + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * Redistributions of source code must retain the above copyright * + * notice, this list of conditions and the following disclaimer. * + * * Redistributions in binary form must reproduce the above * + * copyright notice, this list of conditions and the following * + * disclaimer in the documentation and/or other materials provided * + * with the distribution. * + * * Neither the name of the Mercury Engine nor the names of its * + * contributors may be used to endorse or promote products derived * + * from this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + ***************************************************************************/ Added: Mercury2/src/UpdateThreader.h =================================================================== --- Mercury2/src/UpdateThreader.h (rev 0) +++ Mercury2/src/UpdateThreader.h 2008-12-13 00:11:10 UTC (rev 70) @@ -0,0 +1,64 @@ +#ifndef UPDATETHREADER_H +#define UPDATETHREADER_H + +#include <queue> +#include <MQueue.h> +#include <MercuryNode.h> +#include <MercuryThreads.h> + +//XXX EXPERIMENTAL +class UpdateThreader +{ + public: + static UpdateThreader& GetInstance(); + + bool AddNode(MercuryNode* node); + void DoWork(); + + MercuryMutex m_mutex; + + private: + static void* ThreadClbk(void*); + + bool HasWork(); + MercuryNode* GetWorkNode(); + + std::queue< MercuryNode* > m_nodes; +// MQueue< MercuryNode* > m_nodes; +}; + +static InstanceCounter<UpdateThreader> UTcounter("UpdateThreader"); + + +#endif +/**************************************************************************** + * Copyright (C) 2008 by Joshua Allen * + * * + * * + * All rights reserved. * + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * Redistributions of source code must retain the above copyright * + * notice, this list of conditions and the following disclaimer. * + * * Redistributions in binary form must reproduce the above * + * copyright notice, this list of conditions and the following * + * disclaimer in the documentation and/or other materials provided * + * with the distribution. * + * * Neither the name of the Mercury Engine nor the names of its * + * contributors may be used to endorse or promote products derived * + * from this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + ***************************************************************************/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |