From 6d7678d2a3257c4326d826e5329e286b63a9d3b6 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Wed, 25 Nov 2015 15:30:34 -0200 Subject: [PATCH] AP_HAL_PX4: fix passing callback to member function This is the same approach as done for AP_HAL_Linux in e3d78b8 ("AP_HAL_Linux: fix passing callback to member function"). It fixes the following warnings: ardupilot/libraries/AP_HAL_PX4/Scheduler.cpp: In member function 'virtual void PX4::PX4Scheduler::init(void*)': ardupilot/libraries/AP_HAL_PX4/Scheduler.cpp:55:95: warning: converting from 'void* (PX4::PX4Scheduler::*)()' to 'pthread_startroutine_t {aka void* (*)(void*)}' [-Wpmf-conversions] pthread_create(&_timer_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_timer_thread, this); ^ ardupilot/libraries/AP_HAL_PX4/Scheduler.cpp:65:94: warning: converting from 'void* (PX4::PX4Scheduler::*)()' to 'pthread_startroutine_t {aka void* (*)(void*)}' [-Wpmf-conversions] pthread_create(&_uart_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_uart_thread, this); ^ ardupilot/libraries/AP_HAL_PX4/Scheduler.cpp:75:92: warning: converting from 'void* (PX4::PX4Scheduler::*)()' to 'pthread_startroutine_t {aka void* (*)(void*)}' [-Wpmf-conversions] pthread_create(&_io_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_io_thread, this); ^ ardupilot/libraries/AP_HAL_PX4/Scheduler.cpp:85:100: warning: converting from 'void* (PX4::PX4Scheduler::*)()' to 'pthread_startroutine_t {aka void* (*)(void*)}' [-Wpmf-conversions] pthread_create(&_storage_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_storage_thread, this); ardupilot/libraries/AP_HAL_PX4/NSHShellStream.cpp: In member function 'void PX4::NSHShellStream::start_shell()': ardupilot/libraries/AP_HAL_PX4/NSHShellStream.cpp:83:99: warning: converting from 'void (PX4::NSHShellStream::*)()' to 'pthread_startroutine_t {aka void* (*)(void*)}' [-Wpmf-conversions] pthread_create(&shell_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::NSHShellStream::shell_thread, this); ^ --- libraries/AP_HAL_PX4/NSHShellStream.cpp | 17 ++++---- libraries/AP_HAL_PX4/Scheduler.cpp | 58 ++++++++++++++----------- libraries/AP_HAL_PX4/Scheduler.h | 8 ++-- libraries/AP_HAL_PX4/Util.h | 2 +- 4 files changed, 47 insertions(+), 38 deletions(-) diff --git a/libraries/AP_HAL_PX4/NSHShellStream.cpp b/libraries/AP_HAL_PX4/NSHShellStream.cpp index a8a6bb1d62..262c470c50 100644 --- a/libraries/AP_HAL_PX4/NSHShellStream.cpp +++ b/libraries/AP_HAL_PX4/NSHShellStream.cpp @@ -22,21 +22,22 @@ extern const AP_HAL::HAL& hal; #include "Util.h" using namespace PX4; -void NSHShellStream::shell_thread(void) +void NSHShellStream::shell_thread(void *arg) { + NSHShellStream *nsh = (NSHShellStream *)arg; close(0); close(1); close(2); - dup2(child.in, 0); - dup2(child.out, 1); - dup2(child.out, 2); + dup2(nsh->child.in, 0); + dup2(nsh->child.out, 1); + dup2(nsh->child.out, 2); nsh_consolemain(0, NULL); - shell_stdin = -1; - shell_stdout = -1; - child.in = -1; - child.out = -1; + nsh->shell_stdin = -1; + nsh->shell_stdout = -1; + nsh->child.in = -1; + nsh->child.out = -1; } void NSHShellStream::start_shell(void) diff --git a/libraries/AP_HAL_PX4/Scheduler.cpp b/libraries/AP_HAL_PX4/Scheduler.cpp index 2aee553253..711641b698 100644 --- a/libraries/AP_HAL_PX4/Scheduler.cpp +++ b/libraries/AP_HAL_PX4/Scheduler.cpp @@ -52,7 +52,7 @@ void PX4Scheduler::init() (void)pthread_attr_setschedparam(&thread_attr, ¶m); pthread_attr_setschedpolicy(&thread_attr, SCHED_FIFO); - pthread_create(&_timer_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_timer_thread, this); + pthread_create(&_timer_thread_ctx, &thread_attr, &PX4Scheduler::_timer_thread, this); // the UART thread runs at a medium priority pthread_attr_init(&thread_attr); @@ -62,7 +62,7 @@ void PX4Scheduler::init() (void)pthread_attr_setschedparam(&thread_attr, ¶m); pthread_attr_setschedpolicy(&thread_attr, SCHED_FIFO); - pthread_create(&_uart_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_uart_thread, this); + pthread_create(&_uart_thread_ctx, &thread_attr, &PX4Scheduler::_uart_thread, this); // the IO thread runs at lower priority pthread_attr_init(&thread_attr); @@ -72,7 +72,7 @@ void PX4Scheduler::init() (void)pthread_attr_setschedparam(&thread_attr, ¶m); pthread_attr_setschedpolicy(&thread_attr, SCHED_FIFO); - pthread_create(&_io_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_io_thread, this); + pthread_create(&_io_thread_ctx, &thread_attr, &PX4Scheduler::_io_thread, this); // the storage thread runs at just above IO priority pthread_attr_init(&thread_attr); @@ -82,7 +82,7 @@ void PX4Scheduler::init() (void)pthread_attr_setschedparam(&thread_attr, ¶m); pthread_attr_setschedpolicy(&thread_attr, SCHED_FIFO); - pthread_create(&_storage_thread_ctx, &thread_attr, (pthread_startroutine_t)&PX4::PX4Scheduler::_storage_thread, this); + pthread_create(&_storage_thread_ctx, &thread_attr, &PX4Scheduler::_storage_thread, this); } /** @@ -256,19 +256,21 @@ void PX4Scheduler::_run_timers(bool called_from_timer_thread) extern bool px4_ran_overtime; -void *PX4Scheduler::_timer_thread(void) +void *PX4Scheduler::_timer_thread(void *arg) { + PX4Scheduler *sched = (PX4Scheduler *)arg; uint32_t last_ran_overtime = 0; - while (!_hal_initialized) { + + while (!sched->_hal_initialized) { poll(NULL, 0, 1); } while (!_px4_thread_should_exit) { - delay_microseconds_semaphore(1000); + sched->delay_microseconds_semaphore(1000); // run registered timers - perf_begin(_perf_timers); - _run_timers(true); - perf_end(_perf_timers); + perf_begin(sched->_perf_timers); + sched->_run_timers(true); + perf_end(sched->_perf_timers); // process any pending RC output requests ((PX4RCOutput *)hal.rcout)->_timer_tick(); @@ -304,13 +306,15 @@ void PX4Scheduler::_run_io(void) _in_io_proc = false; } -void *PX4Scheduler::_uart_thread(void) +void *PX4Scheduler::_uart_thread(void *arg) { - while (!_hal_initialized) { - poll(NULL, 0, 1); + PX4Scheduler *sched = (PX4Scheduler *)arg; + + while (!sched->_hal_initialized) { + poll(NULL, 0, 1); } while (!_px4_thread_should_exit) { - delay_microseconds_semaphore(1000); + sched->delay_microseconds_semaphore(1000); // process any pending serial bytes ((PX4UARTDriver *)hal.uartA)->_timer_tick(); @@ -322,34 +326,38 @@ void *PX4Scheduler::_uart_thread(void) return NULL; } -void *PX4Scheduler::_io_thread(void) +void *PX4Scheduler::_io_thread(void *arg) { - while (!_hal_initialized) { - poll(NULL, 0, 1); + PX4Scheduler *sched = (PX4Scheduler *)arg; + + while (!sched->_hal_initialized) { + poll(NULL, 0, 1); } while (!_px4_thread_should_exit) { poll(NULL, 0, 1); // run registered IO processes - perf_begin(_perf_io_timers); - _run_io(); - perf_end(_perf_io_timers); + perf_begin(sched->_perf_io_timers); + sched->_run_io(); + perf_end(sched->_perf_io_timers); } return NULL; } -void *PX4Scheduler::_storage_thread(void) +void *PX4Scheduler::_storage_thread(void *arg) { - while (!_hal_initialized) { - poll(NULL, 0, 1); + PX4Scheduler *sched = (PX4Scheduler *)arg; + + while (!sched->_hal_initialized) { + poll(NULL, 0, 1); } while (!_px4_thread_should_exit) { poll(NULL, 0, 10); // process any pending storage writes - perf_begin(_perf_storage_timer); + perf_begin(sched->_perf_storage_timer); ((PX4Storage *)hal.storage)->_timer_tick(); - perf_end(_perf_storage_timer); + perf_end(sched->_perf_storage_timer); } return NULL; } diff --git a/libraries/AP_HAL_PX4/Scheduler.h b/libraries/AP_HAL_PX4/Scheduler.h index b39a74b391..d632df1e4f 100644 --- a/libraries/AP_HAL_PX4/Scheduler.h +++ b/libraries/AP_HAL_PX4/Scheduler.h @@ -88,10 +88,10 @@ private: pthread_t _storage_thread_ctx; pthread_t _uart_thread_ctx; - void *_timer_thread(void); - void *_io_thread(void); - void *_storage_thread(void); - void *_uart_thread(void); + static void *_timer_thread(void *arg); + static void *_io_thread(void *arg); + static void *_storage_thread(void *arg); + static void *_uart_thread(void *arg); void _run_timers(bool called_from_timer_thread); void _run_io(void); diff --git a/libraries/AP_HAL_PX4/Util.h b/libraries/AP_HAL_PX4/Util.h index 9a6fb7ad6f..bcb88ea94a 100644 --- a/libraries/AP_HAL_PX4/Util.h +++ b/libraries/AP_HAL_PX4/Util.h @@ -25,7 +25,7 @@ private: bool showed_armed_warning = false; void start_shell(void); - void shell_thread(void); + static void shell_thread(void *arg); }; class PX4::PX4Util : public AP_HAL::Util {