Skip to content

Commit

Permalink
TMP Thread Pool Implementation
Browse files Browse the repository at this point in the history
Signed-off-by: jparisu <[email protected]>
  • Loading branch information
jparisu committed Sep 20, 2022
1 parent 9310b98 commit c8bfd93
Show file tree
Hide file tree
Showing 37 changed files with 2,030 additions and 595 deletions.
27 changes: 18 additions & 9 deletions ddsrouter_cmake/cmake/test/test_target.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,24 @@ function(add_test_executable TEST_EXECUTABLE_NAME TEST_SOURCES TEST_NAME TEST_LI

get_win32_path_dependencies(${TEST_EXECUTABLE_NAME} TEST_FRIENDLY_PATH)

foreach(test_name ${TEST_LIST})
add_test(NAME ${TEST_NAME}.${test_name}
COMMAND ${TEST_EXECUTABLE_NAME}
--gtest_filter=${TEST_NAME}.${test_name}:**/${TEST_NAME}.${test_name}/**)

if(TEST_FRIENDLY_PATH)
set_tests_properties(${TEST_NAME}.${test_name} PROPERTIES ENVIRONMENT "PATH=${TEST_FRIENDLY_PATH}")
endif(TEST_FRIENDLY_PATH)
endforeach()
if( TEST_LIST )
# If list of tests is not empty, add each test separatly
foreach(test_name ${TEST_LIST})
add_test(NAME ${TEST_NAME}.${test_name}
COMMAND ${TEST_EXECUTABLE_NAME}
--gtest_filter=${TEST_NAME}**.${test_name}:**/${TEST_NAME}**.${test_name}/**)

if(TEST_FRIENDLY_PATH)
set_tests_properties(${TEST_NAME}.${test_name} PROPERTIES ENVIRONMENT "PATH=${TEST_FRIENDLY_PATH}")
endif(TEST_FRIENDLY_PATH)
endforeach()
else()
# If no tests are provided, create a single test
message(STATUS "Creating general test ${TEST_NAME}.")
add_test(NAME ${TEST_NAME}
COMMAND ${TEST_EXECUTABLE_NAME})
endif( TEST_LIST )


target_compile_definitions(${TEST_EXECUTABLE_NAME}
PRIVATE FASTDDS_ENFORCE_LOG_INFO
Expand Down
100 changes: 100 additions & 0 deletions ddsrouter_utils/include/ddsrouter_utils/thread/_ThreadPool.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
// Copyright 2022 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
* @file SlotThreadPool.hpp
*
* This file contains class SlotThreadPool definition.
*/

#ifndef _DDSROUTERTHREAD__SRC_CPP_POOL_SLOTTHREADPOOL_HPP_
#define _DDSROUTERTHREAD__SRC_CPP_POOL_SLOTTHREADPOOL_HPP_

#include <functional>
#include <memory>

namespace eprosima {
namespace ddsrouter {
namespace utils {

class IThreadPool
{
public:
void execute(std::unique_ptr<ITask>&& task){}
};

class ITask
{
public:
void operator() () noexcept;
};

class BasicTask : ITask
{
public:
BasicTask(const std::function<void()>* callback_ptr){}
void operator() () noexcept;
};

class OwnedTask : ITask
{
public:
OwnedTask(const std::function<void()>& callback_){}
OwnedTask(std::function<void()>&& callback_){}
void operator() () noexcept;
};

template <typename ... Args>
class ConnectorOneShotArgs
{
public:
static void execute(const IThreadPool& tp, const std::function<void(Args...)>& callback, Args... args){}
static void execute(const IThreadPool& tp, std::function<void(Args...)>&& callback, Args... args){}
};
using ConnectorOneShot = ConnectorOneShotArgs<>;

template <typename ... Args>
class ConnectorSlotArgs
{
public:
ConnectorSlotArgs(const IThreadPool& tp, const std::function<void(Args...)>& callback){}
// ConnectorSlotArgs(const IThreadPool& tp, std::function<void<(Args...)>&& callback){}
void execute(Args...){}
};
using ConnectorSlot = ConnectorSlotArgs<>;

int main()
{
IThreadPool pool;

ConnectorOneShot::execute(pool, [](){ /* do something */ });
ConnectorOneShotArgs<int>::execute(pool, [](int x){ /* do something */ }, 3);
ConnectorOneShotArgs<std::string, bool>::execute(pool, [](std::string s, bool b){ /* do something */ }, std::string("hello"), true);

ConnectorSlot slot_connector(pool, [](){ /* do something */ });
slot_connector.execute();

ConnectorSlotArgs<int> slot_args(pool, [](int x){});
slot_args.execute(2);

ConnectorSlotArgs<std::string, bool> slot_args_2(pool, std::function<void(std::string, bool)>([](std::string s, bool b){}));
slot_args_2.execute(std::string("hello"), true);

}

} /* namespace utils */
} /* namespace ddsrouter */
} /* namespace eprosima */

#endif /* _DDSROUTERTHREAD__SRC_CPP_POOL_SLOTTHREADPOOL_HPP_ */
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright 2022 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
* @file OwnedTask.hpp
*
* This file contains class Task definition.
*/

#pragma once

#include <functional>

#include <ddsrouter_utils/thread/task/ITask.hpp>
#include <ddsrouter_utils/thread/manager/IManager.hpp>

namespace eprosima {
namespace ddsrouter {
namespace utils {
namespace thread {

template <typename ... Args>
class OneShotConnector
{
public:
static void execute(IManager* tp, const std::function<void(Args...)>& callback, Args... args);
static void execute(IManager* tp, std::function<void(Args...)>&& callback, Args... args);
};
using SimpleOneShotConnector = OneShotConnector<>;

} /* namespace thread */
} /* namespace utils */
} /* namespace ddsrouter */
} /* namespace eprosima */

// Include implementation template file
#include <ddsrouter_utils/thread/connector/impl/OneShotConnector.ipp>
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright 2022 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
* @file OwnedTask.hpp
*
* This file contains class Task definition.
*/

#ifndef _DDSROUTERTHREAD_TASK_TASK_HPP_
#define _DDSROUTERTHREAD_TASK_TASK_HPP_

#include <functional>

#include <ddsrouter_utils/thread/task/ITask.hpp>

namespace eprosima {
namespace ddsrouter {
namespace utils {
namespace thread {

template <typename ... Args>
class SlotConnector
{
public:
ConnectorSlotArgs(const IThreadPool& tp, const std::function<void(Args...)>& callback);
ConnectorSlotArgs(const IThreadPool& tp, std::function<void<(Args...)>&& callback);
void execute(Args...);
};
using SimpleSlotConnector = SlotConnector<>;

} /* namespace thread */
} /* namespace utils */
} /* namespace ddsrouter */
} /* namespace eprosima */

#endif /* _DDSROUTERTHREAD_TASK_TASK_HPP_ */
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Copyright 2022 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
* @file OneShotConnector.hpp
*
* This file contains class OneShotConnector implementation.
*/

#pragma once

#include <ddsrouter_utils/thread/task/ArgsOwnedTask.hpp>

namespace eprosima {
namespace ddsrouter {
namespace utils {
namespace thread {

template <typename ... Args>
void OneShotConnector<Args...>::execute(
IManager* tp,
const std::function<void(Args...)>& callback,
Args... args)
{
tp->execute(
std::make_unique<ArgsOwnedTask<Args...>>(
callback,
args...
)
);
}

template <typename ... Args>
void OneShotConnector<Args...>::execute(
IManager* tp,
std::function<void(Args...)>&& callback,
Args... args)
{
tp->execute(
std::make_unique<ArgsOwnedTask<Args...>>(
std::move(callback),
args...
)
);
}

} /* namespace thread */
} /* namespace event */
} /* namespace ddsrouter */
} /* namespace eprosima */
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright 2022 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
* @file AsyncManager.hpp
*
* This file contains class AsyncManager definition.
*/

#pragma once

#include <map>
#include <mutex>
#include <thread>
#include <vector>

#include <ddsrouter_utils/library/library_dll.h>
#include <ddsrouter_utils/thread/manager/IManager.hpp>
#include <ddsrouter_utils/thread/thread/CustomThread.hpp>
#include <ddsrouter_utils/types/Atomicable.hpp>

namespace eprosima {
namespace ddsrouter {
namespace utils {
namespace thread {

using TasksCollectionType =
Atomicable<
std::vector<
std::pair<
std::unique_ptr<CustomThread>,
std::unique_ptr<ITask>>>>;

/**
* TODO
*/
class AsyncManager : public IManager
{
public:

AsyncManager() = default;

~AsyncManager();

virtual void execute(std::unique_ptr<ITask>&& task) override;

void clean_threads();

protected:

TasksCollectionType tasks_running_;
};

} /* namespace thread */
} /* namespace utils */
} /* namespace ddsrouter */
} /* namespace eprosima */
Loading

0 comments on commit c8bfd93

Please sign in to comment.