Skip to content

Commit

Permalink
make multi-thread scheduler an action
Browse files Browse the repository at this point in the history
  • Loading branch information
godsme committed Jul 4, 2020
1 parent 54e93f5 commit fb0ab4a
Show file tree
Hide file tree
Showing 8 changed files with 297 additions and 206 deletions.
6 changes: 3 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ add_library(trans-dsl-2 STATIC
src/sched/action/SchedJoin.cpp include/trans-dsl/sched/domain/MultiThreadContext.h
include/trans-dsl/sched/domain/ThreadDoneMsg.h include/trans-dsl/sched/action/SchedFork.h
src/sched/action/SchedFork.cpp include/trans-dsl/sched/helper/ForkHelper.h
include/trans-dsl/utils/AssertionHelper.h include/trans-dsl/sched/action/MultiThreadScheduler.h
src/sched/action/MultiThreadScheduler.cpp include/trans-dsl/utils/ThreadActionTrait.h include/cub/base/BitSet.h)
include/trans-dsl/utils/AssertionHelper.h include/trans-dsl/sched/action/SchedMultiThreadAction.h
src/sched/action/SchedMultiThreadAction.cpp include/trans-dsl/utils/ThreadActionTrait.h include/cub/base/BitSet.h include/trans-dsl/sched/action/Transaction.h include/trans-dsl/sched/helper/TransactionHelper.h include/trans-dsl/sched/helper/MultiThreadHelper.h)

