Panda3D

conditionVarSimpleImpl.cxx
Go to the documentation of this file.
1 /**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file conditionVarSimpleImpl.cxx
10 * @author drose
11 * @date 2007-06-19
12 */
13
14 #include "selectThreadImpl.h"
15
16 #ifdef THREAD_SIMPLE_IMPL
17
18 #include "conditionVarSimpleImpl.h"
19 #include "threadSimpleImpl.h"
20
21 /**
22 *
23 */
24 void ConditionVarSimpleImpl::
25 wait() {
26 _mutex.unlock_quietly();
27
28 ThreadSimpleManager *manager = ThreadSimpleManager::get_global_ptr();
29 ThreadSimpleImpl *thread = manager->get_current_thread();
30 manager->enqueue_block(thread, this);
31 manager->next_context();
32
33 _mutex.lock();
34 }
35
36 /**
37 *
38 */
39 void ConditionVarSimpleImpl::
40 wait(double timeout) {
41 _mutex.unlock_quietly();
42
43 // TODO. For now this will release every frame, since we don't have an
44 // interface yet on ThreadSimpleManager to do a timed wait. Maybe that's
45 // good enough forever (it does satisfy the condition variable semantics,
46 // after all).
47 ThreadSimpleManager *manager = ThreadSimpleManager::get_global_ptr();
48 ThreadSimpleImpl *thread = manager->get_current_thread();
49 manager->enqueue_ready(thread, true);
50 manager->next_context();
51
52 _mutex.lock();
53 }
54
55 /**
56 *
57 */
58 void ConditionVarSimpleImpl::
59 do_notify() {
60 ThreadSimpleManager *manager = ThreadSimpleManager::get_global_ptr();
61 if (manager->unblock_one(this)) {
62 // There had been a thread waiting on this condition variable. Switch
63 // contexts immediately, to make fairness more likely.
64 ThreadSimpleImpl *thread = manager->get_current_thread();
65 manager->enqueue_ready(thread, false);
66 manager->next_context();
67 }
68 }
69
70 /**
71 *
72 */
73 void ConditionVarSimpleImpl::
74 do_notify_all() {
75 ThreadSimpleManager *manager = ThreadSimpleManager::get_global_ptr();
76 if (manager->unblock_all(this)) {
77 // There had been a thread waiting on this condition variable. Switch
78 // contexts immediately, to make fairness more likely.
79 ThreadSimpleImpl *thread = manager->get_current_thread();
80 manager->enqueue_ready(thread, false);
81 manager->next_context();
82 }
83 }
84
85 #endif // THREAD_SIMPLE_IMPL
conditionVarSimpleImpl.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
selectThreadImpl.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
threadSimpleImpl.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.