Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions rclpy/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,32 @@ function(configure_python_c_extension_library _library_name)
)
endfunction()

# Library with signal handler
add_library(
rclpy_sigint
SHARED src/rclpy/sigint_gc.c
)
target_include_directories(rclpy_sigint PUBLIC ${CMAKE_SOURCE_DIR})
install(
TARGETS rclpy_sigint
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
ament_target_dependencies(rclpy_sigint
"rcl"
)
# Export so other packages can load this library when importing rclpy
ament_export_libraries(rclpy_sigint)
# Windows dllimport/dllexport
target_compile_definitions(rclpy_sigint PRIVATE "RCLPY_SIGINT_BUILDING_LIBRARY")

# Main library
add_library(
rclpy
SHARED src/rclpy/_rclpy.c
)
target_link_libraries(rclpy rclpy_sigint)
configure_python_c_extension_library(rclpy)
ament_target_dependencies(rclpy
"rcl"
Expand All @@ -90,6 +112,18 @@ ament_target_dependencies(rclpy_logging
"rcutils"
)

# WaitSet wrapper library
add_library(
rclpy_wait_set
SHARED src/rclpy/_rclpy_wait_set.c
)
target_link_libraries(rclpy_wait_set rclpy_sigint)
configure_python_c_extension_library(rclpy_wait_set)
ament_target_dependencies(rclpy_wait_set
"rcl"
"rcutils"
)

if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()
Expand All @@ -109,6 +143,7 @@ if(BUILD_TESTING)
PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE}"
APPEND_ENV AMENT_PREFIX_PATH=${ament_index_build_path}
PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}
APPEND_LIBRARY_DIRS "$<TARGET_FILE_DIR:rclpy_sigint>" # Windows add rclpy_sigint.dll to path
TIMEOUT 90
)
endif()
Expand Down
18 changes: 7 additions & 11 deletions rclpy/rclpy/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import threading

from rclpy.impl.implementation_singleton import rclpy_implementation as _rclpy
from rclpy.impl.implementation_singleton import rclpy_wait_set_implementation as _rclpy_wait_set
import rclpy.utilities


Expand All @@ -23,24 +24,19 @@ class ResponseThread(threading.Thread):
def __init__(self, client):
threading.Thread.__init__(self)
self.client = client
self.wait_set = _rclpy.rclpy_get_zero_initialized_wait_set()
_rclpy.rclpy_wait_set_init(self.wait_set, 0, 1, 0, 1, 0)
_rclpy.rclpy_wait_set_clear_entities('client', self.wait_set)
_rclpy.rclpy_wait_set_add_entity(
'client', self.wait_set, self.client.client_handle)
self._wait_set = _rclpy_wait_set.WaitSet()

def run(self):
[sigint_gc, sigint_gc_handle] = _rclpy.rclpy_get_sigint_guard_condition()
_rclpy.rclpy_wait_set_add_entity('guard_condition', self.wait_set, sigint_gc)
self._wait_set.clear()
self._wait_set.add_guard_conditions([sigint_gc])
self._wait_set.add_clients([self.client.client_handle])

_rclpy.rclpy_wait(self.wait_set, -1)

guard_condition_ready_list = \
_rclpy.rclpy_get_ready_entities('guard_condition', self.wait_set)
self._wait_set.wait(-1)

# destroying here to make sure we dont call shutdown before cleaning up
_rclpy.rclpy_destroy_entity(sigint_gc)
if sigint_gc_handle in guard_condition_ready_list:
if self._wait_set.is_ready(sigint_gc):
rclpy.utilities.shutdown()
return
response = _rclpy.rclpy_take_response(
Expand Down
Loading