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>
29 #include <dpl/atomic.h>
32 RUNNER_TEST_GROUP_INIT(DPL)
34 namespace // anonymous
42 } // namespace anonymous
44 RUNNER_TEST(Once_DoubleCall)
53 RUNNER_ASSERT_MSG(g_counter == 1, "Counter value is: " << g_counter);
60 virtual int ThreadEntry()
62 DPL::WaitForSingleHandle(m_event->GetHandle());
63 m_once->Call(std::bind(&MyThread::Call, this));
73 MyThread(DPL::WaitableEvent *event, DPL::Once *once, DPL::Atomic *atom) :
74 m_event(event), m_once(once), m_atom(atom)
78 DPL::WaitableEvent *m_event;
84 Name: Once_MultiThreadCall
85 Description: tests once call wrapper for use by multiple threads
86 Expected: function should be called just once from one of running threads
88 RUNNER_TEST(Once_MultiThreadCall)
90 const size_t NUM_THREADS = 20;
91 typedef std::shared_ptr<MyThread> ThreadPtr;
93 ThreadPtr threads[NUM_THREADS];
94 DPL::WaitableEvent event;
98 for (size_t i = 0; i < NUM_THREADS; ++i) {
99 (threads[i] = ThreadPtr(new MyThread(&event, &once, &atom)))->Run();
104 for (size_t i = 0; i < NUM_THREADS; ++i) {
108 RUNNER_ASSERT_MSG(atom == 1, "Atom value is: " << atom);