add_executable(trans-dsl-test
tests/ut/TestLoop.cpp
Expand All @@ -103,7 +103,7 @@ add_executable(trans-dsl-test-catch
tests/ut/TestConcurrent.cpp
tests/ut/TestSimpleAsyncAction.cpp
tests/ut/TestTimerGuard.cpp
tests/ut/TestMultiThreadScheduler.cpp
tests/ut/TestMultiThread.cpp
tests/pt/catch.cpp)

target_link_libraries(trans-dsl-test-catch trans-dsl-2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@
// Created by Darwin Yuan on 2020/7/2.
//

#ifndef TRANS_DSL_2_MULTITHREADSCHEDULER_H
#define TRANS_DSL_2_MULTITHREADSCHEDULER_H
#ifndef TRANS_DSL_2_SCHEDMULTITHREADACTION_H
#define TRANS_DSL_2_SCHEDMULTITHREADACTION_H

#include <trans-dsl/tsl_ns.h>
#include <trans-dsl/sched/domain/MultiThreadContext.h>
#include <cstddef>
#include <trans-dsl/sched/domain/Event.h>
#include <trans-dsl/utils/ThreadActionTrait.h>


TSL_NS_BEGIN

struct TransactionContext;

// 80 byte
struct MultiThreadScheduler : private MultiThreadContext {
struct SchedMultiThreadAction : private MultiThreadContext {

auto handleEvent(TransactionContext&, Event const&) -> Status;
auto stop(TransactionContext&, Status) -> Status;
Expand Down Expand Up @@ -53,7 +53,7 @@ struct MultiThreadScheduler : private MultiThreadContext {
};
Threads threads;
ThreadBitMap joinBitMaps[ThreadBitMap::max]{};
ThreadBitMap forkBitMap{};
ThreadBitMap forkedBitMap{};
ThreadBitMap newDone{};
State state = State::INIT;
uint8_t alive{};
Expand All @@ -70,32 +70,7 @@ struct MultiThreadScheduler : private MultiThreadContext {
ABSTRACT(getThreads() -> Threads);
};

template<typename MAIN_ACTION>
struct GenericMultiThreadScheduler : MultiThreadScheduler {
auto start(TransactionContext& context) -> Status {
return MultiThreadScheduler::start(context, mainThreadAction);
}

private:
OVERRIDE(createThread(ThreadId tid) -> SchedAction*) {
return threadCreator.createThreadAction(tid);
}

OVERRIDE(getMaxThreads() const -> uint8_t) {
return MAX_NUM_OF_THREADS;
}

OVERRIDE(getThreads() -> Threads) {
return threads;
}

enum : uint8_t { MAX_NUM_OF_THREADS = details::FinalThreadCreator<MAIN_ACTION>::threadId + 1 };
static_assert(MAX_NUM_OF_THREADS <= ThreadBitMap::max, "the specified tid is out of scope");
SchedAction* threads[MAX_NUM_OF_THREADS]{};
MAIN_ACTION mainThreadAction;
details::FinalThreadCreator<MAIN_ACTION> threadCreator;
};

TSL_NS_END

#endif //TRANS_DSL_2_MULTITHREADSCHEDULER_H
#endif //TRANS_DSL_2_SCHEDMULTITHREADACTION_H
50 changes: 50 additions & 0 deletions include/trans-dsl/sched/action/Transaction.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//
// Created by Darwin Yuan on 2020/7/4.
//

#ifndef TRANS_DSL_2_TRANSACTION_H
#define TRANS_DSL_2_TRANSACTION_H

#include <trans-dsl/tsl_ns.h>
#include <trans-dsl/sched/domain/MultiThreadContext.h>
#include <trans-dsl/sched/domain/TransactionContext.h>
#include <cstddef>
#include <trans-dsl/sched/domain/Event.h>
#include <trans-dsl/utils/ThreadActionTrait.h>

TSL_NS_BEGIN

template<typename SCHED>
struct Transaction : private TransactionContext, private SCHED {
using TransactionContext::updateInstanceId;
using TransactionContext::updateUserContext;
using TransactionContext::updateTimerInfo;
using TransactionContext::updateListener;

auto start() -> Status {
return SCHED::start(*this);
}

auto startWithEvent(Event const& event) -> Status {
Status status = SCHED::start(*this);
if(status == Result::CONTINUE) {
return SCHED::handleEvent(*this, event);
}
}

auto handleEvent(Event const& event) -> Status {
return SCHED::handleEvent(*this, event);
}

auto stop(Status cause) -> Status {
return SCHED::stop(*this, cause);
}

auto kill(Status cause) -> void {
SCHED::kill(*this, cause);
}
};

TSL_NS_END

#endif //TRANS_DSL_2_TRANSACTION_H
46 changes: 46 additions & 0 deletions include/trans-dsl/sched/helper/MultiThreadHelper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// Created by Darwin Yuan on 2020/7/4.
//

#ifndef TRANS_DSL_2_MULTITHREADHELPER_H
#define TRANS_DSL_2_MULTITHREADHELPER_H

#include <trans-dsl/tsl_ns.h>
#include <trans-dsl/sched/action/SchedMultiThreadAction.h>
#include <trans-dsl/utils/ThreadActionTrait.h>

TSL_NS_BEGIN

namespace details {
template<typename MAIN_ACTION>
struct MultiThread : SchedMultiThreadAction {
auto start(TransactionContext& context) -> Status {
return SchedMultiThreadAction::start(context, mainThreadAction);
}

private:
OVERRIDE(createThread(ThreadId tid) -> SchedAction*) {
return threadCreator.createThreadAction(tid);
}

OVERRIDE(getMaxThreads() const -> uint8_t) {
return MAX_NUM_OF_THREADS;
}

OVERRIDE(getThreads() -> Threads) {
return threads;
}

enum : uint8_t { MAX_NUM_OF_THREADS = details::FinalThreadCreator<MAIN_ACTION>::threadId + 1 };
static_assert(MAX_NUM_OF_THREADS <= ThreadBitMap::max, "the specified tid is out of scope");
SchedAction* threads[MAX_NUM_OF_THREADS]{};
MAIN_ACTION mainThreadAction;
details::FinalThreadCreator<MAIN_ACTION> threadCreator;
};
}

TSL_NS_END

#define __multi_thread(...) TSL_NS::details::MultiThread<__VA_ARGS__>

#endif //TRANS_DSL_2_MULTITHREADHELPER_H
14 changes: 14 additions & 0 deletions include/trans-dsl/sched/helper/TransactionHelper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// Created by Darwin Yuan on 2020/7/4.
//

#ifndef TRANS_DSL_2_TRANSACTIONHELPER_H
#define TRANS_DSL_2_TRANSACTIONHELPER_H

#include <trans-dsl/sched/action/Transaction.h>
#include <trans-dsl/sched/action/SchedMultiThreadAction.h>

#define __transaction(...) TSL_NS::Transaction<__VA_ARGS__>
#define __mt_transaction(...) __transaction(GenericMultiThreadScheduler<__VA_ARGS__>)

#endif //TRANS_DSL_2_TRANSACTIONHELPER_H
1 change: 1 addition & 0 deletions include/trans-dsl/trans-dsl.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@
#include <trans-dsl/sched/helper/FragmentHelper.h>
#include <trans-dsl/sched/helper/ForkHelper.h>
#include <trans-dsl/sched/helper/JoinHelper.h>
#include <trans-dsl/sched/helper/MultiThreadHelper.h>

#endif //TRANS_DSL_2_TRANS_DSL_H
Loading

0 comments on commit fb0ab4a

Please sign in to comment.