libbase_la_SOURCES = \
application.cpp \
application.h \
+ asynctask.cpp \
asynctask.h \
component.cpp \
component.h \
--- /dev/null
+/******************************************************************************
+ * 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;
+}
\ No newline at end of file
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;
</ItemGroup>
<ItemGroup>
<ClCompile Include="application.cpp" />
+ <ClCompile Include="asynctask.cpp" />
<ClCompile Include="component.cpp" />
<ClCompile Include="configobject.cpp" />
<ClCompile Include="dictionary.cpp" />
<ClCompile Include="process.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
+ <ClCompile Include="asynctask.cpp">
+ <Filter>Quelldateien</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="application.h">
#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 */
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);
namespace icinga
{
-class I2_BASE_API Process : public AsyncTask<Process>
+class I2_BASE_API Process : public AsyncTask
{
public:
typedef shared_ptr<Process> Ptr;
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)
struct CheckTaskType;
-class I2_CIB_API CheckTask : public AsyncTask<CheckTask>
+class I2_CIB_API CheckTask : public AsyncTask
{
public:
typedef shared_ptr<CheckTask> Ptr;
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");
void CheckTimerHandler(void);
void ResultTimerHandler(void);
- void CheckCompletedHandler(const CheckTask::Ptr& task);
+ void CheckCompletedHandler(const AsyncTask::Ptr& task);
void AdjustCheckTimer(void);