2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
20 * @brief This file is the implementation file of once tests
24 #include <dpl/test/test_runner.h>
26 #include <dpl/waitable_event.h>
27 #include <dpl/waitable_handle.h>
28 #include <dpl/thread.h>
33 RUNNER_TEST_GROUP_INIT(DPL)
35 namespace // anonymous
43 } // namespace anonymous
45 RUNNER_TEST(Once_DoubleCall)
54 RUNNER_ASSERT_MSG(g_counter == 1, "Counter value is: " << g_counter);
61 virtual int ThreadEntry()
63 DPL::WaitForSingleHandle(m_event->GetHandle());
64 m_once->Call(std::bind(&MyThread::Call, this));
74 MyThread(DPL::WaitableEvent *event, DPL::Once *once, std::atomic<int> *atom) :
75 m_event(event), m_once(once), m_atom(atom)
79 DPL::WaitableEvent *m_event;
81 std::atomic<int> *m_atom;
85 Name: Once_MultiThreadCall
86 Description: tests once call wrapper for use by multiple threads
87 Expected: function should be called just once from one of running threads
89 RUNNER_TEST(Once_MultiThreadCall)
91 const size_t NUM_THREADS = 20;
92 typedef std::shared_ptr<MyThread> ThreadPtr;
94 ThreadPtr threads[NUM_THREADS];
95 DPL::WaitableEvent event;
97 std::atomic<int> atom(0);
99 for (size_t i = 0; i < NUM_THREADS; ++i) {
100 (threads[i] = ThreadPtr(new MyThread(&event, &once, &atom)))->Run();
105 for (size_t i = 0; i < NUM_THREADS; ++i) {
109 RUNNER_ASSERT_MSG(atom == 1, "Atom value is: " << atom);