Hi, this patch o fixes a cleanup-on-error problem with rtdm_task_init() o moves this call into drvlib (i.e. de-inlines it) o gets rid of __u64 and __s64 usages in favour of uint64_t and int64_t (for consistent types in both kernel and user space) o tries to improve the documentation of rtdm_device.device_name and RTDM_EXECUTE_ATOMICALLY and o moves EXPORT_SYMBOLs to their related functions
Tested, caused no regressions so far. Please apply. Jan
Index: skins/rtdm/drvlib.c =================================================================== --- skins/rtdm/drvlib.c (revision 112) +++ skins/rtdm/drvlib.c (working copy) @@ -58,7 +58,7 @@ * * Rescheduling: never. */ -__u64 rtdm_clock_read(void); +uint64_t rtdm_clock_read(void); #endif /* DOXYGEN_CPP */ /** @} */ @@ -69,7 +69,6 @@ * @{ */ -#ifdef DOXYGEN_CPP /* Only used for doxygen doc generation */ /** * @brief Intialise and start a real-time task * @@ -96,8 +95,40 @@ */ int rtdm_task_init(rtdm_task_t *task, const char *name, rtdm_task_proc_t task_proc, void *arg, - int priority, __u64 period); + int priority, uint64_t period) +{ + int res; + + res = xnpod_init_thread(task, name, priority, 0, 0); + if (res) + goto error_out; + + if (period != XN_INFINITE) { + res = xnpod_set_thread_periodic(task, XN_INFINITE, + xnpod_ns2ticks(period)); + if (res) + goto cleanup_out; + } + + res = xnpod_start_thread(task, 0, 0, XNPOD_ALL_CPUS, task_proc, arg); + if (res) + goto cleanup_out; + + return res; + + + cleanup_out: + xnpod_delete_thread(task); + + error_out: + return res; +} + +EXPORT_SYMBOL(rtdm_task_init); + + +#ifdef DOXYGEN_CPP /* Only used for doxygen doc generation */ /** * @brief Destroy a real-time task * @@ -153,7 +184,7 @@ * * Rescheduling: possible. */ -int rtdm_task_set_period(rtdm_task_t *task, __u64 period); +int rtdm_task_set_period(rtdm_task_t *task, uint64_t period); /** * @brief Wait on next real-time task period @@ -246,7 +277,9 @@ xnlock_put_irqrestore(&nklock, s); } +EXPORT_SYMBOL(rtdm_task_join_nrt); + /** * @brief Sleep a specified amount of time * @@ -266,7 +299,7 @@ * * Rescheduling: always. */ -int rtdm_task_sleep(__u64 delay) +int rtdm_task_sleep(uint64_t delay) { xnthread_t *thread = xnpod_current_thread(); @@ -276,7 +309,9 @@ return xnthread_test_flags(thread, XNBREAK) ? -EINTR : 0; } +EXPORT_SYMBOL(rtdm_task_sleep); + /** * @brief Sleep until a specified absolute time * @@ -296,7 +331,7 @@ * * Rescheduling: always, unless the specified time already passed. */ -int rtdm_task_sleep_until(__u64 wakeup_time) +int rtdm_task_sleep_until(uint64_t wakeup_time) { xnthread_t *thread = xnpod_current_thread(); xnsticks_t delay; @@ -320,7 +355,9 @@ return err; } +EXPORT_SYMBOL(rtdm_task_sleep_until); + /** * @brief Busy-wait a specified amount of time * @@ -337,13 +374,15 @@ * * Rescheduling: never. */ -void rtdm_task_busy_sleep(__u64 delay) +void rtdm_task_busy_sleep(uint64_t delay) { xnticks_t wakeup = xnarch_get_cpu_tsc() + xnarch_ns_to_tsc(delay); while (xnarch_get_cpu_tsc() < wakeup) cpu_relax(); } + +EXPORT_SYMBOL(rtdm_task_busy_sleep); /** @} */ @@ -368,8 +407,10 @@ xnlock_put_irqrestore(&nklock, s); } +EXPORT_SYMBOL(_rtdm_synch_flush); + /*! * @ingroup driverapi * @defgroup rtdmsync Synchronisation Services @@ -431,7 +472,7 @@ * * Rescheduling: never. */ -void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, __s64 timeout); +void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, int64_t timeout); #endif /* DOXYGEN_CPP */ /** @} */ @@ -552,7 +593,9 @@ xnlock_put_irqrestore(&nklock, s); } +EXPORT_SYMBOL(rtdm_event_signal); + /** * @brief Wait on event occurrence * @@ -605,7 +648,9 @@ return err; } +EXPORT_SYMBOL(rtdm_event_wait); + /** * @brief Wait on event occurrence with timeout * @@ -638,7 +683,7 @@ * * Rescheduling: possible. */ -int rtdm_event_timedwait(rtdm_event_t *event, __s64 timeout, +int rtdm_event_timedwait(rtdm_event_t *event, int64_t timeout, rtdm_toseq_t *timeout_seq) { xnthread_t *thread; @@ -687,6 +732,8 @@ return err; } + +EXPORT_SYMBOL(rtdm_event_timedwait); /** @} */ @@ -787,7 +834,9 @@ return err; } +EXPORT_SYMBOL(rtdm_sem_down); + /** * @brief Decrement a semaphore with timeout * @@ -823,7 +872,7 @@ * * Rescheduling: possible. */ -int rtdm_sem_timeddown(rtdm_sem_t *sem, __s64 timeout, +int rtdm_sem_timeddown(rtdm_sem_t *sem, int64_t timeout, rtdm_toseq_t *timeout_seq) { xnthread_t *thread; @@ -871,7 +920,9 @@ return err; } +EXPORT_SYMBOL(rtdm_sem_timeddown); + /** * @brief Increment a semaphore * @@ -905,6 +956,8 @@ xnlock_put_irqrestore(&nklock, s); } + +EXPORT_SYMBOL(rtdm_sem_up); /** @} */ @@ -1001,7 +1054,9 @@ return err; } +EXPORT_SYMBOL(rtdm_mutex_lock); + /** * @brief Request a mutex with timeout * @@ -1036,7 +1091,7 @@ * * Rescheduling: possible. */ -int rtdm_mutex_timedlock(rtdm_mutex_t *mutex, __s64 timeout, +int rtdm_mutex_timedlock(rtdm_mutex_t *mutex, int64_t timeout, rtdm_toseq_t *timeout_seq) { xnthread_t *thread; @@ -1084,7 +1139,9 @@ return err; } +EXPORT_SYMBOL(rtdm_mutex_timedlock); + /** * @brief Release a mutex * @@ -1115,6 +1172,8 @@ xnlock_put_irqrestore(&nklock, s); } + +EXPORT_SYMBOL(rtdm_mutex_unlock); /** @} */ /** @} Synchronisation services */ @@ -1520,19 +1579,3 @@ /** @} */ #endif /* DOXYGEN_CPP */ - - -EXPORT_SYMBOL(rtdm_task_join_nrt); -EXPORT_SYMBOL(rtdm_task_sleep); -EXPORT_SYMBOL(rtdm_task_sleep_until); -EXPORT_SYMBOL(rtdm_task_busy_sleep); -EXPORT_SYMBOL(_rtdm_synch_flush); -EXPORT_SYMBOL(rtdm_event_wait); -EXPORT_SYMBOL(rtdm_event_timedwait); -EXPORT_SYMBOL(rtdm_event_signal); -EXPORT_SYMBOL(rtdm_sem_down); -EXPORT_SYMBOL(rtdm_sem_timeddown); -EXPORT_SYMBOL(rtdm_sem_up); -EXPORT_SYMBOL(rtdm_mutex_lock); -EXPORT_SYMBOL(rtdm_mutex_timedlock); -EXPORT_SYMBOL(rtdm_mutex_unlock); Index: skins/rtdm/rtdm_driver.h =================================================================== --- skins/rtdm/rtdm_driver.h (revision 112) +++ skins/rtdm/rtdm_driver.h (working copy) @@ -381,7 +381,7 @@ /** Size of driver defined appendix to struct rtdm_dev_context */ size_t context_size; - /** Named device identification */ + /** Named device identification (orthogonal to Linux device name space) */ char device_name[RTDM_MAX_DEVNAME_LEN+1]; /** Protocol device identification: protocol family (PF_xxx) */ @@ -477,7 +477,7 @@ /* --- clock services --- */ -static inline __u64 rtdm_clock_read(void) +static inline uint64_t rtdm_clock_read(void) { return xnpod_ticks2ns(xnpod_get_time()); } @@ -500,7 +500,7 @@ * Generally, it is illegal to suspend the current task by calling * rtdm_task_sleep(), rtdm_event_wait(), etc. while holding a spinlock. In * contrast, this macro allows to combine several operations including - * potentially rescheduling calls to an atomic code block with respect to + * a potentially rescheduling call to an atomic code block with respect to * other RTDM_EXECUTE_ATOMICALLY() blocks. The macro is a light-weight * alternative for protecting code blocks via mutexes, and it can even be used * to synchronise real-time and non-real-time contexts. @@ -511,7 +511,9 @@ * @c break, @c return, @c goto, etc. This would leave the global lock held * during the code block execution in an inconsistent state. Moreover, do not * embed complex operations into the code bock. Consider that they will be - * executed under preemption lock with interrupts switched-off. + * executed under preemption lock with interrupts switched-off. Also note that + * invocation of rescheduling calls may break the atomicity until the task + * gains the CPU again. * * Environments: * @@ -841,29 +843,10 @@ /** @} */ -static inline int rtdm_task_init(rtdm_task_t *task, const char *name, - rtdm_task_proc_t task_proc, void *arg, - int priority, __u64 period) -{ - int res; +int rtdm_task_init(rtdm_task_t *task, const char *name, + rtdm_task_proc_t task_proc, void *arg, + int priority, uint64_t period); - res = xnpod_init_thread(task, name, priority, 0, 0); - if (res) - goto done; - - if (!__builtin_constant_p(period) || (period != XN_INFINITE)) { - res = xnpod_set_thread_periodic(task, XN_INFINITE, - xnpod_ns2ticks(period)); - if (res) - goto done; - } - - res = xnpod_start_thread(task, 0, 0, XNPOD_ALL_CPUS, task_proc, arg); - - done: - return res; -} - static inline void rtdm_task_destroy(rtdm_task_t *task) { xnpod_delete_thread(task); @@ -877,7 +860,7 @@ xnpod_schedule(); } -static inline int rtdm_task_set_period(rtdm_task_t *task, __u64 period) +static inline int rtdm_task_set_period(rtdm_task_t *task, uint64_t period) { return xnpod_set_thread_periodic(task, XN_INFINITE, xnpod_ns2ticks(period)); @@ -901,16 +884,16 @@ return xnpod_wait_thread_period(); } -int rtdm_task_sleep(__u64 delay); -int rtdm_task_sleep_until(__u64 wakeup_time); -void rtdm_task_busy_sleep(__u64 delay); +int rtdm_task_sleep(uint64_t delay); +int rtdm_task_sleep_until(uint64_t wakeup_time); +void rtdm_task_busy_sleep(uint64_t delay); /* --- timeout sequences */ -typedef __u64 rtdm_toseq_t; +typedef uint64_t rtdm_toseq_t; -static inline void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, __s64 timeout) +static inline void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, int64_t timeout) { *timeout_seq = xnpod_get_time() + xnpod_ns2ticks(timeout); } @@ -937,7 +920,7 @@ } int rtdm_event_wait(rtdm_event_t *event); -int rtdm_event_timedwait(rtdm_event_t *event, __s64 timeout, +int rtdm_event_timedwait(rtdm_event_t *event, int64_t timeout, rtdm_toseq_t *timeout_seq); void rtdm_event_signal(rtdm_event_t *event); @@ -971,7 +954,7 @@ } int rtdm_sem_down(rtdm_sem_t *sem); -int rtdm_sem_timeddown(rtdm_sem_t *sem, __s64 timeout, +int rtdm_sem_timeddown(rtdm_sem_t *sem, int64_t timeout, rtdm_toseq_t *timeout_seq); void rtdm_sem_up(rtdm_sem_t *sem); @@ -995,7 +978,7 @@ } int rtdm_mutex_lock(rtdm_mutex_t *mutex); -int rtdm_mutex_timedlock(rtdm_mutex_t *mutex, __s64 timeout, +int rtdm_mutex_timedlock(rtdm_mutex_t *mutex, int64_t timeout, rtdm_toseq_t *timeout_seq); void rtdm_mutex_unlock(rtdm_mutex_t *mutex);
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core