Skip to content

Commit 06a88cf

Browse files
authored
Merge pull request #103 from resibots/pool_fix
Deadlock fix and nicer reset for robot pool
2 parents 1f6f2dd + 5e300a8 commit 06a88cf

File tree

3 files changed

+11
-13
lines changed

3 files changed

+11
-13
lines changed

src/examples/robot_pool.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,18 @@ namespace pool {
6161
void eval_robot(int i)
6262
{
6363
auto robot = pool::robot_pool.get_robot();
64-
std::cout << "Robot " << i << " created [" << robot->skeleton() << "]" << std::endl;
64+
std::cout << "Robot " << i << " got [" << robot->skeleton() << "]" << std::endl;
6565

6666
/// --- some robot_dart code ---
6767
simulate_robot(robot);
6868
// --- do something with the result
6969

70+
std::cout << "End of simulation " << i << std::endl;
71+
7072
// CRITICAL : free your robot !
7173
pool::robot_pool.free_robot(robot);
74+
75+
std::cout << "Robot " << i << " freed!" << std::endl;
7276
}
7377

7478
int main(int argc, char** argv)

src/robot_dart/robot_pool.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace robot_dart {
1414
std::cout.flush();
1515
}
1616
auto robot = robot_creator();
17-
_set_init_pos(robot->skeleton());
17+
_reset_robot(robot);
1818
_skeletons.push_back(robot->skeleton());
1919
}
2020
for (size_t i = 0; i < _pool_size; i++)
@@ -26,8 +26,8 @@ namespace robot_dart {
2626

2727
std::shared_ptr<Robot> RobotPool::get_robot(const std::string& name)
2828
{
29-
std::lock_guard<std::mutex> lock(_skeleton_mutex);
3029
while (true) {
30+
std::lock_guard<std::mutex> lock(_skeleton_mutex);
3131
for (size_t i = 0; i < _pool_size; i++)
3232
if (_free[i]) {
3333
_free[i] = false;
@@ -41,21 +41,15 @@ namespace robot_dart {
4141
std::lock_guard<std::mutex> lock(_skeleton_mutex);
4242
for (size_t i = 0; i < _pool_size; i++) {
4343
if (_skeletons[i] == robot->skeleton()) {
44-
_set_init_pos(_skeletons[i]);
44+
_reset_robot(robot);
4545
_free[i] = true;
4646
break;
4747
}
4848
}
4949
}
5050

51-
void RobotPool::_set_init_pos(const dart::dynamics::SkeletonPtr& skel)
51+
void RobotPool::_reset_robot(const std::shared_ptr<Robot>& robot)
5252
{
53-
skel->resetPositions();
54-
skel->resetVelocities();
55-
skel->resetAccelerations();
56-
skel->clearExternalForces();
57-
skel->clearInternalForces();
58-
skel->clearConstraintImpulses();
59-
skel->resetCommands();
53+
robot->reset();
6054
}
6155
} // namespace robot_dart

src/robot_dart/robot_pool.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace robot_dart {
3131
std::mutex _skeleton_mutex;
3232
std::string _model_filename;
3333

34-
virtual void _set_init_pos(const dart::dynamics::SkeletonPtr& skel);
34+
virtual void _reset_robot(const std::shared_ptr<Robot>& robot);
3535
};
3636
} // namespace robot_dart
3737

0 commit comments

Comments
 (0)