Cleaned up AsyncTask class.

This commit is contained in:
Gunnar Beutner 2012-07-14 13:57:20 +02:00
parent 656825701d
commit 6cbccdc91c
12 changed files with 72 additions and 35 deletions

View File

@ -7,6 +7,7 @@ pkglib_LTLIBRARIES = \
libbase_la_SOURCES = \
application.cpp \
application.h \
asynctask.cpp \
asynctask.h \
component.cpp \
component.h \

50
base/asynctask.cpp Normal file
View File

@ -0,0 +1,50 @@
/******************************************************************************
* Icinga 2 *
* Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software Foundation *
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
******************************************************************************/
#include "i2-base.h"
using namespace icinga;
AsyncTask::AsyncTask(const AsyncTask::CompletionCallback& completionCallback)
: m_Finished(false), m_CompletionCallback(completionCallback)
{ }
AsyncTask::~AsyncTask(void)
{
assert(m_Finished);
}
void AsyncTask::Start(void)
{
assert(Application::IsMainThread());
Run();
}
void AsyncTask::Finish(void)
{
Event::Post(boost::bind(&AsyncTask::ForwardCallback, static_cast<AsyncTask::Ptr>(GetSelf())));
}
void AsyncTask::ForwardCallback(void)
{
m_CompletionCallback(GetSelf());
m_CompletionCallback = CompletionCallback();
m_Finished = true;
}

View File

@ -23,46 +23,26 @@
namespace icinga
{
template<typename T>
class AsyncTask : public Object
class I2_BASE_API AsyncTask : public Object
{
public:
typedef shared_ptr<AsyncTask<T> > Ptr;
typedef weak_ptr<AsyncTask<T> > WeakPtr;
typedef shared_ptr<AsyncTask> Ptr;
typedef weak_ptr<AsyncTask> WeakPtr;
typedef function<void (const shared_ptr<T>&)> CompletionCallback;
typedef function<void (const AsyncTask::Ptr&)> CompletionCallback;
AsyncTask(const CompletionCallback& completionCallback)
: m_Finished(false), m_CompletionCallback(completionCallback)
{ }
AsyncTask(const CompletionCallback& completionCallback);
~AsyncTask(void);
~AsyncTask(void)
{
assert(m_Finished);
}
void Start(void)
{
assert(Application::IsMainThread());
Run();
}
void Start(void);
protected:
virtual void Run(void) = 0;
void Finish(void)
{
Event::Post(boost::bind(&T::ForwardCallback, static_cast<shared_ptr<T> >(GetSelf())));
}
void Finish(void);
private:
void ForwardCallback(void)
{
m_CompletionCallback(GetSelf());
m_CompletionCallback = CompletionCallback();
m_Finished = true;
}
void ForwardCallback(void);
bool m_Finished;
CompletionCallback m_CompletionCallback;

View File

@ -12,6 +12,7 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="application.cpp" />
<ClCompile Include="asynctask.cpp" />
<ClCompile Include="component.cpp" />
<ClCompile Include="configobject.cpp" />
<ClCompile Include="dictionary.cpp" />

View File

@ -79,6 +79,9 @@
<ClCompile Include="process.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
<ClCompile Include="asynctask.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="application.h">

View File

@ -55,6 +55,7 @@
#ifdef _MSC_VER
# pragma warning(disable:4251)
# pragma warning(disable:4275)
# pragma warning(disable:4345)
# define _CRT_SECURE_NO_DEPRECATE
# define _CRT_SECURE_NO_WARNINGS
#else /* _MSC_VER */

View File

@ -31,7 +31,7 @@ deque<Process::Ptr> Process::m_Tasks;
condition_variable Process::m_TasksCV;
Process::Process(const string& command, const CompletionCallback& completionCallback)
: AsyncTask<Process>(completionCallback), m_Command(command), m_UsePopen(false)
: AsyncTask(completionCallback), m_Command(command), m_UsePopen(false)
{
if (!m_ThreadCreated) {
thread t(&Process::WorkerThreadProc);

View File

@ -23,7 +23,7 @@
namespace icinga
{
class I2_BASE_API Process : public AsyncTask<Process>
class I2_BASE_API Process : public AsyncTask
{
public:
typedef shared_ptr<Process> Ptr;

View File

@ -24,7 +24,7 @@ using namespace icinga;
map<string, CheckTaskType> CheckTask::m_Types;
CheckTask::CheckTask(const Service& service, const CompletionCallback& completionCallback)
: AsyncTask<CheckTask>(completionCallback), m_Service(service)
: AsyncTask(completionCallback), m_Service(service)
{ }
Service& CheckTask::GetService(void)

View File

@ -25,7 +25,7 @@ namespace icinga
struct CheckTaskType;
class I2_CIB_API CheckTask : public AsyncTask<CheckTask>
class I2_CIB_API CheckTask : public AsyncTask
{
public:
typedef shared_ptr<CheckTask> Ptr;

View File

@ -93,8 +93,9 @@ void CheckerComponent::CheckTimerHandler(void)
Logger::Write(LogInformation, "checker", msgbuf.str());
}
void CheckerComponent::CheckCompletedHandler(const CheckTask::Ptr& task)
void CheckerComponent::CheckCompletedHandler(const AsyncTask::Ptr& atask)
{
CheckTask::Ptr task = static_pointer_cast<CheckTask>(atask);
Service service = task->GetService();
service.RemoveTag("current_task");

View File

@ -60,7 +60,7 @@ private:
void CheckTimerHandler(void);
void ResultTimerHandler(void);
void CheckCompletedHandler(const CheckTask::Ptr& task);
void CheckCompletedHandler(const AsyncTask::Ptr& task);
void AdjustCheckTimer(void);