123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #include <sys/prctl.h>
- #include <LocThread.h>
- #include <string.h>
- #include <string>
- #include <thread>
- #include <loc_pla.h>
- using std::weak_ptr;
- using std::shared_ptr;
- using std::thread;
- using std::string;
- namespace loc_util {
- class LocThreadDelegate {
- static const char defaultThreadName[];
- weak_ptr<LocRunnable> mRunnable;
- thread mThread;
- LocThreadDelegate(const string tName, shared_ptr<LocRunnable> r);
- public:
- ~LocThreadDelegate() {
- shared_ptr<LocRunnable> runnable = mRunnable.lock();
- if (nullptr != runnable) {
- runnable->interrupt();
- }
- }
- inline static LocThreadDelegate* create(const char* tName, shared_ptr<LocRunnable> runnable);
- };
- const char LocThreadDelegate::defaultThreadName[] = "LocThread";
- LocThreadDelegate* LocThreadDelegate::create(const char* tName, shared_ptr<LocRunnable> runnable) {
- LocThreadDelegate* threadDelegate = nullptr;
- if (nullptr != runnable) {
- if (!tName) {
- tName = defaultThreadName;
- }
- char lname[16];
- auto nameSize = strlen(tName) + 1;
- int len = std::min(sizeof(lname), nameSize) - 1;
- memcpy(lname, tName, len);
- lname[len] = 0;
- threadDelegate = new LocThreadDelegate(lname, runnable);
- }
- return threadDelegate;
- }
- LocThreadDelegate::LocThreadDelegate(const string tName, shared_ptr<LocRunnable> runnable) :
- mRunnable(runnable),
- mThread([tName, runnable] {
- prctl(PR_SET_NAME, tName.c_str(), 0, 0, 0);
- runnable->prerun();
- while (runnable->run());
- runnable->postrun();
- }) {
- mThread.detach();
- }
- bool LocThread::start(const char* tName, shared_ptr<LocRunnable> runnable) {
- bool success = false;
- if (!mThread) {
- mThread = LocThreadDelegate::create(tName, runnable);
-
- success = (NULL != mThread);
- }
- return success;
- }
- void LocThread::stop() {
- if (nullptr != mThread) {
- delete mThread;
- mThread = nullptr;
- }
- }
- }
|