2 * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Bumjin Im <bj.im@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
19 * @file service-thread.h
20 * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
21 * @author Zofia Abramowska (z.abramowska@samsung.com)
23 * @brief Implementation of threads.
26 #ifndef _CENT_KEY_SERVICE_THREAD_
27 #define _CENT_KEY_SERVICE_THREAD_
35 #include <condition_variable>
37 #include <crypto-init.h>
41 #include <dpl/exception.h>
43 #include "generic-event.h"
49 typedef std::function<void(void)> EventDescription;
55 ServiceThread() : m_state(State::NoThread), m_quit(false) {}
59 assert(m_state == State::NoThread);
60 m_thread = std::thread(ThreadLoopStatic, this);
61 m_state = State::Work;
66 assert(m_state != State::NoThread);
69 std::lock_guard<std::mutex> lock(this->m_eventQueueMutex);
71 m_waitCondition.notify_one();
75 m_state = State::NoThread;
78 virtual ~ServiceThread()
80 assert((m_state == State::NoThread) &&
81 "Thread was not stopped before ServiceThread destruction!");
86 * This function is always called from ThreadService::ThreadEvent where fun
87 * is created as a temporary object and therefore will not be copied.
89 void CreateEvent(std::function<void(void)> fun)
91 EventDescription description;
92 description = std::move(fun);
95 std::lock_guard<std::mutex> lock(this->m_eventQueueMutex);
96 m_eventQueue.push(description);
99 m_waitCondition.notify_one();
102 static void ThreadLoopStatic(ServiceThread *ptr)
106 // cleanup openssl in every thread
107 deinitOpenSslThread();
113 EventDescription description;
116 std::unique_lock<std::mutex> ulock(m_eventQueueMutex);
121 if (!m_eventQueue.empty()) {
122 description = m_eventQueue.front();
125 m_waitCondition.wait(ulock);
134 UNHANDLED_EXCEPTION_HANDLER_END
139 std::thread m_thread;
140 std::mutex m_eventQueueMutex;
141 std::queue<EventDescription> m_eventQueue;
142 std::condition_variable m_waitCondition;
150 #endif // _CENT_KEY_SERVICE_THREAD_