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>
39 #include <dpl/exception.h>
41 #include "generic-event.h"
47 typedef std::function<void(void)> EventDescription;
54 : m_state(State::NoThread)
59 assert(m_state == State::NoThread);
60 m_thread = std::thread(ThreadLoopStatic, this);
61 m_state = State::Work;
65 assert(m_state != State::NoThread);
67 std::lock_guard<std::mutex> lock(m_eventQueueMutex);
69 m_waitCondition.notify_one();
72 m_state = State::NoThread;
75 virtual ~ServiceThread()
77 assert((m_state == State::NoThread) && "Thread was not stopped before ServiceThread destruction!");
82 * This function is always called from ThreadService::ThreadEvent where fun
83 * is created as a temporary object and therefore will not be copied.
85 void CreateEvent(std::function<void(void)> fun)
87 EventDescription description;
88 description = std::move(fun);
90 std::lock_guard<std::mutex> lock(m_eventQueueMutex);
91 m_eventQueue.push(description);
93 m_waitCondition.notify_one();
96 static void ThreadLoopStatic(ServiceThread *ptr) {
102 EventDescription description;
104 std::unique_lock<std::mutex> ulock(m_eventQueueMutex);
107 if (!m_eventQueue.empty()) {
108 description = m_eventQueue.front();
111 m_waitCondition.wait(ulock);
116 UNHANDLED_EXCEPTION_HANDLER_BEGIN
120 UNHANDLED_EXCEPTION_HANDLER_END
125 std::thread m_thread;
126 std::mutex m_eventQueueMutex;
127 std::queue<EventDescription> m_eventQueue;
128 std::condition_variable m_waitCondition;
136 #endif // _CENT_KEY_SERVICE_THREAD_