[Xenomai-git] Jan Kiszka : cobalt/kernel: Instrument syscalls

2014-04-24 Thread git repository hosting
Module: xenomai-jki
Branch: forge-tracing
Commit: 1bf921fd6e339779b260c3d42028eac5c426001e
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=1bf921fd6e339779b260c3d42028eac5c426001e

Author: Jan Kiszka 
Date:   Thu Oct 31 15:35:19 2013 +0100

cobalt/kernel: Instrument syscalls

---

 include/ftrace/xn_sys.h  | 1405 ++
 kernel/cobalt/posix/clock.c  |   13 +
 kernel/cobalt/posix/mutex.c  |4 +
 kernel/cobalt/posix/nsem.c   |   10 +
 kernel/cobalt/posix/sem.c|   26 +
 kernel/cobalt/posix/sem.h|1 +
 kernel/cobalt/posix/thread.c |   30 +
 kernel/cobalt/shadow.c   |1 +
 8 files changed, 1490 insertions(+)

diff --git a/include/ftrace/xn_sys.h b/include/ftrace/xn_sys.h
new file mode 100644
index 000..c7cd09a
--- /dev/null
+++ b/include/ftrace/xn_sys.h
@@ -0,0 +1,1405 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM xn_sys
+
+#if !defined(_TRACE_XN_SYS_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_XN_SYS_H
+
+#include 
+#include 
+#include 
+#include 
+
+#include <../kernel/xenomai/posix/registry.h>
+#include <../kernel/xenomai/posix/sem.h>
+#include <../kernel/xenomai/posix/mutex.h>
+
+#define __timespec_fields(name)\
+   __field(__kernel_time_t, tv_sec_##name) \
+   __field(long, tv_nsec_##name)
+
+#if 0
+#define __optional_timespec_fields(name)   \
+   __field(int, using_##name)  \
+   __timespec_fields(name)
+#endif
+
+#define __assign_timespec(to, from)\
+   do {\
+   __entry->tv_sec_##to = (from)->tv_sec;  \
+   __entry->tv_nsec_##to = (from)->tv_nsec;\
+   } while (0)
+
+#if 0
+#define __assign_optional_timespec(to, from)   \
+   do {\
+   __entry->using_##to = (from != NULL);   \
+   if (from)   \
+   __assign_timespec(to, from);\
+   else {  \
+   __entry->tv_sec_##to = 0;   \
+   __entry->tv_nsec_##to = 0;  \
+   }   \
+   } while (0)
+#endif
+
+#define __timespec_args(name)  \
+   __entry->tv_sec_##name, __entry->tv_nsec_##name
+
+#if 0
+#define __timespec_used(name)  \
+   __entry->using_##name ? "used" : "unused"
+#endif
+
+#define show_thread_mode(mode) \
+   __print_flags(mode, "|",\
+ {PTHREAD_WARNSW, "warnsw"},   \
+ {PTHREAD_LOCK_SCHED, "lock"}, \
+ {PTHREAD_DISABLE_LOCKBREAK, "nolockbreak"})
+
+#define __thread_mode_args(name)   \
+__entry->name, show_thread_mode(__entry->name)
+
+#define show_sched_policy(policy)  \
+   __print_symbolic(policy,\
+{SCHED_NORMAL, "normal"},  \
+{SCHED_FIFO, "fifo"},  \
+{SCHED_RR, "rr"},  \
+{SCHED_SPORADIC, "sporadic"},  \
+{SCHED_COBALT, "cobalt"},  \
+{SCHED_WEAK, "weak"})
+
+#define __sched_policy_args(name)  \
+__entry->name, show_sched_policy(__entry->name)
+
+#if 0
+#define show_protocol(protocol)
\
+   __print_symbolic(protocol,  \
+{PTHREAD_PRIO_NONE, "prio-none"},  \
+{PTHREAD_PRIO_INHERIT, "prio-inherit"},\
+{PTHREAD_PRIO_PROTECT, "prio-protect"})
+
+#define __protocol_args()  \
+__entry->protocol, show_protocol(__entry->protocol)
+
+#define show_type(type)
\
+   __print_symbolic(type,  \
+{PTHREAD_MUTEX_NORMAL, "normal"},  \
+{PTHREAD_MUTEX_RECURSIVE, "recursive"},\
+{PTHREAD_MUTEX_ERRORCHECK, "errorcheck"})
+
+#define __type_args()  \
+__entry->type, show_type(__entry->type)
+
+#define show_pshared(pshared)  \
+   __print_symbolic(pshared,   \
+{PTHREAD_PROCESS_PRIVATE, "priva

[Xenomai-git] Philippe Gerum : scripts/xeno-config: introduce --kcflags

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: ad340d0ea0d6d0adbcca48427ca74279b5cd2c3b
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ad340d0ea0d6d0adbcca48427ca74279b5cd2c3b

Author: Philippe Gerum 
Date:   Tue Apr  8 12:16:05 2014 +0200

scripts/xeno-config: introduce --kcflags

This switch dumps the CFLAGS required for building over a given kernel
API. Just like with --cflags, --skin must mention the API of choice.

--[skin=]rtdm --kcflags is available for retrieving the kernel CFLAGS
  required for building a RTDM driver. Typically, a Makefile frag
  would do:

  ccflags-y := $(shell xeno-config --rtdm --kcflags)

---

 scripts/xeno-config-cobalt.in  |   29 -
 scripts/xeno-config-mercury.in |   26 ++
 2 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/scripts/xeno-config-cobalt.in b/scripts/xeno-config-cobalt.in
index 665efc2..481dce0 100644
--- a/scripts/xeno-config-cobalt.in
+++ b/scripts/xeno-config-cobalt.in
@@ -52,9 +52,10 @@ Options :
 --ccld
 --arch
 --prefix
---[skin=]posix/cobalt|vxworks|psos|alchemy
+--[skin=]posix/cobalt|vxworks|psos|alchemy|rtdm
 --auto-init|no-auto-init
 --cflags
+--kcflags
 --ldflags
 --lib*-dir,--libdir,--user-libdir
 --core
@@ -120,30 +121,48 @@ while test $# -gt 0; do
skin_list="$skin_list `expr "$1" : '--skin=\(.*\)'`"
fi
;;
-   --posix|--cobalt|--vxworks|--psos|--alchemy)
+   --posix|--cobalt|--vxworks|--psos|--alchemy|--rtdm)
skin_list="$skin_list `expr "$1" : '--\(.*\)'`"
;;
--cflags)
if test -z "$skin_list"; then
-   echo "no skin specified, missing --skin before --cflags" 1>&2
+   echo "no RTOS skin specified, missing --skin before --cflags" 
1>&2
exit 1
fi
cflags="$XENO_BASE_CFLAGS"
for skin in $skin_list; do
case "$skin" in
-   posix|cobalt)
+   posix|cobalt|rtdm)
;;
vxworks|psos|alchemy)
cflags="$cflags -I$XENO_INCLUDE_DIR/$skin"
;;
*)
-   echo "unknown skin: $skin" 1>&2
+   echo "unknown RTOS skin: $skin" 1>&2
exit 1
;;
esac
done
echo $cflags
;;
+   --kcflags)
+   if test -z "$skin_list"; then
+   echo "no kernel API specified, missing --skin before --kcflags" 
1>&2
+   exit 1
+   fi
+   for skin in $skin_list; do
+   case "$skin" in
+   rtdm)
+   kcflags='-Iarch/$(SRCARCH)/xenomai/include 
-Iinclude/xenomai'
+   ;;
+   *)
+   echo "unknown kernel API: $skin" 1>&2
+   exit 1
+   ;;
+   esac
+   done
+   echo $kcflags
+   ;;
--ldflags)
if test -z "$skin_list"; then
echo "no skin specified, missing --skin before --ldflags" 1>&2
diff --git a/scripts/xeno-config-mercury.in b/scripts/xeno-config-mercury.in
index 3b9c1c9..5b8b1e9 100644
--- a/scripts/xeno-config-mercury.in
+++ b/scripts/xeno-config-mercury.in
@@ -34,7 +34,7 @@ Options :
 --ccld
 --arch
 --prefix
---[skin=]vxworks|psos|alchemy
+--[skin=]vxworks|psos|alchemy|rtdm
 --auto-init|no-auto-init
 --cflags
 --ldflags
@@ -99,12 +99,12 @@ while test $# -gt 0; do
skin_list="$skin_list `expr "$1" : '--skin=\(.*\)'`"
fi
;;
-   --vxworks|--psos|--alchemy)
+   --vxworks|--psos|--alchemy|--rtdm)
skin_list="$skin_list `expr "$1" : '--\(.*\)'`"
;;
--cflags)
if test -z "$skin_list"; then
-   echo "no skin specified, missing --skin before --cflags" 1>&2
+   echo "no RTOS skin specified, missing --skin before --cflags" 
1>&2
exit 1
fi
cflags="$XENO_BASE_CFLAGS"
@@ -114,13 +114,31 @@ while test $# -gt 0; do
cflags="$cflags -I$XENO_INCLUDE_DIR/$skin"
;;
*)
-   echo "unknown skin: $skin" 1>&2
+   echo "unknown RTOS skin: $skin" 1>&2
exit 1
;;
esac
done
echo $cflags
;;
+   --kcflags)
+   if test -z "$skin_list"; then
+   echo "no kernel API specified, missing --skin before --kcflags" 
1>&2
+   exit 1
+   fi
+   kcflags=
+   for skin in $skin_list

[Xenomai-git] Philippe Gerum : copperplate/init: introduce --dump-config option

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 83cd57130a0cd941bad908afd5fda13ac41dbd81
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=83cd57130a0cd941bad908afd5fda13ac41dbd81

Author: Philippe Gerum 
Date:   Mon Apr 14 12:35:34 2014 +0200

copperplate/init: introduce --dump-config option

The builtin --dump-config switch is introduced to dump the
configuration information from any copperplate-based application.

---

 doc/asciidoc/README.APPLICATIONS.adoc |   15 +--
 lib/copperplate/init.c|   19 +++
 2 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/doc/asciidoc/README.APPLICATIONS.adoc 
b/doc/asciidoc/README.APPLICATIONS.adoc
index a3a2deb..b9ebea1 100644
--- a/doc/asciidoc/README.APPLICATIONS.adoc
+++ b/doc/asciidoc/README.APPLICATIONS.adoc
@@ -151,13 +151,16 @@ switch]).
Sets the CPU affinity of threads created by the Xenomai
libraries within the new process.
 
-*--enable-async-cancel*::
+*--version*::
 
-   Enables asynchronous cancellation of Xenomai threads, making
-   provision to protect the Xenomai APIs accordingly. When
-   disabled, Xenomai assumes that threads may exit due to
-   cancellation only when they reach cancellation points (like
-   system calls). Defaults to enabled.
+   Writes the Xenomai version information to stdout. The program
+   immediately exits with a success code afterwards.
+
+*--dump-config*::
+
+   Dumps the configuration settings to stdout. Those settings are
+   defined as a result of running the configure script. The
+   program immediately exits with a success code afterwards.
 
 Available real-time APIs
 
diff --git a/lib/copperplate/init.c b/lib/copperplate/init.c
index 685d018..8f9f33a 100644
--- a/lib/copperplate/init.c
+++ b/lib/copperplate/init.c
@@ -129,6 +129,13 @@ static const struct option base_options[] = {
.val = 0
},
{
+#define dumpconfig_opt 10
+   .name = "dump-config",
+   .has_arg = 0,
+   .flag = NULL,
+   .val = 0
+   },
+   {
.name = NULL,
.has_arg = 0,
.flag = NULL,
@@ -142,6 +149,14 @@ static inline void print_version(void)
fprintf(stderr, "%s\n", xenomai_version_string);
 }
 
+static inline void dump_configuration(void)
+{
+   int n;
+
+   for (n = 0; config_strings[n]; n++)
+   puts(config_strings[n]);
+}
+
 static void usage(void)
 {
struct copperskin *skin;
@@ -157,6 +172,7 @@ static void usage(void)
 fprintf(stderr, "--cpu-affinity=set CPU affinity of 
threads\n");
 fprintf(stderr, "--silent tame down 
verbosity\n");
 fprintf(stderr, "--versionget version 
information\n");
+fprintf(stderr, "--dump-configdump configuration 
settings\n");

pvlist_for_each_entry(skin, &skins, __reserved.next) {
if (skin->help)
@@ -360,6 +376,9 @@ static int parse_base_options(int *argcp, char *const 
**argvp,
case version_opt:
print_version();
exit(0);
+   case dumpconfig_opt:
+   dump_configuration();
+   exit(0);
case help_opt:
usage();
exit(0);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : lib: use symbolic constant for name length

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 9ad93d95a3dce2f6cb6c815847133d90f24de288
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=9ad93d95a3dce2f6cb6c815847133d90f24de288

Author: Philippe Gerum 
Date:   Wed Apr 16 11:07:04 2014 +0200

lib: use symbolic constant for name length

---

 include/alchemy/alarm.h  |2 +-
 include/alchemy/buffer.h |2 +-
 include/alchemy/cond.h   |2 +-
 include/alchemy/event.h  |2 +-
 include/alchemy/heap.h   |2 +-
 include/alchemy/mutex.h  |2 +-
 include/alchemy/queue.h  |2 +-
 include/alchemy/sem.h|2 +-
 include/alchemy/task.h   |2 +-
 include/copperplate/clockobj.h   |1 +
 include/copperplate/reference.h  |1 +
 lib/alchemy/alarm.h  |2 +-
 lib/alchemy/buffer.h |2 +-
 lib/alchemy/cond.h   |2 +-
 lib/alchemy/event.h  |2 +-
 lib/alchemy/heap.c   |2 +-
 lib/alchemy/heap.h   |2 +-
 lib/alchemy/mutex.h  |2 +-
 lib/alchemy/pipe.h   |2 +-
 lib/alchemy/queue.h  |2 +-
 lib/alchemy/sem.h|2 +-
 lib/alchemy/task.h   |2 +-
 lib/copperplate/internal.h   |3 ++-
 lib/copperplate/regd/fs-common.c |2 +-
 lib/copperplate/regd/sysregfs.h  |2 +-
 lib/psos/pt.h|2 +-
 lib/psos/queue.h |2 +-
 lib/psos/rn.h|2 +-
 lib/psos/sem.h   |2 +-
 lib/psos/task.h  |2 +-
 lib/vxworks/msgQLib.h|2 +-
 lib/vxworks/taskLib.h|2 +-
 32 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/include/alchemy/alarm.h b/include/alchemy/alarm.h
index 61d3c5c..fd84150 100644
--- a/include/alchemy/alarm.h
+++ b/include/alchemy/alarm.h
@@ -43,7 +43,7 @@ struct RT_ALARM_INFO {
/**
 * Name of alarm object.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_ALARM_INFO RT_ALARM_INFO;
diff --git a/include/alchemy/buffer.h b/include/alchemy/buffer.h
index 27be2a5..7e1f111 100644
--- a/include/alchemy/buffer.h
+++ b/include/alchemy/buffer.h
@@ -61,7 +61,7 @@ struct RT_BUFFER_INFO {
/**
 * Name of the buffer.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_BUFFER_INFO RT_BUFFER_INFO;
diff --git a/include/alchemy/cond.h b/include/alchemy/cond.h
index 4667f14..3b6868b 100644
--- a/include/alchemy/cond.h
+++ b/include/alchemy/cond.h
@@ -40,7 +40,7 @@ struct RT_COND_INFO {
/**
 * Name of condition variable.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_COND_INFO RT_COND_INFO;
diff --git a/include/alchemy/event.h b/include/alchemy/event.h
index 14b313d..980e4ce 100644
--- a/include/alchemy/event.h
+++ b/include/alchemy/event.h
@@ -55,7 +55,7 @@ struct RT_EVENT_INFO {
/**
 * Name of event flag group.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_EVENT_INFO RT_EVENT_INFO;
diff --git a/include/alchemy/heap.h b/include/alchemy/heap.h
index b331136..2ff02ef 100644
--- a/include/alchemy/heap.h
+++ b/include/alchemy/heap.h
@@ -71,7 +71,7 @@ struct RT_HEAP_INFO {
/**
 * Name of heap.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_HEAP_INFO RT_HEAP_INFO;
diff --git a/include/alchemy/mutex.h b/include/alchemy/mutex.h
index 9b4e36c..6b3d126 100644
--- a/include/alchemy/mutex.h
+++ b/include/alchemy/mutex.h
@@ -46,7 +46,7 @@ struct RT_MUTEX_INFO {
/**
 * Name of mutex.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_MUTEX_INFO RT_MUTEX_INFO;
diff --git a/include/alchemy/queue.h b/include/alchemy/queue.h
index dba385c..d5a035c 100644
--- a/include/alchemy/queue.h
+++ b/include/alchemy/queue.h
@@ -81,7 +81,7 @@ struct RT_QUEUE_INFO {
/**
 * Name of message queue.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_QUEUE_INFO RT_QUEUE_INFO;
diff --git a/include/alchemy/sem.h b/include/alchemy/sem.h
index 51caf1d..94d98f7 100644
--- a/include/alchemy/sem.h
+++ b/include/alchemy/sem.h
@@ -52,7 +52,7 @@ struct RT_SEM_INFO {
/**
 * Name of semaphore.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_SEM_INFO RT_SEM_INFO;
diff --git a/include/alchemy/task.h b/include/alchemy/task.h
index b8f2ec0..7a2eb1c 100644
--- a/include/alchemy/task.h
+++ b/include/alchemy/task.h
@@ -75,7 +75,7 @@ struct RT_TASK_INFO {
/**
 * Name of task.
 */
-   char name[32];
+   char name[XNOBJECT_NAME_LEN];
 };
 
 typedef struct RT_TASK_INFO RT_TASK_INFO

[Xenomai-git] Philippe Gerum : cobalt/thread: add square brackets to kernel thread names

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: fa57bc3af40fe190d52a6773cd1f0ceaf8700400
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fa57bc3af40fe190d52a6773cd1f0ceaf8700400

Author: Philippe Gerum 
Date:   Thu Apr 17 10:49:44 2014 +0200

cobalt/thread: add square brackets to kernel thread names

---

 kernel/cobalt/thread.c |7 +--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 25cc353..fa5f0b4 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -158,9 +158,12 @@ int __xnthread_init(struct xnthread *thread,
}
 
if (attr->name)
-   xnobject_copy_name(thread->name, attr->name);
+   snprintf(thread->name,
+sizeof(thread->name), flags & XNUSER ?
+"%s" : "[%s]", attr->name);
else
-   snprintf(thread->name, sizeof(thread->name), "%p", thread);
+   snprintf(thread->name,
+sizeof(thread->name), "[%p]", thread);
 
thread->personality = attr->personality;
cpus_and(thread->affinity, attr->affinity, nkaffinity);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/thread: drop typedefs for non-opaque aggregates

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: a6ecec5367449107f5b1fd6ec81303be3b44c468
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=a6ecec5367449107f5b1fd6ec81303be3b44c468

Author: Philippe Gerum 
Date:   Tue Apr 15 17:53:36 2014 +0200

cobalt/thread: drop typedefs for non-opaque aggregates

---

 include/cobalt/kernel/rtdm/driver.h |2 +-
 include/cobalt/kernel/thread.h  |5 ++---
 kernel/cobalt/posix/clock.c |2 +-
 kernel/cobalt/posix/cond.c  |8 
 kernel/cobalt/posix/mutex.c |6 +++---
 kernel/cobalt/posix/select.c|2 +-
 kernel/cobalt/registry.c|2 +-
 kernel/cobalt/rtdm/drvlib.c |8 
 kernel/cobalt/sched.c   |2 +-
 kernel/cobalt/select.c  |2 +-
 kernel/cobalt/thread.c  |   28 ++--
 kernel/drivers/ipc/bufp.c   |4 ++--
 kernel/drivers/testing/switchtest.c |2 +-
 13 files changed, 36 insertions(+), 37 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index dc8f2f3..bfd3fab 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -1052,7 +1052,7 @@ static inline void 
rtdm_timer_stop_in_handler(rtdm_timer_t *timer)
  * @{
  */
 
-typedef xnthread_t rtdm_task_t;
+typedef struct xnthread rtdm_task_t;
 
 /**
  * Real-time task procedure
diff --git a/include/cobalt/kernel/thread.h b/include/cobalt/kernel/thread.h
index dd9ee68..b28400b 100644
--- a/include/cobalt/kernel/thread.h
+++ b/include/cobalt/kernel/thread.h
@@ -60,8 +60,7 @@ struct xnthread_wait_context {
int posted;
 };
 
-typedef struct xnthread {
-
+struct xnthread {
struct xnarchtcb tcb;   /* Architecture-dependent block */
 
unsigned long state;/* Thread state flags */
@@ -174,7 +173,7 @@ typedef struct xnthread {
 #endif
/** Exit event for joining the thread. */
struct xnsynch join_synch;
-} xnthread_t;
+};
 
 #define xnthread_name(thread)   ((thread)->name)
 #define xnthread_clear_name(thread)do { *(thread)->name = 0; } while(0)
diff --git a/kernel/cobalt/posix/clock.c b/kernel/cobalt/posix/clock.c
index 8eeb6d7..12bbaad 100644
--- a/kernel/cobalt/posix/clock.c
+++ b/kernel/cobalt/posix/clock.c
@@ -245,7 +245,7 @@ int cobalt_clock_nanosleep(clockid_t clock_id, int flags,
   struct timespec __user *u_rmt)
 {
struct timespec rqt, rmt, *rmtp = NULL;
-   xnthread_t *cur;
+   struct xnthread *cur;
xnsticks_t rem;
int err = 0;
spl_t s;
diff --git a/kernel/cobalt/posix/cond.c b/kernel/cobalt/posix/cond.c
index b68a1df..73f3971 100644
--- a/kernel/cobalt/posix/cond.c
+++ b/kernel/cobalt/posix/cond.c
@@ -252,7 +252,7 @@ static inline int pthread_cond_destroy(struct 
cobalt_cond_shadow *cnd)
return 0;
 }
 
-static inline int cobalt_cond_timedwait_prologue(xnthread_t *cur,
+static inline int cobalt_cond_timedwait_prologue(struct xnthread *cur,
 struct cobalt_cond *cond,
 struct cobalt_mutex *mutex,
 int timed,
@@ -329,7 +329,7 @@ static inline int cobalt_cond_timedwait_prologue(xnthread_t 
*cur,
return err;
 }
 
-static inline int cobalt_cond_timedwait_epilogue(xnthread_t *cur,
+static inline int cobalt_cond_timedwait_epilogue(struct xnthread *cur,
 struct cobalt_cond *cond,
 struct cobalt_mutex *mutex)
 {
@@ -410,7 +410,7 @@ int cobalt_cond_wait_prologue(struct cobalt_cond_shadow 
__user *u_cnd,
  unsigned int timed,
  struct timespec __user *u_ts)
 {
-   xnthread_t *cur = xnshadow_current();
+   struct xnthread *cur = xnshadow_current();
struct cobalt_cond *cnd;
struct cobalt_mutex *mx;
struct mutex_dat *datp;
@@ -473,7 +473,7 @@ int cobalt_cond_wait_prologue(struct cobalt_cond_shadow 
__user *u_cnd,
 int cobalt_cond_wait_epilogue(struct cobalt_cond_shadow __user *u_cnd,
  struct cobalt_mutex_shadow __user *u_mx)
 {
-   xnthread_t *cur = xnshadow_current();
+   struct xnthread *cur = xnshadow_current();
struct cobalt_cond *cnd;
struct cobalt_mutex *mx;
xnhandle_t handle;
diff --git a/kernel/cobalt/posix/mutex.c b/kernel/cobalt/posix/mutex.c
index 78b6a2c..11f6c78 100644
--- a/kernel/cobalt/posix/mutex.c
+++ b/kernel/cobalt/posix/mutex.c
@@ -131,7 +131,7 @@ cobalt_mutex_destroy_inner(xnhandle_t handle, struct 
cobalt_kqueues *q)
xnfree(mutex);
 }
 
-static inline int cobalt_mutex_acquire(xnthread_t *cur,
+static inline int cobalt_mutex_acquire(struct xnthread *cur,
   struct co

[Xenomai-git] Philippe Gerum : copperplate: enable error checking for mutexes in debug mode

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: ad6c0ad9f94a4fa230c94aa616c933a3641007eb
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ad6c0ad9f94a4fa230c94aa616c933a3641007eb

Author: Philippe Gerum 
Date:   Wed Apr 16 16:56:09 2014 +0200

copperplate: enable error checking for mutexes in debug mode

---

 lib/copperplate/clockobj.c|1 +
 lib/copperplate/heapobj-malloc.c  |1 +
 lib/copperplate/heapobj-pshared.c |2 ++
 lib/copperplate/notifier.c|2 ++
 lib/copperplate/registry.c|2 ++
 lib/copperplate/syncobj.c |1 +
 lib/copperplate/threadobj.c   |1 +
 lib/copperplate/timerobj.c|3 ++-
 lib/copperplate/traceobj.c|1 +
 9 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/lib/copperplate/clockobj.c b/lib/copperplate/clockobj.c
index 1a22ab2..4f5541d 100644
--- a/lib/copperplate/clockobj.c
+++ b/lib/copperplate/clockobj.c
@@ -398,6 +398,7 @@ int clockobj_init(struct clockobj *clkobj,
 * confirmed reading loop.
 */
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE));
__RT(pthread_mutex_init(&clkobj->lock, &mattr));
diff --git a/lib/copperplate/heapobj-malloc.c b/lib/copperplate/heapobj-malloc.c
index f428da6..57dca08 100644
--- a/lib/copperplate/heapobj-malloc.c
+++ b/lib/copperplate/heapobj-malloc.c
@@ -58,6 +58,7 @@ int __heapobj_init_private(struct heapobj *hobj, const char 
*name,
return __bt(-ENOMEM);
 
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE));
__RT(pthread_mutex_init(&ph->lock, &mattr));
diff --git a/lib/copperplate/heapobj-pshared.c 
b/lib/copperplate/heapobj-pshared.c
index d4c6cf4..6cde6ad 100644
--- a/lib/copperplate/heapobj-pshared.c
+++ b/lib/copperplate/heapobj-pshared.c
@@ -175,6 +175,7 @@ static void init_heap(struct shared_heap *heap, const char 
*name,
__list_init_nocheck(heap, &heap->extents);
 
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED));
__RT(pthread_mutex_init(&heap->lock, &mattr));
@@ -194,6 +195,7 @@ static void init_main_heap(struct session_heap *m_heap, 
void *mem, size_t size)
m_heap->cpid = copperplate_get_tid();
 
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED));
__RT(pthread_mutex_init(&m_heap->sysgroup.lock, &mattr));
diff --git a/lib/copperplate/notifier.c b/lib/copperplate/notifier.c
index c94998b..ab69a75 100644
--- a/lib/copperplate/notifier.c
+++ b/lib/copperplate/notifier.c
@@ -167,6 +167,7 @@ int notifier_init(struct notifier *nf,
nf->notified = 0;
nf->owner = owned ? copperplate_get_tid() : 0;
__STD(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__STD(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__STD(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE));
__STD(pthread_mutex_init(&nf->lock, &mattr));
@@ -306,6 +307,7 @@ void notifier_pkg_init(void)
struct sigaction sa;
 
__STD(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__STD(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__STD(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE));
__STD(pthread_mutex_init(¬ifier_lock, &mattr));
diff --git a/lib/copperplate/registry.c b/lib/copperplate/registry.c
index fe8153a..b3ef2ed 100644
--- a/lib/copperplate/registry.c
+++ b/lib/copperplate/registry.c
@@ -165,6 +165,7 @@ void registry_init_file(struct fsobj *fsobj,
pvholder_init(&fsobj->link);
 
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE));
__RT(pthread_mutex_init(&fsobj->lock, &mattr));
@@ -704,6 +705,7 @@ int __registry_pkg_init(const char *arg0, char *mountpt)
int ret;
 
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_

[Xenomai-git] Philippe Gerum : cobalt/sched: expose thread personality via /proc/xenomai /sched/threads

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 331c89247191d5b78096930f65d246c4be627991
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=331c89247191d5b78096930f65d246c4be627991

Author: Philippe Gerum 
Date:   Thu Apr 17 12:29:55 2014 +0200

cobalt/sched: expose thread personality via /proc/xenomai/sched/threads

---

 kernel/cobalt/sched.c  |9 ++---
 kernel/cobalt/shadow.c |2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c
index 7f05052..93e44ac 100644
--- a/kernel/cobalt/sched.c
+++ b/kernel/cobalt/sched.c
@@ -864,6 +864,7 @@ struct vfile_schedlist_data {
pid_t pid;
char name[XNOBJECT_NAME_LEN];
char sched_class[XNOBJECT_NAME_LEN];
+   char personality[XNOBJECT_NAME_LEN];
int cprio;
xnticks_t timeout;
unsigned long state;
@@ -912,6 +913,7 @@ static int vfile_schedlist_next(struct 
xnvfile_snapshot_iterator *it,
p->cprio = thread->cprio;
p->state = xnthread_state_flags(thread);
xnobject_copy_name(p->sched_class, thread->sched_class->name);
+   xnobject_copy_name(p->personality, thread->personality->name);
period = xnthread_get_period(thread);
timeout = xnthread_get_timeout(thread, priv->start_time);
/*
@@ -942,8 +944,8 @@ static int vfile_schedlist_show(struct 
xnvfile_snapshot_iterator *it,
 
if (p == NULL)
xnvfile_printf(it,
-  "%-3s  %-6s %-5s  %-8s %-8s  %-10s %s\n",
-  "CPU", "PID", "CLASS", "PRI", "TIMEOUT",
+  "%-3s  %-6s %-5s  %-8s  %-5s %-8s  %-10s %s\n",
+  "CPU", "PID", "CLASS", "PERS", "PRI", "TIMEOUT",
   "STAT", "NAME");
else {
ksformat(pbuf, sizeof(pbuf), "%3d", p->cprio);
@@ -951,10 +953,11 @@ static int vfile_schedlist_show(struct 
xnvfile_snapshot_iterator *it,
xnthread_format_status(p->state, sbuf, sizeof(sbuf));
 
xnvfile_printf(it,
-  "%3u  %-6d %-5s  %-8s %-8s  %-10s %s\n",
+  "%3u  %-6d %-5s  %-8s  %-5s %-8s  %-10s %s\n",
   p->cpu,
   p->pid,
   p->sched_class,
+  p->personality,
   pbuf,
   tbuf,
   sbuf,
diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c
index 7108645..1d188f6 100644
--- a/kernel/cobalt/shadow.c
+++ b/kernel/cobalt/shadow.c
@@ -2663,7 +2663,7 @@ void xnshadow_cleanup(void)
 
 /* Xenomai's generic personality. */
 struct xnpersonality xenomai_personality = {
-   .name = "xenomai",
+   .name = "core",
/* .magic = 0 */
 };
 EXPORT_SYMBOL_GPL(xenomai_personality);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : drivers/can: move to new-style atomic sections

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: e31409412306dc3d93b5e9f2817b48caae5655f7
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e31409412306dc3d93b5e9f2817b48caae5655f7

Author: Philippe Gerum 
Date:   Thu Apr 10 11:41:15 2014 +0200

drivers/can: move to new-style atomic sections

---

 kernel/drivers/can/rtcan_raw.c|   13 -
 kernel/drivers/can/rtcan_socket.c |   13 ++---
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/kernel/drivers/can/rtcan_raw.c b/kernel/drivers/can/rtcan_raw.c
index 960b7a6..fc9ac16 100644
--- a/kernel/drivers/can/rtcan_raw.c
+++ b/kernel/drivers/can/rtcan_raw.c
@@ -800,6 +800,7 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_dev_context *context,
 struct rtcan_device *dev;
 int ifindex = 0;
 int ret  = 0;
+spl_t s;
 
 
 if (flags & MSG_OOB)   /* Mirror BSD error message compatibility */
@@ -912,8 +913,9 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_dev_context *context,
 /* If socket was not closed recently, register the task at the
  * socket's TX wait queue and decrement the TX semaphore. This must be
  * atomic. Finally, the task must be deregistered again (also atomic). */
-RTDM_EXECUTE_ATOMICALLY(
-   if (likely(!test_bit(RTDM_CLOSING, &context->context_flags))) {
+rtdm_atomic_enter(s);
+
+if (likely(!test_bit(RTDM_CLOSING, &context->context_flags))) {
 
list_add(&tx_wait.tx_wait_list, &sock->tx_wait_head);
 
@@ -929,10 +931,11 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_dev_context 
*context,
/* The socket was closed. */
ret = -EBADF;
 
-   } else
+} else
/* The socket was closed. */
-   ret = -EBADF;
-   );
+   ret = -EBADF;
+
+rtdm_atomic_leave(s);
 
 /* Error code returned? */
 if (ret != 0) {
diff --git a/kernel/drivers/can/rtcan_socket.c 
b/kernel/drivers/can/rtcan_socket.c
index d78d1f6..62a54a6 100644
--- a/kernel/drivers/can/rtcan_socket.c
+++ b/kernel/drivers/can/rtcan_socket.c
@@ -74,12 +74,11 @@ void rtcan_socket_cleanup(struct rtdm_dev_context *context)
 
 /* Wake up sleeping senders. This is re-entrant-safe. */
 do {
-   RTDM_EXECUTE_ATOMICALLY(
-   /* Is someone there? */
-   if (list_empty(&sock->tx_wait_head))
+   rtdm_atomic_enter(lock_ctx);
+   /* Is someone there? */
+   if (list_empty(&sock->tx_wait_head))
tx_list_empty = 1;
-
-   else {
+   else {
tx_list_empty = 0;
 
/* Get next entry pointing to a waiting task */
@@ -91,8 +90,8 @@ void rtcan_socket_cleanup(struct rtdm_dev_context *context)
 
/* Wake task up (atomic section is left implicitly) */
rtdm_task_unblock(tx_waiting->rt_task);
-   }
-   );
+   }
+   rtdm_atomic_leave(lock_ctx);
 } while (!tx_list_empty);
 
 rtdm_sem_destroy(&sock->recv_sem);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate: snapshot configuration settings

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 130c228f7af894466558c25cc20078d7bf7ebc8c
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=130c228f7af894466558c25cc20078d7bf7ebc8c

Author: Philippe Gerum 
Date:   Mon Apr 14 12:35:34 2014 +0200

boilerplate: snapshot configuration settings

We need a way to retrieve the configuration settings used for building
the user-space stack.

To this end, those settings are snapshot during the build process and
stored in a NULL-terminated array of pointer to strings, so that any
client code linking against libboilerplate can retrieve them.

---

 configure |2 +-
 configure.ac  |2 +-
 include/boilerplate/ancillaries.h |2 ++
 lib/boilerplate/Makefile.am   |   13 +
 lib/boilerplate/Makefile.in   |   32 ++--
 lib/boilerplate/ancillaries.c |5 +
 6 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/configure b/configure
index 3d22f1a..9605e6e 100755
--- a/configure
+++ b/configure
@@ -14325,7 +14325,7 @@ if test x"$want_fortify" != xno; then
ac_fn_c_check_func "$LINENO" "__vfprintf_chk" "ac_cv_func___vfprintf_chk"
 if test "x$ac_cv_func___vfprintf_chk" = xyes; then :
 
-$as_echo "#define CONFIG_XENO_FORTIFY 1 " >>confdefs.h
+$as_echo "#define CONFIG_XENO_FORTIFY 1" >>confdefs.h
 
 else
   if test x"$want_fortify" = "xyes"; then
diff --git a/configure.ac b/configure.ac
index 2e7dc90..a2dbc05 100644
--- a/configure.ac
+++ b/configure.ac
@@ -758,7 +758,7 @@ AC_ARG_ENABLE([fortify],
 AC_MSG_RESULT(${want_fortify:-autodetect})
 if test x"$want_fortify" != xno; then
AC_CHECK_FUNC(__vfprintf_chk,
- [AC_DEFINE(CONFIG_XENO_FORTIFY, 1 ,[config])],
+ [AC_DEFINE(CONFIG_XENO_FORTIFY, 1,[config])],
  [if test x"$want_fortify" = "xyes"; then
  AC_MSG_ERROR([Fortify support enabled but not available in *libc])
   fi])
diff --git a/include/boilerplate/ancillaries.h 
b/include/boilerplate/ancillaries.h
index da1e827..b2c5b44 100644
--- a/include/boilerplate/ancillaries.h
+++ b/include/boilerplate/ancillaries.h
@@ -79,4 +79,6 @@ void boilerplate_init(void);
 }
 #endif
 
+extern const char *config_strings[];
+
 #endif /* _BOILERPLATE_ANCILLARIES_H */
diff --git a/lib/boilerplate/Makefile.am b/lib/boilerplate/Makefile.am
index 3e47fb2..2940df9 100644
--- a/lib/boilerplate/Makefile.am
+++ b/lib/boilerplate/Makefile.am
@@ -13,6 +13,19 @@ if XENO_DEBUG
 libboilerplate_la_SOURCES += debug.c
 endif
 
+nodist_libboilerplate_la_SOURCES = config-dump.h
+BUILT_SOURCES = config-dump.h
+CLEANFILES = config-dump.h
+
+config-dump.h: Makefile $(CONFIG_HEADER)
+   ( sed -e '/^#define CONFIG_/!d' \
+   -e 's/^#[\t ]*define \(CONFIG_[^ ]*\) \(.*\)/\1=\2/' \
+   -e 's,\",\\&,g' \
+   -e 's/^.*$$/\"&\",/' $(CONFIG_HEADER); echo '"---",'; \
+   sed -e '/#undef CONFIG_/!d' \
+   -e 's/.*\(CONFIG_[^ ]*\).*/\1/' \
+   -e 's/^.*$$/\"& is OFF\",/' $(CONFIG_HEADER) ) > $@
+
 libboilerplate_la_CPPFLAGS =   \
@XENO_USER_CFLAGS@  \
-I$(top_srcdir) \
diff --git a/lib/boilerplate/Makefile.in b/lib/boilerplate/Makefile.in
index b1c..a4829d4 100644
--- a/lib/boilerplate/Makefile.in
+++ b/lib/boilerplate/Makefile.in
@@ -107,7 +107,9 @@ am__libboilerplate_la_SOURCES_DIST = ancillaries.c hash.c 
obstack.c \
 am_libboilerplate_la_OBJECTS = libboilerplate_la-ancillaries.lo \
libboilerplate_la-hash.lo libboilerplate_la-obstack.lo \
libboilerplate_la-time.lo $(am__objects_1)
-libboilerplate_la_OBJECTS = $(am_libboilerplate_la_OBJECTS)
+nodist_libboilerplate_la_OBJECTS =
+libboilerplate_la_OBJECTS = $(am_libboilerplate_la_OBJECTS) \
+   $(nodist_libboilerplate_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
@@ -154,7 +156,8 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD" $@;
 am__v_CCLD_1 = 
-SOURCES = $(libboilerplate_la_SOURCES) $(libtlsf_la_SOURCES)
+SOURCES = $(libboilerplate_la_SOURCES) \
+   $(nodist_libboilerplate_la_SOURCES) $(libtlsf_la_SOURCES)
 DIST_SOURCES = $(am__libboilerplate_la_SOURCES_DIST) \
$(libtlsf_la_SOURCES)
 am__can_run_installinfo = \
@@ -357,6 +360,9 @@ noinst_LTLIBRARIES = libboilerplate.la $(am__append_2)
 libboilerplate_la_LDFLAGS = @XENO_LIB_LDFLAGS@ -version-info 0:0:0
 libboilerplate_la_SOURCES = ancillaries.c hash.c obstack.c time.c \
$(am__append_1)
+nodist_libboilerplate_la_SOURCES = config-dump.h
+BUILT_SOURCES = config-dump.h
+CLEANFILES = config-dump.h
 libboilerplate_la_CPPFLAGS = \
@XENO_USER_CFLAGS@  \
-I$(top_srcdir) \
@@ -378,7 +384,8 @@ libtlsf_la_CPPFLAGS = \
 
 EXTRA_DIST = tlsf/README
 SPARSE = sparse
-all: 

[Xenomai-git] Philippe Gerum : cobalt/bufd: introduce preemptible_only() predicate

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 794231497a71bb0d9e432dcbd123094101328df7
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=794231497a71bb0d9e432dcbd123094101328df7

Author: Philippe Gerum 
Date:   Thu Apr 17 12:37:38 2014 +0200

cobalt/bufd: introduce preemptible_only() predicate

---

 include/cobalt/kernel/assert.h |1 +
 kernel/cobalt/bufd.c   |8 
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/include/cobalt/kernel/assert.h b/include/cobalt/kernel/assert.h
index bf9be27..6a3b642 100644
--- a/include/cobalt/kernel/assert.h
+++ b/include/cobalt/kernel/assert.h
@@ -85,6 +85,7 @@
 #define secondary_mode_only()  XENO_BUGON(CONTEXT, !ipipe_root_p)
 #define interrupt_only()   XENO_BUGON(CONTEXT, !xnsched_interrupt_p())
 #define atomic_only()  XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) 
&& hard_irqs_disabled()) == 0)
+#define preemptible_only() XENO_BUGON(CONTEXT, xnlock_is_owner(&nklock) || 
hard_irqs_disabled())
 #define realtime_cpu_only()XENO_BUGON(CONTEXT, 
!xnsched_supported_cpu(ipipe_processor_id()))
 
 void __xnsys_assert_failed(const char *file, int line, const char *msg);
diff --git a/kernel/cobalt/bufd.c b/kernel/cobalt/bufd.c
index 78a0b6a..d05b238 100644
--- a/kernel/cobalt/bufd.c
+++ b/kernel/cobalt/bufd.c
@@ -332,7 +332,7 @@ ssize_t xnbufd_copy_to_kmem(void *to, struct xnbufd *bufd, 
size_t len)
 */
if (xnthread_test_state(xnsched_current_thread(), XNROOT|XNUSER) &&
!xnsched_interrupt_p() && current->mm == bufd->b_mm) {
-   XENO_BUGON(NUCLEUS, xnlock_is_owner(&nklock) || spltest());
+   preemptible_only();
if (__xn_safe_copy_from_user(to, (void __user *)from, len))
return -EFAULT;
goto advance_offset;
@@ -438,7 +438,7 @@ ssize_t xnbufd_copy_from_kmem(struct xnbufd *bufd, void 
*from, size_t len)
 */
if (xnthread_test_state(xnsched_current_thread(), XNROOT|XNUSER) &&
!xnsched_interrupt_p() && current->mm == bufd->b_mm) {
-   XENO_BUGON(NUCLEUS, xnlock_is_owner(&nklock) || spltest());
+   preemptible_only();
if (__xn_safe_copy_to_user((void __user *)to, from, len))
return -EFAULT;
goto advance_offset;
@@ -499,7 +499,7 @@ EXPORT_SYMBOL_GPL(xnbufd_copy_from_kmem);
 
 ssize_t xnbufd_unmap_uread(struct xnbufd *bufd)
 {
-   XENO_BUGON(NUCLEUS, xnlock_is_owner(&nklock) || spltest());
+   preemptible_only();
 
 #if XENO_DEBUG(NUCLEUS)
bufd->b_ptr = (caddr_t)-1;
@@ -541,7 +541,7 @@ ssize_t xnbufd_unmap_uwrite(struct xnbufd *bufd)
void *from;
size_t len;
 
-   XENO_BUGON(NUCLEUS, xnlock_is_owner(&nklock) || spltest());
+   preemptible_only();
 
len = bufd->b_off;
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/init: emit boot notice for enabled event tracing

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 9e34100f037ca25970c50e447dade73364f9ff82
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=9e34100f037ca25970c50e447dade73364f9ff82

Author: Philippe Gerum 
Date:   Fri Apr 18 18:02:14 2014 +0200

cobalt/init: emit boot notice for enabled event tracing

---

 kernel/cobalt/init.c |   17 -
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/kernel/cobalt/init.c b/kernel/cobalt/init.c
index e753820..8a80337 100644
--- a/kernel/cobalt/init.c
+++ b/kernel/cobalt/init.c
@@ -71,15 +71,21 @@ struct xnsys_ppd __xnsys_global_ppd = {
 EXPORT_SYMBOL_GPL(__xnsys_global_ppd);
 
 #ifdef CONFIG_XENO_OPT_DEBUG
-#define boot_debug_notice " [DEBUG]"
+#define boot_debug_notice "[DEBUG]"
 #else
 #define boot_debug_notice ""
 #endif
 
 #ifdef CONFIG_IPIPE_TRACE
-#define boot_trace_notice " [TRACE]"
+#define boot_lat_trace_notice "[LTRACE]"
 #else
-#define boot_trace_notice ""
+#define boot_lat_trace_notice ""
+#endif
+
+#ifdef CONFIG_ENABLE_DEFAULT_TRACERS
+#define boot_evt_trace_notice "[ETRACE]"
+#else
+#define boot_evt_trace_notice ""
 #endif
 
 static void disable_timesource(void)
@@ -422,10 +428,11 @@ static int __init xenomai_init(void)
if (ret)
goto cleanup_rtdm;
 
-   printk(XENO_INFO "Cobalt v%s enabled%s%s\n",
+   printk(XENO_INFO "Cobalt v%s enabled %s%s%s\n",
   XENO_VERSION_STRING,
   boot_debug_notice,
-  boot_trace_notice);
+  boot_lat_trace_notice,
+  boot_evt_trace_notice);
 
return 0;
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : build: drop __XENO_DEBUG__, XENO_DEBUG_FULL__ from built-in CFLAGS

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: cf0d65376576a4f0e8151b2bd48f70980e457d45
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=cf0d65376576a4f0e8151b2bd48f70980e457d45

Author: Philippe Gerum 
Date:   Wed Apr 16 18:35:06 2014 +0200

build: drop __XENO_DEBUG__, XENO_DEBUG_FULL__ from built-in CFLAGS

These are redundant with CONFIG_XENO_DEBUG, CONFIG_XENO_DEBUG_FULL
respectively, available from xeno_config.h.

---

 README.INSTALL   |6 +++---
 configure|4 ++--
 configure.ac |4 ++--
 doc/asciidoc/README.INSTALL.adoc |   12 ++--
 include/boilerplate/debug.h  |7 ---
 include/boilerplate/lock.h   |2 +-
 include/copperplate/debug.h  |6 +++---
 include/copperplate/syncobj.h|6 +++---
 include/copperplate/threadobj.h  |6 +++---
 lib/boilerplate/ancillaries.c|4 ++--
 lib/copperplate/init.c   |4 ++--
 11 files changed, 31 insertions(+), 30 deletions(-)

diff --git a/README.INSTALL b/README.INSTALL
index 4ec8330..d9de2ec 100644
--- a/README.INSTALL
+++ b/README.INSTALL
@@ -360,7 +360,7 @@ partial]   available, with varying overhead:
running the application at nominal speed.
  * partial includes symbols, and also turns on internal
consistency checks within the Xenomai code (mostly
-   present in the Copperplate layer). The __XENO_DEBUG__
+   present in the Copperplate layer). The CONFIG_XENO_DEBUG
macro is defined, for both the Xenomai libraries and the
applications getting their C compilation flags from the
xeno-config script (i.e. xeno-config --cflags). The
@@ -370,8 +370,8 @@ partial]   available, with varying overhead:
with no level specification.
  * full includes partial settings, but the optimizer is
disabled (-O0), and even more consistency checks may be
-   performed. In addition to __XENO_DEBUG__, the macro
-   __XENO_DEBUG_FULL__ is defined. This level introduces
+   performed. In addition to CONFIG_XENO_DEBUG, the macro
+   CONFIG_XENO_DEBUG_FULL is defined. This level introduces
the most overhead, which may triple the worst-case
latency, or even more.
 
diff --git a/configure b/configure
index 9605e6e..8cb3f17 100755
--- a/configure
+++ b/configure
@@ -14108,9 +14108,9 @@ XENO_USER_CFLAGS="$XENO_USER_APP_CFLAGS -pipe 
-fstrict-aliasing \
 XENO_USER_LDADD="$XENO_USER_APP_LDFLAGS"
 
 if test x$debug_mode = xpartial; then
-   XENO_USER_CFLAGS="-g -O2 -D__XENO_DEBUG__ $XENO_USER_CFLAGS"
+   XENO_USER_CFLAGS="-g -O2 $XENO_USER_CFLAGS"
 elif test x$debug_mode = xfull; then
-   XENO_USER_CFLAGS="-g -O0 -D__XENO_DEBUG__ -D__XENO_DEBUG_FULL__ 
$XENO_USER_CFLAGS"
+   XENO_USER_CFLAGS="-g -O0 $XENO_USER_CFLAGS"
 elif test x$debug_symbols = xy; then
XENO_USER_CFLAGS="-g -O2 $XENO_USER_CFLAGS"
 else
diff --git a/configure.ac b/configure.ac
index a2dbc05..837477f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -609,9 +609,9 @@ XENO_USER_CFLAGS="$XENO_USER_APP_CFLAGS -pipe 
-fstrict-aliasing \
 XENO_USER_LDADD="$XENO_USER_APP_LDFLAGS"
 
 if test x$debug_mode = xpartial; then
-   XENO_USER_CFLAGS="-g -O2 -D__XENO_DEBUG__ $XENO_USER_CFLAGS"
+   XENO_USER_CFLAGS="-g -O2 $XENO_USER_CFLAGS"
 elif test x$debug_mode = xfull; then
-   XENO_USER_CFLAGS="-g -O0 -D__XENO_DEBUG__ -D__XENO_DEBUG_FULL__ 
$XENO_USER_CFLAGS"
+   XENO_USER_CFLAGS="-g -O0 $XENO_USER_CFLAGS"
 elif test x$debug_symbols = xy; then
XENO_USER_CFLAGS="-g -O2 $XENO_USER_CFLAGS"
 else
diff --git a/doc/asciidoc/README.INSTALL.adoc b/doc/asciidoc/README.INSTALL.adoc
index 4b79f4f..031feaa 100644
--- a/doc/asciidoc/README.INSTALL.adoc
+++ b/doc/asciidoc/README.INSTALL.adoc
@@ -360,10 +360,10 @@ Generic configuration options (both cores)
 
- _partial_ includes _symbols_, and also turns on internal
consistency checks within the Xenomai code (mostly present in
-   the Copperplate layer). The `__XENO_DEBUG__` macro is defined,
-   for both the Xenomai libraries and the applications getting
-   their C compilation flags from the +xeno-config+ script
-   (i.e. +xeno-config --cflags+). The partial debug mode
+   the Copperplate layer). The `CONFIG_XENO_DEBUG` macro is
+   defined, for both the Xenomai libraries and the applications
+   getting their C compilation flags from the +xeno-config+
+   script (i.e. +xeno-config --cflags+). The partial debug mode
implicitly turns on +--enable-assert+. A measurable overhead
is introduced by this level.  This is the default level when
+--enable-debug+ is mentioned with no level specification.
@@ -

[Xenomai-git] Philippe Gerum : cobalt/sched: use fixed level range for O(1) scheduler

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: c17fca7588d0eb25e34edfa7a1dcf72bb654c793
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=c17fca7588d0eb25e34edfa7a1dcf72bb654c793

Author: Philippe Gerum 
Date:   Mon Apr 14 17:30:13 2014 +0200

cobalt/sched: use fixed level range for O(1) scheduler

Fix the valid range of runlevels in the O(1) scheduler queue to
[XNSCHED_RT_MIN_PRIO..XNSCHED_RT_MAX_PRIO], as threads may cross
policies freely during PIP boosts, therefore all possible priority
level must be valid for all scheduler queues, regardless of the
policy.

---

 include/cobalt/kernel/sched-rt.h   |2 +-
 include/cobalt/kernel/sched-weak.h |4 ++--
 include/cobalt/kernel/sched.h  |2 +-
 include/cobalt/kernel/schedqueue.h |   11 +--
 kernel/cobalt/sched-quota.c|3 +--
 kernel/cobalt/sched-rt.c   |3 +--
 kernel/cobalt/sched-tp.c   |7 +++
 kernel/cobalt/sched-weak.c |3 +--
 kernel/cobalt/sched.c  |   11 ---
 9 files changed, 19 insertions(+), 27 deletions(-)

diff --git a/include/cobalt/kernel/sched-rt.h b/include/cobalt/kernel/sched-rt.h
index 1b49be9..4655ac9 100644
--- a/include/cobalt/kernel/sched-rt.h
+++ b/include/cobalt/kernel/sched-rt.h
@@ -42,7 +42,7 @@
 #define XNSCHED_FIFO_MIN_PRIO  1
 #define XNSCHED_FIFO_MAX_PRIO  99
 
-#if XNSCHED_RT_NR_PRIO > XNSCHED_CLASS_MAX_PRIO || \
+#if XNSCHED_RT_NR_PRIO > XNSCHED_CLASS_WEIGHT_FACTOR ||\
   (defined(CONFIG_XENO_OPT_SCALABLE_SCHED) &&  \
XNSCHED_RT_NR_PRIO > XNSCHED_MLQ_LEVELS)
 #error "RT class has too many priority levels"
diff --git a/include/cobalt/kernel/sched-weak.h 
b/include/cobalt/kernel/sched-weak.h
index 1a038d8..132c293 100644
--- a/include/cobalt/kernel/sched-weak.h
+++ b/include/cobalt/kernel/sched-weak.h
@@ -29,8 +29,8 @@
 #define XNSCHED_WEAK_MAX_PRIO  99
 #define XNSCHED_WEAK_NR_PRIO   (XNSCHED_WEAK_MAX_PRIO - XNSCHED_WEAK_MIN_PRIO 
+ 1)
 
-#if XNSCHED_WEAK_NR_PRIO > XNSCHED_CLASS_MAX_PRIO ||   \
-   (defined(CONFIG_XENO_OPT_SCALABLE_SCHED) && \
+#if XNSCHED_WEAK_NR_PRIO > XNSCHED_CLASS_WEIGHT_FACTOR ||  \
+   (defined(CONFIG_XENO_OPT_SCALABLE_SCHED) && \
 XNSCHED_WEAK_NR_PRIO > XNSCHED_MLQ_LEVELS)
 #error "WEAK class has too many priority levels"
 #endif
diff --git a/include/cobalt/kernel/sched.h b/include/cobalt/kernel/sched.h
index f4a47f9..00c6fcf 100644
--- a/include/cobalt/kernel/sched.h
+++ b/include/cobalt/kernel/sched.h
@@ -164,7 +164,7 @@ struct xnsched_class {
const char *name;
 };
 
-#define XNSCHED_CLASS_WEIGHT(n)(n * XNSCHED_CLASS_MAX_PRIO)
+#define XNSCHED_CLASS_WEIGHT(n)(n * 
XNSCHED_CLASS_WEIGHT_FACTOR)
 
 /* Placeholder for current thread priority */
 #define XNSCHED_RUNPRIO   0x8000
diff --git a/include/cobalt/kernel/schedqueue.h 
b/include/cobalt/kernel/schedqueue.h
index b671f5c..15817b2 100644
--- a/include/cobalt/kernel/schedqueue.h
+++ b/include/cobalt/kernel/schedqueue.h
@@ -22,7 +22,7 @@
 
 #include 
 
-#define XNSCHED_CLASS_MAX_PRIO 1024
+#define XNSCHED_CLASS_WEIGHT_FACTOR1024
 
 #ifdef CONFIG_XENO_OPT_SCALABLE_SCHED
 /*
@@ -40,7 +40,7 @@
 #define __MLQ_LONGS ((XNSCHED_MLQ_LEVELS+BITS_PER_LONG-1)/BITS_PER_LONG)
 
 struct xnsched_mlq {
-   int loprio, hiprio, elems;
+   int elems;
unsigned long himap, lomap[__MLQ_LONGS];
struct list_head heads[XNSCHED_MLQ_LEVELS];
 };
@@ -49,8 +49,7 @@ struct xnsched_mlq {
 
 struct xnthread;
 
-void xnsched_initq(struct xnsched_mlq *q,
-  int loprio, int hiprio);
+void xnsched_initq(struct xnsched_mlq *q);
 
 void xnsched_addq(struct xnsched_mlq *q,
  struct xnthread *thread);
@@ -81,11 +80,11 @@ typedef struct xnsched_mlq xnsched_queue_t;
 
 typedef struct list_head xnsched_queue_t;
 
-#define xnsched_initq(__q, __minp, __maxp) INIT_LIST_HEAD(__q)
+#define xnsched_initq(__q) INIT_LIST_HEAD(__q)
 #define xnsched_emptyq_p(__q)  list_empty(__q)
 #define xnsched_addq(__q, __t) list_add_prilf(__t, __q, cprio, 
rlink)
 #define xnsched_addq_tail(__q, __t)list_add_priff(__t, __q, cprio, 
rlink)
-#define xnsched_delq(__q, __t) list_del(&(__t)->rlink)
+#define xnsched_delq(__q, __t) (void)(__q), 
list_del(&(__t)->rlink)
 #define xnsched_getq(__q)  
\
({  
\
struct xnthread *__t = NULL;
\
diff --git a/kernel/cobalt/sched-quota.c b/kernel/cobalt/sched-quota.c
index efe5c2b..fd56003 100644
--- a/kernel/cobalt/sched-quota.c
+++ b/kernel/cobalt/sched-quota.c
@@ -224,8 +224,7 @@ static void xnsched_quota_init(struct xnsched *sched)
 * CAUTION: we may inherit RT priority during PIP boost, so we
 * need as many leve

[Xenomai-git] Philippe Gerum : vxworks/init: assign explicit priority to constructor

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 23a32fa05d7776ab4b1d5eaccb131642a5c0b0a5
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=23a32fa05d7776ab4b1d5eaccb131642a5c0b0a5

Author: Philippe Gerum 
Date:   Tue Apr 15 10:40:40 2014 +0200

vxworks/init: assign explicit priority to constructor

---

 lib/vxworks/Makefile.am |1 +
 lib/vxworks/Makefile.in |1 +
 lib/vxworks/init.c  |3 ++-
 lib/vxworks/init.h  |   25 +
 4 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/lib/vxworks/Makefile.am b/lib/vxworks/Makefile.am
index a99af87..f012f3e 100644
--- a/lib/vxworks/Makefile.am
+++ b/lib/vxworks/Makefile.am
@@ -4,6 +4,7 @@ libvxworks_la_LDFLAGS = @XENO_LIB_LDFLAGS@ -version-info 0:0:0
 
 libvxworks_la_SOURCES = \
init.c  \
+   init.h  \
errnoLib.c  \
intLib.c\
kernLib.c   \
diff --git a/lib/vxworks/Makefile.in b/lib/vxworks/Makefile.in
index 21c7d4a..600210e 100644
--- a/lib/vxworks/Makefile.in
+++ b/lib/vxworks/Makefile.in
@@ -379,6 +379,7 @@ lib_LTLIBRARIES = libvxworks.la
 libvxworks_la_LDFLAGS = @XENO_LIB_LDFLAGS@ -version-info 0:0:0
 libvxworks_la_SOURCES = \
init.c  \
+   init.h  \
errnoLib.c  \
intLib.c\
kernLib.c   \
diff --git a/lib/vxworks/init.c b/lib/vxworks/init.c
index 45ae6b9..46372b9 100644
--- a/lib/vxworks/init.c
+++ b/lib/vxworks/init.c
@@ -23,6 +23,7 @@
 #include 
 #include 
 #include 
+#include "init.h"
 #include "tickLib.h"
 #include "taskLib.h"
 
@@ -95,7 +96,7 @@ static struct copperskin vxworks_skin = {
.help = vxworks_help,
 };
 
-static __attribute__ ((constructor)) void register_vxworks(void)
+static __libvxworks_ctor void register_vxworks(void)
 {
copperplate_register_skin(&vxworks_skin);
 }
diff --git a/lib/vxworks/init.h b/lib/vxworks/init.h
new file mode 100644
index 000..a45bfc1
--- /dev/null
+++ b/lib/vxworks/init.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2014 Philippe Gerum .
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef _VXWORKS_INIT_H
+#define _VXWORKS_INIT_H
+
+#define __LIBVXWORKS_CTOR_PRIO  300
+
+#define __libvxworks_ctor  __attribute__ 
((constructor(__LIBVXWORKS_CTOR_PRIO)))
+
+#endif /* _VXWORKS_INIT_H */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/regd: rebase systemfs handlers over fsobstacks

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: aa44c70383cf68e37cb57c3a05ce4de15fef1974
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=aa44c70383cf68e37cb57c3a05ce4de15fef1974

Author: Philippe Gerum 
Date:   Fri Apr 11 11:47:17 2014 +0200

copperplate/regd: rebase systemfs handlers over fsobstacks

This fixes a long-standing bug which caused random duplicate output
from the systemfs handlers, due to misusing the fuse read() method.

---

 include/copperplate/registry-obstack.h |2 ++
 lib/copperplate/regd/fs-cobalt.c   |   47 +---
 lib/copperplate/regd/fs-common.c   |   61 ++--
 lib/copperplate/regd/fs-mercury.c  |   12 +--
 lib/copperplate/regd/regd.c|2 +-
 lib/copperplate/regd/sysregfs.h|   14 +++-
 6 files changed, 68 insertions(+), 70 deletions(-)

diff --git a/include/copperplate/registry-obstack.h 
b/include/copperplate/registry-obstack.h
index 0fd1e1c..aaafaa5 100644
--- a/include/copperplate/registry-obstack.h
+++ b/include/copperplate/registry-obstack.h
@@ -32,6 +32,8 @@
 #define obstack_chunk_allocpvmalloc
 #define obstack_chunk_free pvfree
 
+struct threadobj;
+
 struct fsobstack {
struct obstack obstack;
void *data;
diff --git a/lib/copperplate/regd/fs-cobalt.c b/lib/copperplate/regd/fs-cobalt.c
index 1260e59..b7c1034 100644
--- a/lib/copperplate/regd/fs-cobalt.c
+++ b/lib/copperplate/regd/fs-cobalt.c
@@ -88,43 +88,24 @@ char *format_thread_status(const struct thread_data *p, 
char *buf, size_t len)
  */
 
 #define PROC_PULL_HANDLER(__name, __path)  \
-ssize_t read_ ## __name(struct fsobj *fsobj, char *buf,
\
-   size_t size, off_t offset,  \
-   void *priv) \
+int open_ ## __name(struct fsobj *fsobj, void *priv)   \
 {  \
-   return pull_proc_data("/proc/xenomai/" __path, buf, size);  \
+   return pull_proc_data("/proc/xenomai/" __path, priv);   \
 }
 
 /*
  * Cobalt-specific helper to pull the /proc vfile data provided by the
  * nucleus over a fuse-managed vfile.
  */
-static ssize_t pull_proc_data(const char *procpath, char *buf, size_t size)
+static int pull_proc_data(const char *path, struct fsobstack *o)
 {
-   size_t len = 0;
-   FILE *fp;
-   int c;
-
-   if (size == 0)
-   return 0;
-
-   fp = fopen(procpath, "r");
-   if (fp == NULL)
-   return -errno;
-
-   while (len < size) {
-   c = fgetc(fp);
-   if (c == EOF) {
-   if (ferror(fp))
-   len = -errno;
-   break;
-   }
-   buf[len++] = c;
-   }
+   int len;
 
-   fclose(fp);
+   fsobstack_init(o);
+   len = fsobstack_grow_file(o, path);
+   fsobstack_finish(o);
 
-   return (ssize_t)len;
+   return len < 0 ? len : 0;
 }
 
 PROC_PULL_HANDLER(threads, "/sched/threads");
@@ -143,21 +124,27 @@ struct sysreg_fsfile sysreg_files[] = {
.path = "/threads",
.mode = O_RDONLY,
.ops = {
-   .read = read_threads,
+   .open = open_threads,
+   .release = fsobj_obstack_release,
+   .read = fsobj_obstack_read
},
},
{
.path = "/heaps",
.mode = O_RDONLY,
.ops = {
-   .read = read_heaps,
+   .open = open_heaps,
+   .release = fsobj_obstack_release,
+   .read = fsobj_obstack_read
},
},
{
.path = "/version",
.mode = O_RDONLY,
.ops = {
-   .read = read_version,
+   .open = open_version,
+   .release = fsobj_obstack_release,
+   .read = fsobj_obstack_read
},
},
{
diff --git a/lib/copperplate/regd/fs-common.c b/lib/copperplate/regd/fs-common.c
index b689b44..6346320 100644
--- a/lib/copperplate/regd/fs-common.c
+++ b/lib/copperplate/regd/fs-common.c
@@ -67,23 +67,23 @@ static char *format_time(ticks_t value, char *buf, size_t 
bufsz)
return buf;
 }
 
-ssize_t read_threads(struct fsobj *fsobj, char *buf,
-size_t size, off_t offset,
-void *priv)
+int open_threads(struct fsobj *fsobj, void *priv)
 {
struct thread_data *thread_data, *p;
char sbuf[64], pbuf[16], tbuf[64];
struct threadobj_stat statbuf;
struct sysgroup_memspec *obj;
+   struct fsobstack *o = priv;
struct threadobj *thobj;
const char *sch

[Xenomai-git] Philippe Gerum : cobalt/rtdm: introduce wait queues in API

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 99fadbc7904ac0796ee5da2850418e9039117116
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=99fadbc7904ac0796ee5da2850418e9039117116

Author: Philippe Gerum 
Date:   Thu Apr 10 11:40:15 2014 +0200

cobalt/rtdm: introduce wait queues in API

---

 include/cobalt/kernel/rtdm/driver.h |  183 +--
 1 file changed, 176 insertions(+), 7 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index 9c432c4..bbcc6fb 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -605,6 +605,12 @@ static inline nanosecs_abs_t 
rtdm_clock_read_monotonic(void)
 }
 #endif /* !DOXYGEN_CPP */
 
+/* --- timeout sequences */
+
+typedef nanosecs_abs_t rtdm_toseq_t;
+
+void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, nanosecs_rel_t timeout);
+
 /*!
  * @addtogroup rtdmsync
  * @{
@@ -620,7 +626,7 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
  */
 
 /**
- * @brief Execute code block atomically
+ * @brief Execute code block atomically (DEPRECATED)
  *
  * Generally, it is illegal to suspend the current task by calling
  * rtdm_task_sleep(), rtdm_event_wait(), etc. while holding a spinlock. In
@@ -650,6 +656,9 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
  * - User-space task (RT, non-RT)
  *
  * Rescheduling: possible, depends on functions called within @a code_block.
+ *
+ * @warning This construct is deprecated. Please use
+ * rtdm_atomic_enter/leave, or rtdm_waitqueue services instead.
  */
 #ifdef DOXYGEN_CPP /* Beautify doxygen output */
 #define RTDM_EXECUTE_ATOMICALLY(code_block)\
@@ -670,6 +679,7 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
xnlock_put_irqrestore(&nklock, __rtdm_s);   \
 }
 #endif
+
 /** @} Global Lock across Scheduler Invocation */
 
 /*!
@@ -845,8 +855,173 @@ void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, 
rtdm_lockctx_t s)
  */
 #define rtdm_lock_irqrestore(context)  \
splexit(context)
+
+/**
+ * @brief Enter atomic section
+ *
+ * This call opens a fully atomic section, serializing execution with
+ * respect to all interrupt handlers (including for real-time IRQs)
+ * and Xenomai threads running on all CPUs.
+ *
+ * @param context name of local variable to store the context in. This
+ * variable updated by the real-time core will hold the information
+ * required to leave the atomic section properly.
+ *
+ * @note Atomic sections may be nested.
+ *
+ * @note Since the strongest lock is acquired by this service, it can
+ * be used to synchronize real-time and non-real-time contexts.
+ */
+#define rtdm_atomic_enter(context) \
+   do {\
+   xnlock_get_irqsave(&nklock, (context)); \
+   __xnsched_lock();   \
+   } while (0)
+
+/**
+ * @brief Leave atomic section
+ *
+ * This call closes an atomic section previously opened by a call to
+ * rtdm_atomic_enter(), restoring the preemption and interrupt state
+ * which prevailed prior to entering the exited section.
+ *
+ * @param context name of local variable which stored the context.
+ */
+#define rtdm_atomic_leave(context) \
+   do {\
+   __xnsched_unlock(); \
+   xnlock_put_irqrestore(&nklock, (context));  \
+   } while (0)
+
 /** @} Spinlock with Preemption Deactivation */
 
+/*!
+ * @name Signal, test and wait for a condition atomically
+ * @{
+ */
+struct rtdm_waitqueue {
+   struct xnsynch wait;
+};
+typedef struct rtdm_waitqueue rtdm_waitqueue_t;
+
+#define RTDM_WAITQUEUE_INITIALIZER(__name) {\
+   .wait = XNSYNCH_WAITQUEUE_INITIALIZER((__name).wait), \
+   }
+
+#define DEFINE_RTDM_WAITQUEUE(__name)  \
+   struct rtdm_waitqueue __name = RTDM_WAITQUEUE_INITIALIZER(__name)
+
+#define DEFINE_RTDM_WAITQUEUE_ONSTACK(__name)  \
+   DEFINE_RTDM_WAITQUEUE(__name)
+
+static inline void rtdm_waitqueue_init(struct rtdm_waitqueue *wq)
+{
+   *wq = (struct rtdm_waitqueue)RTDM_WAITQUEUE_INITIALIZER(*wq);
+}
+
+static inline void rtdm_waitqueue_destroy(struct rtdm_waitqueue *wq)
+{
+   xnsynch_destroy(&wq->wait);
+}
+
+static inline int __rtdm_timedwait(struct rtdm_waitqueue *wq,
+  nanosecs_rel_t timeout, rtdm_toseq_t *toseq)
+{
+   if (toseq && timeout > 0)
+   return xnsynch_sleep_on(&wq->wait, *toseq, XN_ABSOLUTE);
+
+   return xnsynch_sleep_on(&wq->wait, timeout, XN_RELATIVE);
+}
+
+#define rtdm_timedwait_condition_locked(__wq, __cond, __timeout, __toseq) \
+   ({  \
+   int __ret = 0;  \
+   while (__ret == 0 && !(__co

[Xenomai-git] Philippe Gerum : copperplate/registry: introduce fsobstack_grow_file() helper

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 273dc2c1d09e2c24377ed239072a7cb45d9c0f22
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=273dc2c1d09e2c24377ed239072a7cb45d9c0f22

Author: Philippe Gerum 
Date:   Fri Apr 11 11:46:21 2014 +0200

copperplate/registry: introduce fsobstack_grow_file() helper

---

 include/copperplate/registry-obstack.h |3 +++
 lib/copperplate/registry.c |   26 ++
 2 files changed, 29 insertions(+)

diff --git a/include/copperplate/registry-obstack.h 
b/include/copperplate/registry-obstack.h
index a08afef..0fd1e1c 100644
--- a/include/copperplate/registry-obstack.h
+++ b/include/copperplate/registry-obstack.h
@@ -54,6 +54,9 @@ extern "C" {
 int fsobstack_grow_format(struct fsobstack *o,
  const char *fmt, ...);
 
+int fsobstack_grow_file(struct fsobstack *o,
+   const char *path);
+
 int fsobstack_grow_syncobj_grant(struct fsobstack *o,
 struct syncobj *sobj,
 struct fsobstack_syncops *ops);
diff --git a/lib/copperplate/registry.c b/lib/copperplate/registry.c
index ef6aa45..fe8153a 100644
--- a/lib/copperplate/registry.c
+++ b/lib/copperplate/registry.c
@@ -822,6 +822,32 @@ int fsobstack_grow_format(struct fsobstack *o, const char 
*fmt, ...)
return -ENOMEM;
 }
 
+int fsobstack_grow_file(struct fsobstack *o, const char *path)
+{
+   int len = 0;
+   FILE *fp;
+   int c;
+   
+   fp = fopen(path, "r");
+   if (fp == NULL)
+   return -errno;
+
+   for (;;) {
+   c = fgetc(fp);
+   if (c == EOF) {
+   if (ferror(fp))
+   len = -errno;
+   break;
+   }
+   obstack_1grow(&o->obstack, c);
+   len++;
+   }
+
+   fclose(fp);
+
+   return len;
+}
+
 ssize_t fsobstack_pull(struct fsobstack *o, char *buf, size_t size)
 {
size_t len;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : vxworks: enable error checking for mutexes in debug mode

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 08287e8cc7eadda788f2380c41b9ab31bb52b01a
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=08287e8cc7eadda788f2380c41b9ab31bb52b01a

Author: Philippe Gerum 
Date:   Wed Apr 16 16:56:22 2014 +0200

vxworks: enable error checking for mutexes in debug mode

---

 lib/vxworks/memPartLib.c |1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/vxworks/memPartLib.c b/lib/vxworks/memPartLib.c
index 9d4d2c3..10d6c2f 100644
--- a/lib/vxworks/memPartLib.c
+++ b/lib/vxworks/memPartLib.c
@@ -63,6 +63,7 @@ PART_ID memPartCreate(char *pPool, unsigned int poolSize)
}
 
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, mutex_scope_attribute));
__RT(pthread_mutex_init(&mp->lock, &mattr));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/intr: drop typedefs for non-opaque aggregates

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: d8fd879be890d9fe70bb8e6ce3982049f7f3788e
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d8fd879be890d9fe70bb8e6ce3982049f7f3788e

Author: Philippe Gerum 
Date:   Tue Apr 15 17:34:29 2014 +0200

cobalt/intr: drop typedefs for non-opaque aggregates

---

 include/cobalt/kernel/intr.h|   38 ++--
 include/cobalt/kernel/rtdm/driver.h |2 +-
 kernel/cobalt/intr.c|   86 +--
 3 files changed, 57 insertions(+), 69 deletions(-)

diff --git a/include/cobalt/kernel/intr.h b/include/cobalt/kernel/intr.h
index 8f3c40d..ab1f9f1 100644
--- a/include/cobalt/kernel/intr.h
+++ b/include/cobalt/kernel/intr.h
@@ -55,7 +55,7 @@ struct xnirqstat {
xnstat_exectime_t sum;
 };
 
-typedef struct xnintr {
+struct xnintr {
 #ifdef CONFIG_XENO_OPT_SHIRQ
/* !< Next object in the IRQ-sharing chain. */
struct xnintr *next;
@@ -76,27 +76,19 @@ typedef struct xnintr {
const char *name;
/* !< Statistics. */
struct xnirqstat *stats;
-} xnintr_t;
-
-typedef struct xnintr_iterator {
+};
 
+struct xnintr_iterator {
 int cpu;   /* !< Current CPU in iteration. */
-
 unsigned long hits;/* !< Current hit counter. */
-
 xnticks_t exectime_period; /* !< Used CPU time in current accounting 
period. */
-
 xnticks_t account_period; /* !< Length of accounting period. */
-
 xnticks_t exectime_total;  /* !< Overall CPU time consumed. */
-
 int list_rev;  /* !< System-wide xnintr list revision (internal use). 
*/
+struct xnintr *prev;   /* !< Previously visited xnintr object 
(internal use). */
+};
 
-xnintr_t *prev;/* !< Previously visited xnintr object (internal use). 
*/
-
-} xnintr_iterator_t;
-
-extern xnintr_t nktimer;
+extern struct xnintr nktimer;
 
 int xnintr_mount(void);
 
@@ -110,34 +102,34 @@ void xnintr_cleanup_proc(void);
 
 /* Public interface. */
 
-int xnintr_init(xnintr_t *intr,
+int xnintr_init(struct xnintr *intr,
const char *name,
unsigned irq,
xnisr_t isr,
xniack_t iack,
int flags);
 
-void xnintr_destroy(xnintr_t *intr);
+void xnintr_destroy(struct xnintr *intr);
 
-int xnintr_attach(xnintr_t *intr,
+int xnintr_attach(struct xnintr *intr,
  void *cookie);
 
-void xnintr_detach(xnintr_t *intr);
+void xnintr_detach(struct xnintr *intr);
 
-void xnintr_enable(xnintr_t *intr);
+void xnintr_enable(struct xnintr *intr);
 
-void xnintr_disable(xnintr_t *intr);
+void xnintr_disable(struct xnintr *intr);
 
-void xnintr_affinity(xnintr_t *intr,
+void xnintr_affinity(struct xnintr *intr,
 cpumask_t cpumask);
 
-int xnintr_query_init(xnintr_iterator_t *iterator);
+int xnintr_query_init(struct xnintr_iterator *iterator);
 
 int xnintr_get_query_lock(void);
 
 void xnintr_put_query_lock(void);
 
-int xnintr_query_next(int irq, xnintr_iterator_t *iterator,
+int xnintr_query_next(int irq, struct xnintr_iterator *iterator,
  char *name_buf);
 
 #endif /* !_COBALT_KERNEL_INTR_H */
diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index 78ce5e4..47e59b2 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -853,7 +853,7 @@ void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, 
rtdm_lockctx_t s)
  * @{
  */
 
-typedef xnintr_t rtdm_irq_t;
+typedef struct xnintr rtdm_irq_t;
 
 /*!
  * @anchor RTDM_IRQTYPE_xxx   @name RTDM_IRQTYPE_xxx
diff --git a/kernel/cobalt/intr.c b/kernel/cobalt/intr.c
index 47512fe..0b82bd6 100644
--- a/kernel/cobalt/intr.c
+++ b/kernel/cobalt/intr.c
@@ -75,7 +75,7 @@ static inline void sync_stat_references(struct xnintr *intr)
 #else
 static inline void stat_counter_inc(void) {}
 static inline void stat_counter_dec(void) {}
-static inline void sync_stat_references(xnintr_t *intr) {}
+static inline void sync_stat_references(struct xnintr *intr) {}
 #endif /* CONFIG_XENO_OPT_STATS */
 
 static void xnintr_irq_handler(unsigned irq, void *cookie);
@@ -148,23 +148,20 @@ void xnintr_core_clock_handler(void)
 
 #ifdef CONFIG_XENO_OPT_SHIRQ
 
-typedef struct xnintr_irq {
-
+struct xnintr_irq {
DECLARE_XNLOCK(lock);
-
-   xnintr_t *handlers;
+   struct xnintr *handlers;
int unhandled;
+} cacheline_aligned_in_smp;
 
-} cacheline_aligned_in_smp xnintr_irq_t;
+static struct xnintr_irq xnirqs[IPIPE_NR_IRQS];
 
-static xnintr_irq_t xnirqs[IPIPE_NR_IRQS];
-
-static inline xnintr_t *xnintr_shirq_first(unsigned irq)
+static inline struct xnintr *xnintr_shirq_first(unsigned irq)
 {
return xnirqs[irq].handlers;
 }
 
-static inline xnintr_t *xnintr_shirq_next(xnintr_t *prev)
+static inline struct xnintr *xnintr_shirq_next(struct xnintr *prev)
 {
return prev->next;
 }
@@ -176,11 +173,11 @@ static inline xnintr_t *xnintr_shirq_next(xnintr_t *prev)
 

[Xenomai-git] Philippe Gerum : alchemy: check call mode bits when applicable

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: a605c508a8f2793d1e1cb7c7755f633a67935428
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=a605c508a8f2793d1e1cb7c7755f633a67935428

Author: Philippe Gerum 
Date:   Wed Apr 16 11:59:29 2014 +0200

alchemy: check call mode bits when applicable

---

 lib/alchemy/buffer.c |4 +++-
 lib/alchemy/event.c  |   14 +++---
 lib/alchemy/heap.c   |7 +--
 lib/alchemy/pipe.c   |6 +-
 lib/alchemy/queue.c  |   15 ++-
 lib/alchemy/sem.c|7 +--
 6 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/lib/alchemy/buffer.c b/lib/alchemy/buffer.c
index 36f9e12..f77a4c7 100644
--- a/lib/alchemy/buffer.c
+++ b/lib/alchemy/buffer.c
@@ -192,6 +192,8 @@ fnref_register(libalchemy, buffer_finalize);
  *
  * @return Zero is returned upon success. Otherwise:
  *
+ * - -EINVAL is returned if @a mode is invalid or @a bufsz is zero.
+ *
  * - -ENOMEM is returned if the system fails to get memory from the
  * main heap in order to create the buffer.
  *
@@ -220,7 +222,7 @@ int rt_buffer_create(RT_BUFFER *bf, const char *name,
if (threadobj_irq_p())
return -EPERM;
 
-   if (bufsz == 0)
+   if (bufsz == 0 || (mode & ~B_PRIO) != 0)
return -EINVAL;
 
CANCEL_DEFER(svc);
diff --git a/lib/alchemy/event.c b/lib/alchemy/event.c
index 827ad6f..37c6569 100644
--- a/lib/alchemy/event.c
+++ b/lib/alchemy/event.c
@@ -145,6 +145,8 @@ fnref_register(libalchemy, event_finalize);
  *
  * @return Zero is returned upon success. Otherwise:
  *
+ * - -EINVAL is returned if @a mode is invalid.
+ *
  * - -ENOMEM is returned if the system fails to get memory from the
  * main heap in order to create the event flag group.
  *
@@ -172,6 +174,9 @@ int rt_event_create(RT_EVENT *event, const char *name,
if (threadobj_irq_p())
return -EPERM;
 
+   if (mode & ~EV_PRIO)
+   return -EINVAL;
+
CANCEL_DEFER(svc);
 
evcb = xnmalloc(sizeof(*evcb));
@@ -353,8 +358,8 @@ out:
  * - -EINTR is returned if rt_task_unblock() was called for the
  * current task before the request is satisfied.
  *
- * - -EINVAL is returned if @a event is not a valid event flag group
- * descriptor.
+ * - -EINVAL is returned if @a mode is invalid, or @a event is not a
+ * valid event flag group descriptor.
  *
  * - -EIDRM is returned if @a event is deleted while the caller was
  * sleeping on it. In such a case, @a event is no more valid upon
@@ -384,6 +389,9 @@ int rt_event_wait_timed(RT_EVENT *event,
if (!threadobj_current_p() && !alchemy_poll_mode(abs_timeout))
return -EPERM;
 
+   if (mode & ~EVOBJ_ANY)
+   return -EINVAL;
+
CANCEL_DEFER(svc);
 
evcb = find_alchemy_event(event, &ret);
@@ -415,7 +423,7 @@ out:
  *
  * @return Zero is returned upon success. Otherwise:
  *
- * - -EINVAL is returned if @a event is not a valid event flag group
+ * - -EINVAL is returned if @a event is not an event flag group
  * descriptor.
  *
  * Valid calling context: any.
diff --git a/lib/alchemy/heap.c b/lib/alchemy/heap.c
index 46e691c..560e085 100644
--- a/lib/alchemy/heap.c
+++ b/lib/alchemy/heap.c
@@ -192,8 +192,8 @@ fnref_register(libalchemy, heap_finalize);
  *
  * @return Zero is returned upon success. Otherwise:
  *
- * - -EINVAL is returned if @a heapsz is not in the valid range
- * [2k..2Gb].
+ * - -EINVAL is returned if @a mode is invalid, or @a heapsz is not in
+ * the range [2k..2Gb].
  *
  * - -ENOMEM is returned if the system fails to get memory from the
  * main heap in order to create the heap.
@@ -225,6 +225,9 @@ int rt_heap_create(RT_HEAP *heap,
if (heapsz < 2048 || heapsz >= 1U << 31)
return -EINVAL;
 
+   if (mode & ~(H_PRIO|H_SINGLE))
+   return -EINVAL;
+
CANCEL_DEFER(svc);
 
ret = -ENOMEM;
diff --git a/lib/alchemy/pipe.c b/lib/alchemy/pipe.c
index 27f814e..48420f1 100644
--- a/lib/alchemy/pipe.c
+++ b/lib/alchemy/pipe.c
@@ -450,7 +450,8 @@ out:
  * @return Upon success, this service returns @a size. Upon error, one
  * of the following error codes is returned:
  *
- * - -EINVAL is returned if @a pipe is not a pipe descriptor.
+ * - -EINVAL is returned if @a mode is invalid or @a pipe is not a
+ * pipe descriptor.
  *
  * - -ENOMEM is returned if not enough buffer space is available to
  * complete the operation.
@@ -467,6 +468,9 @@ ssize_t rt_pipe_write(RT_PIPE *pipe,
 {
int flags = 0;
 
+   if (mode & ~P_URGENT)
+   return -EINVAL;
+
if (mode & P_URGENT)
flags |= MSG_OOB;
 
diff --git a/lib/alchemy/queue.c b/lib/alchemy/queue.c
index ef9320f..4cb2a4f 100644
--- a/lib/alchemy/queue.c
+++ b/lib/alchemy/queue.c
@@ -171,6 +171,8 @@ fnref_register(libalchemy, queue_finalize);
  *
  * @return Zero is returned upon success. Otherwise:
  *
+ * - -EINVAL is returned if @a mode is invalid or @a poolsize 

[Xenomai-git] Philippe Gerum : cobalt/synch: add initializer for simple prio-driven wait queue

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 1338b694c430a7be3d9344339b49d80aafdaeb79
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=1338b694c430a7be3d9344339b49d80aafdaeb79

Author: Philippe Gerum 
Date:   Thu Apr 10 11:39:50 2014 +0200

cobalt/synch: add initializer for simple prio-driven wait queue

---

 include/cobalt/kernel/synch.h |   12 
 1 file changed, 12 insertions(+)

diff --git a/include/cobalt/kernel/synch.h b/include/cobalt/kernel/synch.h
index a316e3f..8b9fd1c 100644
--- a/include/cobalt/kernel/synch.h
+++ b/include/cobalt/kernel/synch.h
@@ -59,6 +59,18 @@ struct xnsynch {
void (*cleanup)(struct xnsynch *synch); /* Cleanup handler */
 };
 
+#define XNSYNCH_WAITQUEUE_INITIALIZER(__name) {\
+   .status = XNSYNCH_PRIO, \
+   .wprio = -1,\
+   .pendq = LIST_HEAD_INIT((__name).pendq),\
+   .owner = NULL,  \
+   .cleanup = NULL,\
+   .fastlock = NULL,   \
+   }
+
+#define DEFINE_XNWAITQ(__name) \
+   struct xnsynch __name = XNSYNCH_WAITQUEUE_INITIALIZER(__name)
+
 static inline void xnsynch_set_status(struct xnsynch *synch, int bits)
 {
synch->status |= bits;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : include/cobalt, mercury: introduce core-specific limits.h

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 1ce3308baaf1bec858b26809456750ab23d4415d
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=1ce3308baaf1bec858b26809456750ab23d4415d

Author: Philippe Gerum 
Date:   Wed Apr 16 10:45:21 2014 +0200

include/cobalt,mercury: introduce core-specific limits.h

---

 include/cobalt/boilerplate/Makefile.am  |1 +
 include/cobalt/boilerplate/Makefile.in  |1 +
 include/cobalt/boilerplate/limits.h |   23 +++
 include/cobalt/uapi/kernel/Makefile.am  |1 +
 include/cobalt/uapi/kernel/Makefile.in  |1 +
 include/cobalt/uapi/kernel/limits.h |   23 +++
 include/cobalt/uapi/kernel/types.h  |4 ++--
 include/mercury/boilerplate/Makefile.am |1 +
 include/mercury/boilerplate/Makefile.in |1 +
 include/mercury/boilerplate/limits.h|   23 +++
 10 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/include/cobalt/boilerplate/Makefile.am 
b/include/cobalt/boilerplate/Makefile.am
index 6199dd3..cbf76d1 100644
--- a/include/cobalt/boilerplate/Makefile.am
+++ b/include/cobalt/boilerplate/Makefile.am
@@ -1,6 +1,7 @@
 includesubdir = $(includedir)/cobalt/boilerplate
 
 includesub_HEADERS =   \
+   limits.h\
signal.h\
trace.h \
wrappers.h
diff --git a/include/cobalt/boilerplate/Makefile.in 
b/include/cobalt/boilerplate/Makefile.in
index faa0ada..c557bbb 100644
--- a/include/cobalt/boilerplate/Makefile.in
+++ b/include/cobalt/boilerplate/Makefile.in
@@ -338,6 +338,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 includesubdir = $(includedir)/cobalt/boilerplate
 includesub_HEADERS = \
+   limits.h\
signal.h\
trace.h \
wrappers.h
diff --git a/include/cobalt/boilerplate/limits.h 
b/include/cobalt/boilerplate/limits.h
new file mode 100644
index 000..ae49324
--- /dev/null
+++ b/include/cobalt/boilerplate/limits.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2014 Philippe Gerum .
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef _COBALT_BOILERPLATE_LIMITS_H
+#define _COBALT_BOILERPLATE_LIMITS_H
+
+#include 
+
+#endif /* _COBALT_BOILERPLATE_LIMITS_H */
diff --git a/include/cobalt/uapi/kernel/Makefile.am 
b/include/cobalt/uapi/kernel/Makefile.am
index 3383c89..e98a735 100644
--- a/include/cobalt/uapi/kernel/Makefile.am
+++ b/include/cobalt/uapi/kernel/Makefile.am
@@ -2,6 +2,7 @@ includesubdir = $(includedir)/cobalt/uapi/kernel
 
 includesub_HEADERS =   \
heap.h  \
+   limits.h\
synch.h \
thread.h\
trace.h \
diff --git a/include/cobalt/uapi/kernel/Makefile.in 
b/include/cobalt/uapi/kernel/Makefile.in
index 0a834ff..1d2c556 100644
--- a/include/cobalt/uapi/kernel/Makefile.in
+++ b/include/cobalt/uapi/kernel/Makefile.in
@@ -339,6 +339,7 @@ top_srcdir = @top_srcdir@
 includesubdir = $(includedir)/cobalt/uapi/kernel
 includesub_HEADERS = \
heap.h  \
+   limits.h\
synch.h \
thread.h\
trace.h \
diff --git a/include/cobalt/uapi/kernel/limits.h 
b/include/cobalt/uapi/kernel/limits.h
new file mode 100644
index 000..22017c5
--- /dev/null
+++ b/include/cobalt/uapi/kernel/limits.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2014 Philippe Gerum .
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef _COBALT_UAPI_KERNEL_LIMITS_H
+#define _COBALT_UAPI_KERNEL_LIMITS_H
+
+#define XNOBJECT_NAME_LEN 32
+
+#endif /* !_COBALT_UAP

[Xenomai-git] Philippe Gerum : cobalt/posix/syscall: fixup exec bits for non-restartable calls

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: aad9ca0824f505654ca9164a3c2424db2577c544
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=aad9ca0824f505654ca9164a3c2424db2577c544

Author: Philippe Gerum 
Date:   Tue Apr 22 18:24:32 2014 +0200

cobalt/posix/syscall: fixup exec bits for non-restartable calls

---

 kernel/cobalt/posix/syscall.c |6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index c70922a..4bec72b 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -132,8 +132,8 @@ static struct xnsyscall cobalt_syscalls[] = {
SKINCALL_DEF(sc_cobalt_mq_timedreceive, cobalt_mq_timedreceive, 
primary),
SKINCALL_DEF(sc_cobalt_mq_notify, cobalt_mq_notify, primary),
SKINCALL_DEF(sc_cobalt_sigwait, cobalt_sigwait, primary),
-   SKINCALL_DEF(sc_cobalt_sigwaitinfo, cobalt_sigwaitinfo, primary),
-   SKINCALL_DEF(sc_cobalt_sigtimedwait, cobalt_sigtimedwait, primary),
+   SKINCALL_DEF(sc_cobalt_sigwaitinfo, cobalt_sigwaitinfo, nonrestartable),
+   SKINCALL_DEF(sc_cobalt_sigtimedwait, cobalt_sigtimedwait, 
nonrestartable),
SKINCALL_DEF(sc_cobalt_sigpending, cobalt_sigpending, primary),
SKINCALL_DEF(sc_cobalt_kill, cobalt_kill, conforming),
SKINCALL_DEF(sc_cobalt_timer_create, cobalt_timer_create, any),
@@ -155,7 +155,7 @@ static struct xnsyscall cobalt_syscalls[] = {
SKINCALL_DEF(sc_cobalt_condattr_setclock, cobalt_condattr_setclock, 
any),
SKINCALL_DEF(sc_cobalt_condattr_getpshared, cobalt_condattr_getpshared, 
any),
SKINCALL_DEF(sc_cobalt_condattr_setpshared, cobalt_condattr_setpshared, 
any),
-   SKINCALL_DEF(sc_cobalt_select, cobalt_select, primary),
+   SKINCALL_DEF(sc_cobalt_select, cobalt_select, nonrestartable),
SKINCALL_DEF(sc_cobalt_sched_minprio, cobalt_sched_min_prio, any),
SKINCALL_DEF(sc_cobalt_sched_maxprio, cobalt_sched_max_prio, any),
SKINCALL_DEF(sc_cobalt_monitor_init, cobalt_monitor_init, any),


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/timer: fix debug assertion

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 4a1891295ce69bc07bb2fb0ce8d6857a688a314e
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=4a1891295ce69bc07bb2fb0ce8d6857a688a314e

Author: Philippe Gerum 
Date:   Fri Apr 18 18:06:17 2014 +0200

cobalt/timer: fix debug assertion

---

 include/cobalt/kernel/bheap.h |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/cobalt/kernel/bheap.h b/include/cobalt/kernel/bheap.h
index a97701c..dcd0247 100644
--- a/include/cobalt/kernel/bheap.h
+++ b/include/cobalt/kernel/bheap.h
@@ -64,7 +64,7 @@ static inline int bheap_ordered(bheap_t *heap)
 }
 
 #define BHEAP_CHECK(heap)  \
-   XENO_BUGON(TIMERS, ((heap)->sz == 0) || !bheap_ordered(heap))
+   XENO_BUGON(NUCLEUS, ((heap)->sz == 0) || !bheap_ordered(heap))
 
 #define bheap_gethead(heap)\
({  \


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/kernel: introduce k[v]asformat() helper

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 381d3671029b6726ce0764b4485beb350e07da88
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=381d3671029b6726ce0764b4485beb350e07da88

Author: Philippe Gerum 
Date:   Thu Apr 17 11:54:47 2014 +0200

cobalt/kernel: introduce k[v]asformat() helper

---

 include/cobalt/kernel/ancillaries.h |   10 ++
 1 file changed, 10 insertions(+)

diff --git a/include/cobalt/kernel/ancillaries.h 
b/include/cobalt/kernel/ancillaries.h
index e1e59f2..88c0afb 100644
--- a/include/cobalt/kernel/ancillaries.h
+++ b/include/cobalt/kernel/ancillaries.h
@@ -30,6 +30,11 @@
__ret;  \
})
 
+#define kasformat(__fmt, __args...)\
+   ({  \
+   kasprintf(GFP_KERNEL, __fmt, ##__args); \
+   })
+
 #define kvsformat(__dst, __len, __fmt, __ap)   \
({  \
size_t __ret;   \
@@ -39,4 +44,9 @@
__ret;  \
})
 
+#define kvasformat(__fmt, __ap)
\
+   ({  \
+   kvasprintf(GFP_KERNEL, __fmt, __ap);\
+   })
+
 #endif /* !_COBALT_KERNEL_ANCILLARIES_H */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/notifier: rename notification signal to SIGNOTIFY

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: bdbd0dd1d6f0ea314fb15f621dad9e61a5691290
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=bdbd0dd1d6f0ea314fb15f621dad9e61a5691290

Author: Philippe Gerum 
Date:   Tue Apr 15 16:57:43 2014 +0200

copperplate/notifier: rename notification signal to SIGNOTIFY

---

 include/mercury/boilerplate/signal.h |4 ++--
 lib/copperplate/notifier.c   |   12 +---
 2 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/include/mercury/boilerplate/signal.h 
b/include/mercury/boilerplate/signal.h
index 69b1ff1..a09b3f9 100644
--- a/include/mercury/boilerplate/signal.h
+++ b/include/mercury/boilerplate/signal.h
@@ -24,7 +24,7 @@
 #define sigev_notify_thread_id  _sigev_un._tid
 #endif
 
-/* Private signal used for unblocking from syscalls. */
-#define SIGRELS(SIGRTMIN + 9)
+#define SIGNOTIFY  (SIGRTMIN + 8) /* Internal notification */
+#define SIGRELS(SIGRTMIN + 9) /* Syscall abort */
 
 #endif /* _MERCURY_COPPERPLATE_SIGNAL_H */
diff --git a/lib/copperplate/notifier.c b/lib/copperplate/notifier.c
index e6d2ff4..c94998b 100644
--- a/lib/copperplate/notifier.c
+++ b/lib/copperplate/notifier.c
@@ -24,12 +24,10 @@
 #include 
 #include "copperplate/notifier.h"
 #include "boilerplate/lock.h"
+#include "boilerplate/signal.h"
 #include "copperplate/debug.h"
 #include "internal.h"
 
-/* Private signal used for notification. */
-#define NOTIFYSIG  (SIGRTMIN + 8)
-
 static DEFINE_PRIVATE_LIST(notifier_list);
 
 static pthread_mutex_t notifier_lock;
@@ -112,7 +110,7 @@ hand_over:
if (notifier_old_sa.sa_sigaction) {
/*
 * This is our best effort to relay any unprocessed
-* event to the user-defined handler for NOTIFYSIG we
+* event to the user-defined handler for SIGNOTIFY we
 * might have overriden in notifier_pkg_init(). The
 * application code should set this handler prior to
 * calling copperplate_init(), so that we know about it. The
@@ -133,7 +131,7 @@ static void lock_notifier_list(sigset_t *oset)
 
read_lock(¬ifier_lock);
pthread_sigmask(SIG_BLOCK, NULL, &set);
-   sigaddset(&set, NOTIFYSIG);
+   sigaddset(&set, SIGNOTIFY);
pthread_sigmask(SIG_BLOCK, &set, oset);
 }
 
@@ -184,7 +182,7 @@ int notifier_init(struct notifier *nf,
pop_cleanup_lock(¬ifier_lock);
 
fd = nf->psfd[0];
-   fcntl(fd, F_SETSIG, NOTIFYSIG);
+   fcntl(fd, F_SETSIG, SIGNOTIFY);
owner.type = F_OWNER_TID;
owner.pid = nf->owner;
fcntl(fd, F_SETOWN_EX, &owner);
@@ -339,5 +337,5 @@ void notifier_pkg_init(void)
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = ¬ifier_sighandler;
sa.sa_flags = SA_SIGINFO|SA_RESTART;
-   sigaction(NOTIFYSIG, &sa, ¬ifier_old_sa);
+   sigaction(SIGNOTIFY, &sa, ¬ifier_old_sa);
 }


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/init: emit boot notice for enabled tracing

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 5c20a5cbca9763ccda68404b08049f414b42e39e
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=5c20a5cbca9763ccda68404b08049f414b42e39e

Author: Philippe Gerum 
Date:   Tue Apr 15 16:18:20 2014 +0200

cobalt/init: emit boot notice for enabled tracing

---

 kernel/cobalt/init.c |   16 
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/kernel/cobalt/init.c b/kernel/cobalt/init.c
index 92de41d..5ea48d9 100644
--- a/kernel/cobalt/init.c
+++ b/kernel/cobalt/init.c
@@ -71,9 +71,15 @@ struct xnsys_ppd __xnsys_global_ppd = {
 EXPORT_SYMBOL_GPL(__xnsys_global_ppd);
 
 #ifdef CONFIG_XENO_OPT_DEBUG
-#define boot_notice " [DEBUG]"
+#define boot_debug_notice " [DEBUG]"
 #else
-#define boot_notice ""
+#define boot_debug_notice ""
+#endif
+
+#ifdef CONFIG_IPIPE_TRACE
+#define boot_trace_notice " [TRACE]"
+#else
+#define boot_trace_notice ""
 #endif
 
 static void disable_timesource(void)
@@ -420,8 +426,10 @@ static int __init xenomai_init(void)
if (ret)
goto cleanup_rtdm;
 
-   printk(XENO_INFO "Cobalt v%s enabled%s\n",
-  XENO_VERSION_STRING, boot_notice);
+   printk(XENO_INFO "Cobalt v%s enabled%s%s\n",
+  XENO_VERSION_STRING,
+  boot_debug_notice,
+  boot_trace_notice);
 
return 0;
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : lib/cobalt: introduce XENO_CONFIG_OUTPUT switch variable

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: d204e2a2bd1a5301fa66223c3d94e98de183c493
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d204e2a2bd1a5301fa66223c3d94e98de183c493

Author: Philippe Gerum 
Date:   Mon Apr 14 15:18:16 2014 +0200

lib/cobalt: introduce XENO_CONFIG_OUTPUT switch variable

Defining XENO_CONFIG_OUTPUT in the environment causes the application
program linked against libcobalt to dump the configuration settings
used for building the user-space programs/libraries. The program exits
immediately afterwards.

---

 lib/cobalt/init.c |   14 ++
 1 file changed, 14 insertions(+)

diff --git a/lib/cobalt/init.c b/lib/cobalt/init.c
index 4592c21..a903814 100644
--- a/lib/cobalt/init.c
+++ b/lib/cobalt/init.c
@@ -195,6 +195,14 @@ void __libcobalt_init(void)
boilerplate_init();
 }
 
+static inline void dump_configuration(void)
+{
+   int n;
+
+   for (n = 0; config_strings[n]; n++)
+   puts(config_strings[n]);
+}
+
 static __libcobalt_ctor void __init_cobalt(void)
 {
pthread_t tid = pthread_self();
@@ -202,6 +210,12 @@ static __libcobalt_ctor void __init_cobalt(void)
int policy, ret;
const char *p;
 
+   p = getenv("XENO_CONFIG_OUTPUT");
+   if (p && *p) {
+   dump_configuration();
+   _exit(0);
+   }
+
__cobalt_main_tid = tid;
 
if (__cobalt_defer_init)


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : drivers/can: drop MSCAN support for older mpc52xx kernels

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 506cb2d1171e76e2d127a69ff96338834de43dcb
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=506cb2d1171e76e2d127a69ff96338834de43dcb

Author: Philippe Gerum 
Date:   Wed Apr 16 11:33:24 2014 +0200

drivers/can: drop MSCAN support for older mpc52xx kernels

Cobalt requires a 3.10 kernel or later.

---

 kernel/drivers/can/mscan/Kconfig   |   52 -
 kernel/drivers/can/mscan/Makefile  |7 +-
 kernel/drivers/can/mscan/rtcan_mscan_mpc52xx.c |  246 
 3 files changed, 1 insertion(+), 304 deletions(-)

diff --git a/kernel/drivers/can/mscan/Kconfig b/kernel/drivers/can/mscan/Kconfig
index c624c88..dfbf5af 100644
--- a/kernel/drivers/can/mscan/Kconfig
+++ b/kernel/drivers/can/mscan/Kconfig
@@ -6,55 +6,3 @@ config XENO_DRIVERS_CAN_MSCAN
 
This driver is for the MSCAN on the MPC5200 and MPC512x processor
from Freescale.
-
-config XENO_DRIVERS_CAN_MSCAN_OLD
-   depends on XENO_DRIVERS_CAN_MSCAN && PPC_MPC52xx
-   bool "Use old MSCAN driver for old kernel version"
-   default n
-   help
-
-   For backward compatibility with older kernel versions, you may
-   want to select the old MSCAN driver for the MPC5200.
-
-if XENO_DRIVERS_CAN_MSCAN_OLD
-
-config XENO_DRIVERS_CAN_MSCAN_1
-   depends on XENO_DRIVERS_CAN_MSCAN
-   bool "Enable CAN 1"
-   default y
-
-config XENO_DRIVERS_CAN_MSCAN_2
-   depends on XENO_DRIVERS_CAN_MSCAN
-   bool "Enable CAN 2"
-   default y
-
-config XENO_DRIVERS_CAN_MSCAN_CLOCK
-   depends on XENO_DRIVERS_CAN_MSCAN
-   int "Clock Frequency in Hz"
-   default 6600
-   help
-
-   The MSCAN driver selects the oscillator clock (SYS_XTAL_IN) as clock
-   source for MSCAN, which is typically 33 MHz. Due to a hardware bug on
-   the MPC5200 Rev. A chips, the IP bus clock (IP_CLK) is used instead,
-   which is typically 66 or 132 MHz.
-
-choice
-   depends on XENO_DRIVERS_CAN_MSCAN
-   prompt "Pin Configuration"
-   default XENO_DRIVERS_CAN_MSCAN_PRE
-   help
-
-config XENO_DRIVERS_CAN_MSCAN_PRE
-   bool "Use pre-configured CAN routing"
-
-config XENO_DRIVERS_CAN_MSCAN_ALT
-   bool "CAN 1 on I2C1 pins, CAN 2 on TMR01 pins"
-
-config XENO_DRIVERS_CAN_MSCAN_PSC2
-   bool "CAN 1 and 2 on PSC2 pins"
-
-endchoice
-
-endif
-
diff --git a/kernel/drivers/can/mscan/Makefile 
b/kernel/drivers/can/mscan/Makefile
index aa1164a..b97b9f5 100644
--- a/kernel/drivers/can/mscan/Makefile
+++ b/kernel/drivers/can/mscan/Makefile
@@ -4,9 +4,4 @@ ccflags-y := -Iarch/$(SRCARCH)/xenomai/include 
-Iinclude/xenomai \
 
 obj-$(CONFIG_XENO_DRIVERS_CAN_MSCAN) += xeno_can_mscan.o
 
-xeno_can_mscan-y := rtcan_mscan.o rtcan_mscan_proc.o
-ifdef CONFIG_XENO_DRIVERS_CAN_MSCAN_OLD
-xeno_can_mscan-y += rtcan_mscan_mpc52xx.o
-else
-xeno_can_mscan-y += rtcan_mscan_mpc5xxx.o
-endif
+xeno_can_mscan-y := rtcan_mscan.o rtcan_mscan_proc.o rtcan_mscan_mpc5xxx.o
diff --git a/kernel/drivers/can/mscan/rtcan_mscan_mpc52xx.c 
b/kernel/drivers/can/mscan/rtcan_mscan_mpc52xx.c
deleted file mode 100644
index 7106f23..000
--- a/kernel/drivers/can/mscan/rtcan_mscan_mpc52xx.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright (C) 2006-2010 Wolfgang Grandegger 
- *
- * Copyright (C) 2005, 2006 Sebastian Smolorz
- *  
- *
- * Derived from the PCAN project file driver/src/pcan_mpc5200.c:
- *
- * Copyright (c) 2003 Wolfgang Denk, DENX Software Engineering, w...@denx.de.
- *
- * Copyright (c) 2005 Felix Daners, Plugit AG, felix.dan...@plugit.ch
- *
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include 
-#include 
-#include 
-
-#include 
-
-/* CAN device profile */
-#include 
-#include "rtcan_dev.h"
-#include "rtcan_raw.h"
-#include "rtcan_internal.h"
-#include "rtcan_mscan_regs.h"
-#include "rtcan_mscan.h"
-
-#define RTCAN_MSCAN_DEVS  2
-
-static char *mscan_ctlr_name  = "MSCAN-MPC5200";
-static char *mscan_board_name = "unkown";
-
-MODULE_AUTHOR("Wolfgang Grandegger ");
-MODULE_DESCRIPTION("RT-Socket-CAN driver for MSCAN-MPC2500");
-MODULE_SUPPORTED_DEVICE("MSCAN-MPC5200 CAN controller");
-MODULE_LICENSE("GPL");
-
-/** Module parameter for the CAN controllers' */
-
-int port[RTCAN_MSCAN_DEVS] = {
-#ifdef CONFIG_

[Xenomai-git] Philippe Gerum : drivers/ipc: move to new-style atomic sections

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 6a902c556e86ca391d448e30cbb882eca5741435
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6a902c556e86ca391d448e30cbb882eca5741435

Author: Philippe Gerum 
Date:   Thu Apr 10 11:41:43 2014 +0200

drivers/ipc: move to new-style atomic sections

---

 kernel/drivers/ipc/bufp.c |  105 ++-
 kernel/drivers/ipc/iddp.c |  245 +++--
 kernel/drivers/ipc/xddp.c |   92 +
 3 files changed, 227 insertions(+), 215 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 37884f8..c8cb979 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -658,6 +658,7 @@ static int __bufp_bind_socket(struct rtipc_private *priv,
 {
struct bufp_socket *sk = priv->state;
int ret = 0, port, fd;
+   spl_t s;
 
if (sa->sipc_family != AF_RTIPC)
return -EINVAL;
@@ -666,11 +667,12 @@ static int __bufp_bind_socket(struct rtipc_private *priv,
sa->sipc_port >= CONFIG_XENO_OPT_BUFP_NRPORT)
return -EINVAL;
 
-   RTDM_EXECUTE_ATOMICALLY(
-   if (test_bit(_BUFP_BOUND, &sk->status) ||
-   __test_and_set_bit(_BUFP_BINDING, &sk->status))
-   ret = -EADDRINUSE;
-   );
+   rtdm_atomic_enter(s);
+   if (test_bit(_BUFP_BOUND, &sk->status) ||
+   __test_and_set_bit(_BUFP_BINDING, &sk->status))
+   ret = -EADDRINUSE;
+   rtdm_atomic_leave(s);
+   
if (ret)
return ret;
 
@@ -710,10 +712,10 @@ static int __bufp_bind_socket(struct rtipc_private *priv,
}
}
 
-   RTDM_EXECUTE_ATOMICALLY(
-   __clear_bit(_BUFP_BINDING, &sk->status);
-   __set_bit(_BUFP_BOUND, &sk->status);
-   );
+   rtdm_atomic_enter(s);
+   __clear_bit(_BUFP_BINDING, &sk->status);
+   __set_bit(_BUFP_BOUND, &sk->status);
+   rtdm_atomic_leave(s);
 
return 0;
 fail:
@@ -729,6 +731,7 @@ static int __bufp_connect_socket(struct bufp_socket *sk,
struct bufp_socket *rsk;
xnhandle_t h;
int ret;
+   spl_t s;
 
if (sa == NULL) {
sa = &nullsa;
@@ -764,26 +767,26 @@ static int __bufp_connect_socket(struct bufp_socket *sk,
if (ret)
return ret;
 
-   RTDM_EXECUTE_ATOMICALLY(
-   rsk = xnregistry_lookup(h, NULL);
-   if (rsk == NULL || rsk->magic != BUFP_SOCKET_MAGIC)
-   ret = -EINVAL;
-   else
-   /* Fetch labeled port number. */
-   sa->sipc_port = rsk->name.sipc_port;
-   );
+   rtdm_atomic_enter(s);
+   rsk = xnregistry_lookup(h, NULL);
+   if (rsk == NULL || rsk->magic != BUFP_SOCKET_MAGIC)
+   ret = -EINVAL;
+   else
+   /* Fetch labeled port number. */
+   sa->sipc_port = rsk->name.sipc_port;
+   rtdm_atomic_leave(s);
if (ret)
return ret;
}
 
 set_assoc:
-   RTDM_EXECUTE_ATOMICALLY(
-   if (!test_bit(_BUFP_BOUND, &sk->status))
-   /* Set default name. */
-   sk->name = *sa;
-   /* Set default destination. */
-   sk->peer = *sa;
-   );
+   rtdm_atomic_enter(s);
+   if (!test_bit(_BUFP_BOUND, &sk->status))
+   /* Set default name. */
+   sk->name = *sa;
+   /* Set default destination. */
+   sk->peer = *sa;
+   rtdm_atomic_leave(s);
 
return 0;
 }
@@ -797,6 +800,7 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
struct timeval tv;
int ret = 0;
size_t len;
+   spl_t s;
 
if (rtipc_get_arg(user_info, &sopt, arg, sizeof(sopt)))
return -EFAULT;
@@ -842,17 +846,17 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
return -EFAULT;
if (len == 0)
return -EINVAL;
-   RTDM_EXECUTE_ATOMICALLY(
-   /*
-* We may not do this more than once, and we
-* have to do this before the first binding.
-*/
-   if (test_bit(_BUFP_BOUND, &sk->status) ||
-   test_bit(_BUFP_BINDING, &sk->status))
-   ret = -EALREADY;
-   else
-   sk->bufsz = len;
-   );
+   rtdm_atomic_enter(s);
+   /*
+* We may not do this more than once, and we have to
+* do this before the first binding.
+*/
+   if (

[Xenomai-git] Philippe Gerum : boilerplate/lock: prevent FMR in safe unlock op

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 7a15bf4aebf346be12cdf04c14a587bcee5a4f01
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=7a15bf4aebf346be12cdf04c14a587bcee5a4f01

Author: Philippe Gerum 
Date:   Fri Apr 11 16:42:45 2014 +0200

boilerplate/lock: prevent FMR in safe unlock op

Since dropping the lock may result in the memory holding the restored
cancel state to become stale, we'd better read it prior to unlocking.

Typically, this case would happen with call sites like
threadobj_unlock(), fetching the cancel state word from the TCB of a
thread which pends on its own lock, prior to finalizing. If that
thread preempts threadobj_unlock() (as a result of the lock drop) then
exits, the cancel state may become stale before threadobj_unlock()
refers to it.

---

 include/boilerplate/lock.h |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/boilerplate/lock.h b/include/boilerplate/lock.h
index dce1ff0..4819b34 100644
--- a/include/boilerplate/lock.h
+++ b/include/boilerplate/lock.h
@@ -177,9 +177,9 @@ int __check_cancel_type(const char *locktype);
 
 #define __do_unlock_safe(__lock, __state)  \
({  \
-   int __ret;  \
+   int __ret, __restored_state = __state;  \
__ret = -__RT(pthread_mutex_unlock(__lock));\
-   pthread_setcancelstate(__state, NULL);  \
+   pthread_setcancelstate(__restored_state, NULL); \
__ret;  \
})
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/shadow: expose XNBREAK to userland

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: f0996fd20957a0d1e341f81c2d5c93ab2c963c00
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=f0996fd20957a0d1e341f81c2d5c93ab2c963c00

Author: Philippe Gerum 
Date:   Tue Apr 22 18:52:50 2014 +0200

cobalt/shadow: expose XNBREAK to userland

---

 include/cobalt/kernel/thread.h  |   20 +---
 include/cobalt/uapi/kernel/thread.h |1 +
 kernel/cobalt/shadow.c  |1 +
 3 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/include/cobalt/kernel/thread.h b/include/cobalt/kernel/thread.h
index e053845..d235d9c 100644
--- a/include/cobalt/kernel/thread.h
+++ b/include/cobalt/kernel/thread.h
@@ -283,22 +283,28 @@ struct xnthread *xnthread_lookup(xnhandle_t threadh)
 
 static inline void xnthread_sync_window(struct xnthread *thread)
 {
-   if (thread->u_window)
+   if (thread->u_window) {
thread->u_window->state = thread->state;
+   thread->u_window->info = thread->info;
+   }
 }
 
 static inline
-void xnthread_clear_sync_window(struct xnthread *thread, int bits)
+void xnthread_clear_sync_window(struct xnthread *thread, int state_bits)
 {
-   if (thread->u_window)
-   thread->u_window->state = thread->state & ~bits;
+   if (thread->u_window) {
+   thread->u_window->state = thread->state & ~state_bits;
+   thread->u_window->info = thread->info;
+   }
 }
 
 static inline
-void xnthread_set_sync_window(struct xnthread *thread, int bits)
+void xnthread_set_sync_window(struct xnthread *thread, int state_bits)
 {
-   if (thread->u_window)
-   thread->u_window->state = thread->state | bits;
+   if (thread->u_window) {
+   thread->u_window->state = thread->state | state_bits;
+   thread->u_window->info = thread->info;
+   }
 }
 
 static inline int xnthread_try_grab(struct xnthread *thread,
diff --git a/include/cobalt/uapi/kernel/thread.h 
b/include/cobalt/uapi/kernel/thread.h
index 439e636..1c01654 100644
--- a/include/cobalt/uapi/kernel/thread.h
+++ b/include/cobalt/uapi/kernel/thread.h
@@ -97,6 +97,7 @@
 
 struct xnthread_user_window {
unsigned long state;
+   unsigned long info;
unsigned long grant_value;
 };
 
diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c
index 9da7c22..4115362 100644
--- a/kernel/cobalt/shadow.c
+++ b/kernel/cobalt/shadow.c
@@ -223,6 +223,7 @@ static void request_syscall_restart(struct xnthread *thread,
  (sysflags & __xn_exec_norestart) ?
  -EINTR : -ERESTARTSYS);
notify = !xnthread_test_state(thread, XNDEBUG);
+   xnthread_clear_info(thread, XNBREAK);
}
xnthread_clear_info(thread, XNKICKED);
}


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/kernel: generalize use of safe *snprintf()

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: f8490220177c0c007ae98dac4a956ecd0de89120
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=f8490220177c0c007ae98dac4a956ecd0de89120

Author: Philippe Gerum 
Date:   Thu Apr 17 11:44:08 2014 +0200

cobalt/kernel: generalize use of safe *snprintf()

Make sure to have the destination string null-terminated on character
overflow.

---

 include/cobalt/kernel/Makefile.am   |1 +
 include/cobalt/kernel/Makefile.in   |1 +
 include/cobalt/kernel/ancillaries.h |   42 +++
 include/cobalt/kernel/assert.h  |1 +
 include/cobalt/kernel/rtdm/driver.h |1 +
 kernel/cobalt/assert.c  |2 +-
 kernel/cobalt/clock.c   |2 +-
 kernel/cobalt/heap.c|4 +--
 kernel/cobalt/intr.c|2 +-
 kernel/cobalt/posix/sem.c   |2 +-
 kernel/cobalt/posix/thread.c|2 +-
 kernel/cobalt/rtdm/proc.c   |2 +-
 kernel/cobalt/sched-quota.c |6 +++--
 kernel/cobalt/sched-rt.c|2 +-
 kernel/cobalt/sched-sporadic.c  |4 +--
 kernel/cobalt/sched-tp.c|2 +-
 kernel/cobalt/sched-weak.c  |2 +-
 kernel/cobalt/sched.c   |8 +++---
 kernel/cobalt/shadow.c  |2 +-
 kernel/cobalt/thread.c  |4 +--
 kernel/cobalt/timer.c   |8 +++---
 kernel/drivers/analogy/device.c |   23 ++---
 kernel/drivers/analogy/rtdm_interface.c |2 +-
 kernel/drivers/can/rtcan_dev.c  |2 +-
 kernel/drivers/can/rtcan_module.c   |   10 
 kernel/drivers/ipc/bufp.c   |2 +-
 kernel/drivers/ipc/iddp.c   |2 +-
 kernel/drivers/ipc/xddp.c   |2 +-
 kernel/drivers/serial/16550A.c  |2 +-
 kernel/drivers/serial/mpc52xx_uart.c|2 +-
 kernel/drivers/serial/rt_imx_uart.c |2 +-
 kernel/drivers/testing/rtdmtest.c   |2 +-
 kernel/drivers/testing/switchtest.c |4 +--
 kernel/drivers/testing/timerbench.c |2 +-
 34 files changed, 99 insertions(+), 58 deletions(-)

diff --git a/include/cobalt/kernel/Makefile.am 
b/include/cobalt/kernel/Makefile.am
index d2375dc..ad6c7f2 100644
--- a/include/cobalt/kernel/Makefile.am
+++ b/include/cobalt/kernel/Makefile.am
@@ -1,5 +1,6 @@
 
 noinst_HEADERS =   \
+   ancillaries.h   \
apc.h   \
arith.h \
assert.h\
diff --git a/include/cobalt/kernel/Makefile.in 
b/include/cobalt/kernel/Makefile.in
index d3e7fb9..4b6e1da 100644
--- a/include/cobalt/kernel/Makefile.in
+++ b/include/cobalt/kernel/Makefile.in
@@ -351,6 +351,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 noinst_HEADERS = \
+   ancillaries.h   \
apc.h   \
arith.h \
assert.h\
diff --git a/include/cobalt/kernel/ancillaries.h 
b/include/cobalt/kernel/ancillaries.h
new file mode 100644
index 000..e1e59f2
--- /dev/null
+++ b/include/cobalt/kernel/ancillaries.h
@@ -0,0 +1,42 @@
+/**
+ * @note Copyright (C) 2014 Philippe Gerum .
+ *
+ * Xenomai is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2 of the License,
+ * or (at your option) any later version.
+ *
+ * Xenomai is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Xenomai; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+#ifndef _COBALT_KERNEL_ANCILLARIES_H
+#define _COBALT_KERNEL_ANCILLARIES_H
+
+#include 
+
+#define ksformat(__dst, __len, __fmt, __args...)   \
+   ({  \
+   size_t __ret;   \
+   __ret = snprintf(__dst, __len, __fmt, ##__args);\
+   if (__ret >= __len) \
+   __dst[__len-1] = '\0';  \
+   __ret;  \
+   })
+
+#define kvsformat(__dst, __len, __fmt, __ap)   \
+   ({  \
+   size_t __ret;   \
+   __ret = vsnprintf(__dst, __len, __fmt, __ap);   \
+   if (__ret >= __len)  

[Xenomai-git] Philippe Gerum : copperplate/notifier: sanitize locking, misc cleanups

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: c71b021bf60926d4a2d3b52bf36be4949a1f94ca
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=c71b021bf60926d4a2d3b52bf36be4949a1f94ca

Author: Philippe Gerum 
Date:   Mon Apr 21 11:47:52 2014 +0200

copperplate/notifier: sanitize locking, misc cleanups

---

 lib/copperplate/notifier.c |   23 +--
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/lib/copperplate/notifier.c b/lib/copperplate/notifier.c
index ab69a75..d069a66 100644
--- a/lib/copperplate/notifier.c
+++ b/lib/copperplate/notifier.c
@@ -36,8 +36,6 @@ static struct sigaction notifier_old_sa;
 
 static fd_set notifier_rset;
 
-static int max_rfildes;/* Increases, never decreases. */
-
 static void notifier_sighandler(int sig, siginfo_t *siginfo, void *uc)
 {
static struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
@@ -59,7 +57,7 @@ static void notifier_sighandler(int sig, siginfo_t *siginfo, 
void *uc)
 */
rfds = notifier_rset;
do
-   ret = __STD(select(max_rfildes + 1, &rfds, NULL, NULL, 
&tv));
+   ret = __STD(select(FD_SETSIZE, &rfds, NULL, NULL, &tv));
while (ret == -1 && errno == EINTR);
if (ret <= 0)
goto hand_over;
@@ -129,16 +127,16 @@ static void lock_notifier_list(sigset_t *oset)
 {
sigset_t set;
 
-   read_lock(¬ifier_lock);
-   pthread_sigmask(SIG_BLOCK, NULL, &set);
+   sigemptyset(&set);
sigaddset(&set, SIGNOTIFY);
pthread_sigmask(SIG_BLOCK, &set, oset);
+   write_lock(¬ifier_lock);
 }
 
 static void unlock_notifier_list(sigset_t *oset)
 {
pthread_sigmask(SIG_SETMASK, oset, NULL);
-   read_unlock(¬ifier_lock);
+   write_unlock(¬ifier_lock);
 }
 
 int notifier_init(struct notifier *nf,
@@ -163,7 +161,6 @@ int notifier_init(struct notifier *nf,
}
 
nf->callback = callback;
-   pvholder_init(&nf->link);
nf->notified = 0;
nf->owner = owned ? copperplate_get_tid() : 0;
__STD(pthread_mutexattr_init(&mattr));
@@ -176,8 +173,6 @@ int notifier_init(struct notifier *nf,
push_cleanup_lock(¬ifier_lock);
lock_notifier_list(&oset);
pvlist_append(&nf->link, ¬ifier_list);
-   if (nf->psfd[0] > max_rfildes)
-   max_rfildes = nf->psfd[0];
FD_SET(nf->psfd[0], ¬ifier_rset);
unlock_notifier_list(&oset);
pop_cleanup_lock(¬ifier_lock);
@@ -212,7 +207,7 @@ void notifier_destroy(struct notifier *nf)
 
push_cleanup_lock(¬ifier_lock);
lock_notifier_list(&oset);
-   pvlist_remove_init(&nf->link);
+   pvlist_remove(&nf->link);
FD_CLR(nf->psfd[0], ¬ifier_rset);
unlock_notifier_list(&oset);
pop_cleanup_lock(¬ifier_lock);
@@ -228,7 +223,7 @@ int notifier_signal(struct notifier *nf)
int fd, ret, kick = 1;
char c = 0;
 
-   ret = read_lock_nocancel(&nf->lock);
+   ret = write_lock_nocancel(&nf->lock);
if (ret)
return __bt(ret);
 
@@ -239,7 +234,7 @@ int notifier_signal(struct notifier *nf)
else
kick = 0;
 
-   read_unlock(&nf->lock);
+   write_unlock(&nf->lock);
 
/*
 * XXX: we must release the lock before we write to the pipe,
@@ -265,7 +260,7 @@ int notifier_release(struct notifier *nf)
 * if the caller is cancelled, the notification struct becomes
 * useless. We may only take a read lock here.
 */
-   ret = read_lock_nocancel(&nf->lock);
+   ret = write_lock_nocancel(&nf->lock);
if (ret)
return __bt(ret);
 
@@ -276,7 +271,7 @@ int notifier_release(struct notifier *nf)
else
kick = 0;
 
-   read_unlock(&nf->lock);
+   write_unlock(&nf->lock);
 
if (kick) {
do


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/threadobj: protect threadobj_sleep() against spurious wakeups

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 390e073e93c2e69d4540e79d055e743f01cb7625
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=390e073e93c2e69d4540e79d055e743f01cb7625

Author: Philippe Gerum 
Date:   Tue Apr 22 18:57:18 2014 +0200

copperplate/threadobj: protect threadobj_sleep() against spurious wakeups

threadobj_sleep() should return upon wait completion or
threadobj_unblock() request, whichever comes first. However, receiving
a regular linux signal should not abort this call.

---

 include/copperplate/clockobj.h   |2 +
 include/copperplate/threadobj.h  |4 +
 include/mercury/boilerplate/signal.h |1 +
 lib/copperplate/syncobj.c|6 +-
 lib/copperplate/threadobj.c  |  173 ++
 5 files changed, 143 insertions(+), 43 deletions(-)

diff --git a/include/copperplate/clockobj.h b/include/copperplate/clockobj.h
index 58dbbf9..bbc2cf2 100644
--- a/include/copperplate/clockobj.h
+++ b/include/copperplate/clockobj.h
@@ -51,6 +51,8 @@ struct clockobj {
const char *name;   /* __ref FIXME */
 };
 
+#define zero_time  ((struct timespec){ .tv_sec = 0, .tv_nsec = 0 })
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/include/copperplate/threadobj.h b/include/copperplate/threadobj.h
index 2c6794f..5438790 100644
--- a/include/copperplate/threadobj.h
+++ b/include/copperplate/threadobj.h
@@ -22,6 +22,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -88,6 +89,9 @@ struct threadobj_corespec {
ticks_t period;
/** Timeout reported by sysregd. */
struct timespec timeout;
+   /** Timer data for threadobj_sleep() */
+   struct sigevent sleep_sev;
+   timer_t sleep_timer;
 };
 
 struct threadobj_stat {
diff --git a/include/mercury/boilerplate/signal.h 
b/include/mercury/boilerplate/signal.h
index 14523cd..996711f 100644
--- a/include/mercury/boilerplate/signal.h
+++ b/include/mercury/boilerplate/signal.h
@@ -26,6 +26,7 @@
 
 #define SIGNOTIFY  (SIGRTMIN + 8) /* Internal notification */
 #define SIGRELS(SIGRTMIN + 9) /* Syscall abort */
+#define SIGWAKEUP  (SIGRTMIN + 10) /* Sleep abort */
 
 #define SIGSAFE_LOCK_ENTRY(__safelock) \
do {\
diff --git a/lib/copperplate/syncobj.c b/lib/copperplate/syncobj.c
index 7834f86..5aee1a2 100644
--- a/lib/copperplate/syncobj.c
+++ b/lib/copperplate/syncobj.c
@@ -50,9 +50,9 @@
  * emulated via a mutex and two condition variables over Mercury (one
  * of which being hosted by the thread object implementation).
  *
- * NOTE: we do no do error backtracing in this file, since error
- * returns when locking, pending or deleting sync objects express
- * normal runtime conditions.
+ * NOTE: we don't do error backtracing in this file, since error
+ * returns when locking, pending or deleting sync objects usually
+ * express normal runtime conditions.
  */
 
 #ifdef CONFIG_XENO_COBALT
diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index a2a9dcd..9901a54 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -178,6 +178,43 @@ int threadobj_resume(struct threadobj *thobj) /* 
thobj->lock held */
return __bt(-ret);
 }
 
+int threadobj_sleep(struct timespec *ts)
+{
+   struct threadobj *current = threadobj_current();
+   sigset_t set;
+   int sig, ret;
+
+   /*
+* threadobj_sleep() shall return -EINTR immediately upon
+* threadobj_unblock(), to honor forced wakeup semantics for
+* RTOS personalities.
+*
+* Otherwise, the sleep should be silently restarted until
+* completion after a Linux signal is handled.
+*/
+   current->run_state = __THREAD_S_DELAYED;
+   threadobj_save_timeout(¤t->core, ts);
+
+   do {
+   /*
+* Waiting on a null signal set causes an infinite
+* delay, so that only threadobj_unblock() or a linux
+* signal can unblock us.
+*/
+   if (ts->tv_sec == 0 && ts->tv_nsec == 0) {
+   sigemptyset(&set);
+   ret = -__RT(sigwait(&set, &sig));
+   } else
+   ret = -__RT(clock_nanosleep(CLOCK_COPPERPLATE,
+   TIMER_ABSTIME, ts, NULL));
+   } while (ret == -EINTR &&
+(current->core.u_window->info & XNBREAK) == 0);
+
+   current->run_state = __THREAD_S_RUNNING;
+
+   return ret;
+}
+
 int __threadobj_lock_sched(struct threadobj *current)
 {
smp_rmb();
@@ -405,6 +442,7 @@ static inline void pkg_init_corespec(void)
memset(&sa, 0, sizeof(sa));
sa.sa_handler = unblock_sighandler;
sigaction(SIGRELS, &sa, NULL);
+   sigaction(SIGWAKEUP, &sa, NULL);
sa.sa_handler = roundrob

[Xenomai-git] Philippe Gerum : include/boilerplate: fix inclusion guards

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: bac39755801c9ac7c7b73b3d675a0720f5e976b0
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=bac39755801c9ac7c7b73b3d675a0720f5e976b0

Author: Philippe Gerum 
Date:   Wed Apr 16 11:10:17 2014 +0200

include/boilerplate: fix inclusion guards

---

 include/cobalt/boilerplate/signal.h|6 +++---
 include/cobalt/boilerplate/trace.h |6 +++---
 include/cobalt/boilerplate/wrappers.h  |6 +++---
 include/mercury/boilerplate/signal.h   |6 +++---
 include/mercury/boilerplate/trace.h|6 +++---
 include/mercury/boilerplate/wrappers.h |6 +++---
 6 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/include/cobalt/boilerplate/signal.h 
b/include/cobalt/boilerplate/signal.h
index 92112a4..2f7ca95 100644
--- a/include/cobalt/boilerplate/signal.h
+++ b/include/cobalt/boilerplate/signal.h
@@ -15,9 +15,9 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
-#ifndef _COBALT_COPPERPLATE_SIGNAL_H
-#define _COBALT_COPPERPLATE_SIGNAL_H
+#ifndef _COBALT_BOILERPLATE_SIGNAL_H
+#define _COBALT_BOILERPLATE_SIGNAL_H
 
 #include 
 
-#endif /* _COBALT_COPPERPLATE_SIGNAL_H */
+#endif /* _COBALT_BOILERPLATE_SIGNAL_H */
diff --git a/include/cobalt/boilerplate/trace.h 
b/include/cobalt/boilerplate/trace.h
index 4f2d7e4..c6cff8b 100644
--- a/include/cobalt/boilerplate/trace.h
+++ b/include/cobalt/boilerplate/trace.h
@@ -15,9 +15,9 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
-#ifndef _COBALT_COPPERPLATE_TRACE_H
-#define _COBALT_COPPERPLATE_TRACE_H
+#ifndef _COBALT_BOILERPLATE_TRACE_H
+#define _COBALT_BOILERPLATE_TRACE_H
 
 #include 
 
-#endif /* _COBALT_COPPERPLATE_TRACE_H */
+#endif /* _COBALT_BOILERPLATE_TRACE_H */
diff --git a/include/cobalt/boilerplate/wrappers.h 
b/include/cobalt/boilerplate/wrappers.h
index 42f514e..fc3a59d 100644
--- a/include/cobalt/boilerplate/wrappers.h
+++ b/include/cobalt/boilerplate/wrappers.h
@@ -15,9 +15,9 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
-#ifndef _COBALT_COPPERPLATE_WRAPPERS_H
-#define _COBALT_COPPERPLATE_WRAPPERS_H
+#ifndef _COBALT_BOILERPLATE_WRAPPERS_H
+#define _COBALT_BOILERPLATE_WRAPPERS_H
 
 #include 
 
-#endif /* !_COBALT_COPPERPLATE_WRAPPERS_H */
+#endif /* !_COBALT_BOILERPLATE_WRAPPERS_H */
diff --git a/include/mercury/boilerplate/signal.h 
b/include/mercury/boilerplate/signal.h
index a09b3f9..61efda4 100644
--- a/include/mercury/boilerplate/signal.h
+++ b/include/mercury/boilerplate/signal.h
@@ -15,8 +15,8 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
-#ifndef _MERCURY_COPPERPLATE_SIGNAL_H
-#define _MERCURY_COPPERPLATE_SIGNAL_H
+#ifndef _MERCURY_BOILERPLATE_SIGNAL_H
+#define _MERCURY_BOILERPLATE_SIGNAL_H
 
 #include 
 
@@ -27,4 +27,4 @@
 #define SIGNOTIFY  (SIGRTMIN + 8) /* Internal notification */
 #define SIGRELS(SIGRTMIN + 9) /* Syscall abort */
 
-#endif /* _MERCURY_COPPERPLATE_SIGNAL_H */
+#endif /* _MERCURY_BOILERPLATE_SIGNAL_H */
diff --git a/include/mercury/boilerplate/trace.h 
b/include/mercury/boilerplate/trace.h
index 650696c..223e364 100644
--- a/include/mercury/boilerplate/trace.h
+++ b/include/mercury/boilerplate/trace.h
@@ -15,8 +15,8 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
-#ifndef _MERCURY_COPPERPLATE_TRACE_H
-#define _MERCURY_COPPERPLATE_TRACE_H
+#ifndef _MERCURY_BOILERPLATE_TRACE_H
+#define _MERCURY_BOILERPLATE_TRACE_H
 
 #include 
 
@@ -60,4 +60,4 @@ static inline int xntrace_special_u64(unsigned char id, 
unsigned long long v)
return -ENOSYS;
 }
 
-#endif /* _MERCURY_COPPERPLATE_TRACE_H */
+#endif /* _MERCURY_BOILERPLATE_TRACE_H */
diff --git a/include/mercury/boilerplate/wrappers.h 
b/include/mercury/boilerplate/wrappers.h
index a167460..a62ccb7 100644
--- a/include/mercury/boilerplate/wrappers.h
+++ b/include/mercury/boilerplate/wrappers.h
@@ -15,10 +15,10 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
-#ifndef _MERCURY_COPPERPLATE_WRAPPERS_H
-#define _MERCURY_COPPERPLATE_WRAPPERS_H
+#ifndef _MERCURY_BOILERPLATE_WRAPPERS_H
+#define _MERCURY_BOILERPLATE_WRAPPERS_H
 
 #define __RT(call) call
 #define __STD(call)call
 
-#endif /* _MERCURY_COPPERPLATE_WRAPPERS_H */
+#endif /* _MERCURY_BOILERPLATE_WRAPPERS_H */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

[Xenomai-git] Philippe Gerum : include/rtdm: fix rt_dev API wrappers

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: fff312ec6c2dd9afe08c50914be784056b746263
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fff312ec6c2dd9afe08c50914be784056b746263

Author: Philippe Gerum 
Date:   Thu Apr 24 17:21:35 2014 +0200

include/rtdm: fix rt_dev API wrappers

---

 include/rtdm/rtdm.h |   26 +-
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/include/rtdm/rtdm.h b/include/rtdm/rtdm.h
index 92b228f..88deee6 100644
--- a/include/rtdm/rtdm.h
+++ b/include/rtdm/rtdm.h
@@ -41,6 +41,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -51,15 +52,22 @@
  */
 #ifndef RTDM_NO_DEFAULT_USER_API
 
-#define rt_dev_open__RT(open)
-#define rt_dev_socket  __RT(socket)
-#define rt_dev_close   __RT(close)
-#define rt_dev_ioctl   __RT(ioctl)
-#define rt_dev_read__RT(read)
-#define rt_dev_write   __RT(write)
-#define rt_dev_recvmsg __RT(recvmsg)
-#define rt_dev_sendmsg __RT(sendmsg)
-#define rt_dev_recvfrom __RT(recvfrom)
+#define rt_dev_call(__call, __args...) \
+({ \
+   int __ret;  \
+   __ret = __RT(__call(__args));   \
+   __ret < 0 ? -errno : __ret; \
+})
+
+#define rt_dev_open(__args...) rt_dev_call(open, __args)
+#define rt_dev_socket(__args...)   rt_dev_call(socket, __args)
+#define rt_dev_close(__args...)rt_dev_call(close, __args)
+#define rt_dev_ioctl(__args...)rt_dev_call(ioctl, __args)
+#define rt_dev_read(__args...) rt_dev_call(read, __args)
+#define rt_dev_write(__args...)rt_dev_call(write, __args)
+#define rt_dev_recvmsg(__args...)  rt_dev_call(recvmsg, __args)
+#define rt_dev_sendmsg(__args...)  rt_dev_call(sendmsg, __args)
+#define rt_dev_recvfrom(__args...) rt_dev_call(recvfrom, __args)
 
 #endif /* !RTDM_NO_DEFAULT_USER_API */
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate: introduce get_static_cpu_count()

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 9579ce404325fffc35f8df2097cf3f7ecc09074a
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=9579ce404325fffc35f8df2097cf3f7ecc09074a

Author: Philippe Gerum 
Date:   Mon Apr 21 11:21:25 2014 +0200

boilerplate: introduce get_static_cpu_count()

---

 include/boilerplate/ancillaries.h |2 ++
 lib/boilerplate/ancillaries.c |   23 +++
 2 files changed, 25 insertions(+)

diff --git a/include/boilerplate/ancillaries.h 
b/include/boilerplate/ancillaries.h
index b2c5b44..f1b4118 100644
--- a/include/boilerplate/ancillaries.h
+++ b/include/boilerplate/ancillaries.h
@@ -75,6 +75,8 @@ void error_hook(struct error_frame *ef);
 
 void boilerplate_init(void);
 
+int get_static_cpu_count(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/boilerplate/ancillaries.c b/lib/boilerplate/ancillaries.c
index 390369c..688aeee 100644
--- a/lib/boilerplate/ancillaries.c
+++ b/lib/boilerplate/ancillaries.c
@@ -224,6 +224,29 @@ int __check_cancel_type(const char *locktype)
 
 #endif /* CONFIG_XENO_DEBUG */
 
+int get_static_cpu_count(void)
+{
+   char buf[BUFSIZ];
+   int count = 0;
+   FILE *fp;
+
+   /*
+* We want the maximum # of CPU the running kernel was
+* configured for, not the current online/present/possible
+* count of CPU devices.
+*/
+   fp = fopen("/sys/devices/system/cpu/kernel_max", "r");
+   if (fp == NULL)
+   return -1;
+
+   if (fgets(buf, sizeof(buf), fp))
+   count = atoi(buf);
+
+   fclose(fp);
+
+   return count;
+}
+
 static void __boilerplate_init(void)
 {
__RT(clock_gettime(CLOCK_MONOTONIC, &__init_date));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : analogy: drop useless atomic sections

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: b57145a2add1a9472fa63756f6f928d8230f1444
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=b57145a2add1a9472fa63756f6f928d8230f1444

Author: Philippe Gerum 
Date:   Thu Apr 10 10:00:41 2014 +0200

analogy: drop useless atomic sections

We assume that memory transactions up to the native word width are
atomic for any architecture we support. Also, the affected code still
enforces proper memory barriers without the dropped locks.

---

 kernel/drivers/analogy/testing/fake.c |   30 +++---
 kernel/drivers/analogy/testing/loop.c |6 +++---
 2 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/kernel/drivers/analogy/testing/fake.c 
b/kernel/drivers/analogy/testing/fake.c
index 04dc2d2..3871cc5 100644
--- a/kernel/drivers/analogy/testing/fake.c
+++ b/kernel/drivers/analogy/testing/fake.c
@@ -241,15 +241,15 @@ static void task_proc(void *arg)
 
int running;
 
-   RTDM_EXECUTE_ATOMICALLY(running = priv->ai_running);
+   running = priv->ai_running;
if (running && ai_push_values(ai_subd) < 0)
break;
 
-   RTDM_EXECUTE_ATOMICALLY(running = priv->ao_running);
+   running = priv->ao_running;
if (running && ao_pull_values(ao_subd) < 0)
break;
 
-   RTDM_EXECUTE_ATOMICALLY(running = priv->ai2_running);
+   running = priv->ai2_running;
if (running && ai2_push_values(ai2_subd) < 0)
break;
 
@@ -277,7 +277,7 @@ static int ai_cmd(a4l_subd_t *subd, a4l_cmd_t *cmd)
ai_priv->current_ns = ((unsigned long)ai_priv->last_ns);
ai_priv->reminder_ns = 0;
 
-   RTDM_EXECUTE_ATOMICALLY(priv->ai_running = 1);
+   priv->ai_running = 1;
 
return 0;
 
@@ -302,7 +302,7 @@ static int ai_cancel(a4l_subd_t *subd)
 {
struct fake_priv *priv = (struct fake_priv *)subd->dev->priv;
 
-   RTDM_EXECUTE_ATOMICALLY(priv->ai_running = 0);
+   priv->ai_running = 0;
 
return 0;
 }
@@ -328,7 +328,7 @@ int ao_trigger(a4l_subd_t *subd, lsampl_t trignum)
struct fake_priv *priv = (struct fake_priv *)subd->dev->priv;
 
a4l_info(subd->dev, "ao_trigger: (subd=%d)\n", subd->idx);
-   RTDM_EXECUTE_ATOMICALLY(priv->ao_running = 1);
+   priv->ao_running = 1;
return 0;
 }
 
@@ -339,17 +339,17 @@ int ao_cancel(a4l_subd_t *subd)
int running;
 
a4l_info(subd->dev, "ao_cancel: (subd=%d)\n", subd->idx);
-   RTDM_EXECUTE_ATOMICALLY(priv->ao_running = 0);
+   priv->ao_running = 0;
 
-   RTDM_EXECUTE_ATOMICALLY(running = priv->ai2_running);
+   running = priv->ai2_running;
if (running) {
a4l_subd_t *ai2_subd =
(a4l_subd_t *)a4l_get_subd(subd->dev, AI2_SUBD);
/* Here, we have not saved the required amount of
   data; so, we cannot know whether or not, it is the
   end of the acquisition; that is why we force it */
-   RTDM_EXECUTE_ATOMICALLY(priv->ai2_running = 0);
-   RTDM_EXECUTE_ATOMICALLY(ao_priv->count = 0);
+   priv->ai2_running = 0;
+   ao_priv->count = 0;
a4l_buf_evt(ai2_subd, A4L_BUF_EOA);
}
 
@@ -363,7 +363,7 @@ int ai2_cmd(a4l_subd_t *subd, a4l_cmd_t *cmd)
struct fake_priv *priv = (struct fake_priv *)subd->dev->priv;
 
a4l_info(subd->dev, "ai2_cmd: (subd=%d)\n", subd->idx);
-   RTDM_EXECUTE_ATOMICALLY(priv->ai2_running = 1);
+   priv->ai2_running = 1;
return 0;
 }
 
@@ -375,17 +375,17 @@ int ai2_cancel(a4l_subd_t *subd)
int running;
 
a4l_info(subd->dev, "ai2_cancel: (subd=%d)\n", subd->idx);
-   RTDM_EXECUTE_ATOMICALLY(priv->ai2_running = 0);
+   priv->ai2_running = 0;
 
-   RTDM_EXECUTE_ATOMICALLY(running = priv->ao_running);
+   running = priv->ao_running;
if (running) {
a4l_subd_t *ao_subd =
(a4l_subd_t *)a4l_get_subd(subd->dev, AO_SUBD);
/* Here, we have not saved the required amount of
   data; so, we cannot know whether or not, it is the
   end of the acquisition; that is why we force it */
-   RTDM_EXECUTE_ATOMICALLY(priv->ao_running = 0);
-   RTDM_EXECUTE_ATOMICALLY(ai2_priv->count = 0);
+   priv->ao_running = 0;
+   ai2_priv->count = 0;
a4l_buf_evt(ao_subd, A4L_BUF_EOA);
}
 
diff --git a/kernel/drivers/analogy/testing/loop.c 
b/kernel/drivers/analogy/testing/loop.c
index 709f0cf..e97535d 100644
--- a/kernel/drivers/analogy/testing/loop.c
+++ b/kernel/drivers/analogy/testing/loop.c
@@ -78,7 +78,7 @@ static void loop_task_proc(void *arg)
 
int running;
 
-   RTDM_EXECUTE_ATOMICALLY(running = priv->loop_running

[Xenomai-git] Philippe Gerum : psos/init: assign explicit priority to constructor

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 2eee0b56cf3a0399188a5c2ce1a25e04ae2a223f
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=2eee0b56cf3a0399188a5c2ce1a25e04ae2a223f

Author: Philippe Gerum 
Date:   Tue Apr 15 10:40:31 2014 +0200

psos/init: assign explicit priority to constructor

---

 lib/psos/Makefile.am |1 +
 lib/psos/Makefile.in |1 +
 lib/psos/init.c  |3 ++-
 lib/psos/init.h  |   25 +
 4 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/lib/psos/Makefile.am b/lib/psos/Makefile.am
index 4eb7ad8..6abaf95 100644
--- a/lib/psos/Makefile.am
+++ b/lib/psos/Makefile.am
@@ -4,6 +4,7 @@ libpsos_la_LDFLAGS = @XENO_LIB_LDFLAGS@ -version-info 0:0:0
 
 libpsos_la_SOURCES =   \
init.c  \
+   init.h  \
internal.h  \
pt.c\
pt.h\
diff --git a/lib/psos/Makefile.in b/lib/psos/Makefile.in
index c9af455..708de4a 100644
--- a/lib/psos/Makefile.in
+++ b/lib/psos/Makefile.in
@@ -374,6 +374,7 @@ lib_LTLIBRARIES = libpsos.la
 libpsos_la_LDFLAGS = @XENO_LIB_LDFLAGS@ -version-info 0:0:0
 libpsos_la_SOURCES = \
init.c  \
+   init.h  \
internal.h  \
pt.c\
pt.h\
diff --git a/lib/psos/init.c b/lib/psos/init.c
index 016534e..9d90eb8 100644
--- a/lib/psos/init.c
+++ b/lib/psos/init.c
@@ -27,6 +27,7 @@
 #include 
 #include 
 #include 
+#include "init.h"
 #include "internal.h"
 #include "tm.h"
 #include "task.h"
@@ -126,7 +127,7 @@ static struct copperskin psos_skin = {
.help = psos_help,
 };
 
-static __attribute__ ((constructor)) void register_psos(void)
+static __libpsos_ctor void register_psos(void)
 {
copperplate_register_skin(&psos_skin);
 }
diff --git a/lib/psos/init.h b/lib/psos/init.h
new file mode 100644
index 000..eaaf265
--- /dev/null
+++ b/lib/psos/init.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2014 Philippe Gerum .
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef _PSOS_INIT_H
+#define _PSOS_INIT_H
+
+#define __LIBPSOS_CTOR_PRIO  300
+
+#define __libpsos_ctor  __attribute__ ((constructor(__LIBPSOS_CTOR_PRIO)))
+
+#endif /* _PSOS_INIT_H */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate/debug: prevent deadlocking on printout lock acquisition

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: e9bf0ddb482dee50c352cd2b480c5c693908fea6
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e9bf0ddb482dee50c352cd2b480c5c693908fea6

Author: Philippe Gerum 
Date:   Mon Apr 21 12:11:05 2014 +0200

boilerplate/debug: prevent deadlocking on printout lock acquisition

The notification signal (SIGNOTIFY) may cause the recipient thread to
suspend indefinitely, which may happen while holding the printout
serialization lock.

To prevent this, we block the notification signal (if) defined by the
underlying real-time core while holding such lock.

See http://www.xenomai.org/pipermail/xenomai/2014-April/030580.html.

---

 include/boilerplate/ancillaries.h|1 +
 include/cobalt/boilerplate/signal.h  |   10 ++
 include/mercury/boilerplate/signal.h |   15 +++
 lib/boilerplate/ancillaries.c|6 ++
 lib/boilerplate/debug.c  |6 ++
 5 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/include/boilerplate/ancillaries.h 
b/include/boilerplate/ancillaries.h
index f1b4118..c8b4ec7 100644
--- a/include/boilerplate/ancillaries.h
+++ b/include/boilerplate/ancillaries.h
@@ -21,6 +21,7 @@
 #include 
 #include 
 #include 
+#include 
 
 extern struct timespec __init_date;
 
diff --git a/include/cobalt/boilerplate/signal.h 
b/include/cobalt/boilerplate/signal.h
index 2f7ca95..4807a51 100644
--- a/include/cobalt/boilerplate/signal.h
+++ b/include/cobalt/boilerplate/signal.h
@@ -20,4 +20,14 @@
 
 #include 
 
+#define SIGSAFE_LOCK_ENTRY(__safelock) \
+   do {\
+   push_cleanup_lock(__safelock);  \
+   write_lock(__safelock);
+
+#define SIGSAFE_LOCK_EXIT(__safelock)  \
+   write_unlock(__safelock);   \
+   pop_cleanup_lock(&__safelock);  \
+   } while (0)
+
 #endif /* _COBALT_BOILERPLATE_SIGNAL_H */
diff --git a/include/mercury/boilerplate/signal.h 
b/include/mercury/boilerplate/signal.h
index 61efda4..14523cd 100644
--- a/include/mercury/boilerplate/signal.h
+++ b/include/mercury/boilerplate/signal.h
@@ -27,4 +27,19 @@
 #define SIGNOTIFY  (SIGRTMIN + 8) /* Internal notification */
 #define SIGRELS(SIGRTMIN + 9) /* Syscall abort */
 
+#define SIGSAFE_LOCK_ENTRY(__safelock) \
+   do {\
+   sigset_t __safeset, __oldsafeset;   \
+   sigemptyset(&__safeset);\
+   sigaddset(&__safeset, SIGNOTIFY);   \
+   pthread_sigmask(SIG_BLOCK, &__safeset, &__oldsafeset);  \
+   push_cleanup_lock(__safelock);  \
+   write_lock(__safelock);
+
+#define SIGSAFE_LOCK_EXIT(__safelock)  \
+   write_unlock(__safelock);   \
+   pop_cleanup_lock(&__safelock);  \
+   pthread_sigmask(SIG_SETMASK, &__oldsafeset, NULL);  \
+   } while (0)
+
 #endif /* _MERCURY_BOILERPLATE_SIGNAL_H */
diff --git a/lib/boilerplate/ancillaries.c b/lib/boilerplate/ancillaries.c
index 688aeee..2d5f532 100644
--- a/lib/boilerplate/ancillaries.c
+++ b/lib/boilerplate/ancillaries.c
@@ -48,8 +48,7 @@ void __printout(const char *name, const char *header,
ms = ns / 100ULL;
us = (ns % 100ULL) / 1000ULL;
 
-   push_cleanup_lock(&__printlock);
-   write_lock(&__printlock);
+   SIGSAFE_LOCK_ENTRY(&__printlock);
 
fprintf(fp, "%4d\"%.3d.%.3d| ",
(int)ms / 1000, (int)ms % 1000, (int)us);
@@ -62,8 +61,7 @@ void __printout(const char *name, const char *header,
fputc('\n', fp);
fflush(fp);
 
-   write_unlock(&__printlock);
-   pop_cleanup_lock(&__printlock);
+   SIGSAFE_LOCK_EXIT(&__printlock);
 }
 
 void __warning(const char *name, const char *fmt, va_list ap)
diff --git a/lib/boilerplate/debug.c b/lib/boilerplate/debug.c
index d77b1d9..d9c82b5 100644
--- a/lib/boilerplate/debug.c
+++ b/lib/boilerplate/debug.c
@@ -127,8 +127,7 @@ void backtrace_dump(struct backtrace_data *btd)
if (btd == NULL)
btd = &main_btd;
 
-   push_cleanup_lock(&__printlock);
-   read_lock(&__printlock);
+   SIGSAFE_LOCK_ENTRY(&__printlock);
 
if (btd->inner == NULL)
goto no_error;
@@ -149,8 +148,7 @@ void backtrace_dump(struct backtrace_data *btd)
flush_backtrace(btd);
 
 no_error:
-   read_unlock(&__printlock);
-   pop_cleanup_lock(&__printlock);
+   SIGSAFE_LOCK_EXIT(&__printlock);
 }
 
 void backtrace_check(void)


___
Xeno

[Xenomai-git] Philippe Gerum : boilerplate/debug: handle NULL name thread gracefully

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: e98ea4edce0758c51b4a86e4a976597fa55e41e4
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e98ea4edce0758c51b4a86e4a976597fa55e41e4

Author: Philippe Gerum 
Date:   Sun Apr 20 11:59:06 2014 +0200

boilerplate/debug: handle NULL name thread gracefully

---

 lib/boilerplate/debug.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/boilerplate/debug.c b/lib/boilerplate/debug.c
index 37de802..d77b1d9 100644
--- a/lib/boilerplate/debug.c
+++ b/lib/boilerplate/debug.c
@@ -106,7 +106,7 @@ void backtrace_init_context(struct backtrace_data *btd,
 {
__RT(pthread_mutex_init(&btd->lock, NULL));
btd->inner = NULL;
-   btd->name = name;
+   btd->name = name ?: "";
pthread_setspecific(btkey, btd);
 }
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/synch: drop typedefs for non-opaque aggregates

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: fe5fcd4d4953cd515295f11755f7d60554e54fdb
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fe5fcd4d4953cd515295f11755f7d60554e54fdb

Author: Philippe Gerum 
Date:   Tue Apr 15 17:44:31 2014 +0200

cobalt/synch: drop typedefs for non-opaque aggregates

---

 include/cobalt/kernel/rtdm/driver.h |8 
 include/cobalt/kernel/select.h  |2 +-
 include/cobalt/kernel/synch.h   |4 ++--
 kernel/cobalt/posix/mutex.h |2 +-
 kernel/cobalt/rtdm/drvlib.c |2 +-
 kernel/cobalt/thread.c  |4 ++--
 6 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index 47e59b2..dc8f2f3 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -1165,7 +1165,7 @@ void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, 
nanosecs_rel_t timeout);
 /* --- event services --- */
 
 typedef struct {
-   xnsynch_t synch_base;
+   struct xnsynch synch_base;
DECLARE_XNSELECT(select_block);
 } rtdm_event_t;
 
@@ -1182,7 +1182,7 @@ void rtdm_event_signal(rtdm_event_t *event);
 void rtdm_event_clear(rtdm_event_t *event);
 
 #ifndef DOXYGEN_CPP /* Avoid static inline tags for RTDM in doxygen */
-void __rtdm_synch_flush(xnsynch_t *synch, unsigned long reason);
+void __rtdm_synch_flush(struct xnsynch *synch, unsigned long reason);
 
 static inline void rtdm_event_pulse(rtdm_event_t *event)
 {
@@ -1202,7 +1202,7 @@ static inline void rtdm_event_destroy(rtdm_event_t *event)
 
 typedef struct {
unsigned long value;
-   xnsynch_t synch_base;
+   struct xnsynch synch_base;
DECLARE_XNSELECT(select_block);
 } rtdm_sem_t;
 
@@ -1226,7 +1226,7 @@ static inline void rtdm_sem_destroy(rtdm_sem_t *sem)
 /* --- mutex services --- */
 
 typedef struct {
-   xnsynch_t synch_base;
+   struct xnsynch synch_base;
 } rtdm_mutex_t;
 
 void rtdm_mutex_init(rtdm_mutex_t *mutex);
diff --git a/include/cobalt/kernel/select.h b/include/cobalt/kernel/select.h
index 20398f4..e10de38 100644
--- a/include/cobalt/kernel/select.h
+++ b/include/cobalt/kernel/select.h
@@ -37,7 +37,7 @@
 #define XNSELECT_MAX_TYPES 3
 
 struct xnselector {
-   xnsynch_t synchbase;
+   struct xnsynch synchbase;
struct fds {
fd_set expected;
fd_set pending;
diff --git a/include/cobalt/kernel/synch.h b/include/cobalt/kernel/synch.h
index 181e053..78f3402 100644
--- a/include/cobalt/kernel/synch.h
+++ b/include/cobalt/kernel/synch.h
@@ -49,7 +49,7 @@
 struct xnthread;
 struct xnsynch;
 
-typedef struct xnsynch {
+struct xnsynch {
struct list_head link;  /** thread->claimq */
int wprio;  /** wait prio in claimq */
unsigned long status;/** Status word */
@@ -57,7 +57,7 @@ typedef struct xnsynch {
struct xnthread *owner; /** Thread which owns the resource */
atomic_long_t *fastlock; /** Pointer to fast lock word */
void (*cleanup)(struct xnsynch *synch); /* Cleanup handler */
-} xnsynch_t;
+};
 
 static inline void xnsynch_set_status(struct xnsynch *synch, int bits)
 {
diff --git a/kernel/cobalt/posix/mutex.h b/kernel/cobalt/posix/mutex.h
index 0fc29e6..d3579ce 100644
--- a/kernel/cobalt/posix/mutex.h
+++ b/kernel/cobalt/posix/mutex.h
@@ -26,7 +26,7 @@ typedef struct cobalt_mutexattr pthread_mutexattr_t;
 
 struct cobalt_mutex {
unsigned int magic;
-   xnsynch_t synchbase;
+   struct xnsynch synchbase;
/** cobalt_mutexq */
struct list_head link;
struct list_head conds;
diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c
index a89decc..0ac47dd 100644
--- a/kernel/cobalt/rtdm/drvlib.c
+++ b/kernel/cobalt/rtdm/drvlib.c
@@ -659,7 +659,7 @@ void rtdm_timer_stop_in_handler(rtdm_timer_t *timer);
 
 #define RTDM_SYNCH_DELETED  XNSYNCH_SPARE0
 
-void __rtdm_synch_flush(xnsynch_t *synch, unsigned long reason)
+void __rtdm_synch_flush(struct xnsynch *synch, unsigned long reason)
 {
spl_t s;
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 2182f6e..e2152ba 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -735,7 +735,7 @@ int xnthread_set_mode(xnthread_t *thread, int clrmask, int 
setmask)
 EXPORT_SYMBOL_GPL(xnthread_set_mode);
 
 /**
- * @fn void xnthread_suspend(xnthread_t *thread, int mask,xnticks_t timeout, 
xntmode_t timeout_mode,xnsynch_t *wchan)
+ * @fn void xnthread_suspend(xnthread_t *thread, int mask,xnticks_t timeout, 
xntmode_t timeout_mode,struct xnsynch *wchan)
  * @brief Suspend a thread.
  *
  * Suspends the execution of a thread according to a given suspensive
@@ -794,7 +794,7 @@ EXPORT_SYMBOL_GPL(xnthread_set_mode);
  */
 void xnthread_suspend(xnthread_t *thread, int mask,
  xnticks_t timeout, xntmode_t timeout_mode,
- xnsynch_t *wchan)
+ 

[Xenomai-git] Philippe Gerum : alchemy/task: export kernel tid to RT_TASK_INFO

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 5d9db042e4ebeb8283dcaeb4949356f5da806ae8
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=5d9db042e4ebeb8283dcaeb4949356f5da806ae8

Author: Philippe Gerum 
Date:   Wed Apr 23 12:31:25 2014 +0200

alchemy/task: export kernel tid to RT_TASK_INFO

---

 doc/asciidoc/MIGRATION.adoc |2 ++
 include/alchemy/task.h  |4 
 lib/alchemy/task.c  |1 +
 3 files changed, 7 insertions(+)

diff --git a/doc/asciidoc/MIGRATION.adoc b/doc/asciidoc/MIGRATION.adoc
index a013447..b7a5787 100644
--- a/doc/asciidoc/MIGRATION.adoc
+++ b/doc/asciidoc/MIGRATION.adoc
@@ -724,6 +724,8 @@ Rationale: This behavior can be achieved by not calling
  corresponding information is too short-lived to be valuable to
  the caller. The task's base priority is still available from
  the +prio+ field.
+   * new field +pid+ represents the Linux kernel task identifier for
+ the Alchemy task, as obtained from syscall(__NR_gettid).
* other fields which represent runtime statistics are now avail
  from a core-specific +stat+ field sub-structure.
 
diff --git a/include/alchemy/task.h b/include/alchemy/task.h
index 7a2eb1c..0387e57 100644
--- a/include/alchemy/task.h
+++ b/include/alchemy/task.h
@@ -76,6 +76,10 @@ struct RT_TASK_INFO {
 * Name of task.
 */
char name[XNOBJECT_NAME_LEN];
+   /**
+* Host pid.
+*/
+   pid_t pid;
 };
 
 typedef struct RT_TASK_INFO RT_TASK_INFO;
diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c
index 8d106fc..254aa5f 100644
--- a/lib/alchemy/task.c
+++ b/lib/alchemy/task.c
@@ -1480,6 +1480,7 @@ int rt_task_inquire(RT_TASK *task, RT_TASK_INFO *info)
 
strcpy(info->name, tcb->name);
info->prio = threadobj_get_priority(&tcb->thobj);
+   info->pid = threadobj_get_pid(&tcb->thobj);
 
put_alchemy_task(tcb);
 out:


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate/ancillaries: define ONE_BILLION

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 823efeeed450ae7b86fa7e7af50b04f0dc71e417
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=823efeeed450ae7b86fa7e7af50b04f0dc71e417

Author: Philippe Gerum 
Date:   Thu Apr 24 17:30:15 2014 +0200

boilerplate/ancillaries: define ONE_BILLION

---

 include/boilerplate/ancillaries.h |2 ++
 testsuite/latency/latency.c   |1 -
 testsuite/unit/sched-quota.c  |2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/boilerplate/ancillaries.h 
b/include/boilerplate/ancillaries.h
index c8b4ec7..9d5818f 100644
--- a/include/boilerplate/ancillaries.h
+++ b/include/boilerplate/ancillaries.h
@@ -43,6 +43,8 @@ struct name_generator {
.serial = 1,\
}
 
+#define ONE_BILLION  10
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/testsuite/latency/latency.c b/testsuite/latency/latency.c
index 12b90a9..5efc344 100644
--- a/testsuite/latency/latency.c
+++ b/testsuite/latency/latency.c
@@ -19,7 +19,6 @@ RT_TASK latency_task, display_task;
 
 RT_SEM display_sem;
 
-#define ONE_BILLION  10
 #define TEN_MILLION1000
 
 unsigned max_relaxed;
diff --git a/testsuite/unit/sched-quota.c b/testsuite/unit/sched-quota.c
index 1347bf7..fef6880 100644
--- a/testsuite/unit/sched-quota.c
+++ b/testsuite/unit/sched-quota.c
@@ -36,10 +36,10 @@
 #include 
 #include 
 #include 
+#include 
 
 #define MAX_THREADS 8
 #define TEST_SECS   1
-#define ONE_BILLION 10UL
 
 static unsigned long long crunch_per_sec, loops_per_sec;
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate/lock: include cancelability state in safety check

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: a48cd406581e0434d8e00df7830d3db150582727
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=a48cd406581e0434d8e00df7830d3db150582727

Author: Philippe Gerum 
Date:   Wed Apr 23 15:42:57 2014 +0200

boilerplate/lock: include cancelability state in safety check

---

 lib/boilerplate/ancillaries.c |   18 --
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/lib/boilerplate/ancillaries.c b/lib/boilerplate/ancillaries.c
index 2d5f532..fc58afd 100644
--- a/lib/boilerplate/ancillaries.c
+++ b/lib/boilerplate/ancillaries.c
@@ -209,15 +209,21 @@ __attribute__ ((weak)) void *__main_heap = NULL;
 
 int __check_cancel_type(const char *locktype)
 {
-   int oldtype;
+   int oldtype, oldstate;
 
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
-   if (oldtype != PTHREAD_CANCEL_DEFERRED) {
-   warning("%s_nocancel() section is NOT cancel-safe", locktype);
-   return __bt(-EINVAL);
-   }
+   if (oldtype == PTHREAD_CANCEL_DEFERRED)
+   return 0;
+
+   pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+   if (oldstate == PTHREAD_CANCEL_DISABLE)
+   return 0;
+
+   abort();
+   warning("%s_nocancel() section is NOT cancel-safe", locktype);
+   pthread_setcancelstate(oldstate, NULL);
 
-   return 0;
+   return __bt(-EINVAL);
 }
 
 #endif /* CONFIG_XENO_DEBUG */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/registry: protect locked sections traversing cancellation points

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 9f232b8c814af11c166cf3875bb2fc475293cecb
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=9f232b8c814af11c166cf3875bb2fc475293cecb

Author: Philippe Gerum 
Date:   Mon Apr 21 16:37:19 2014 +0200

copperplate/registry: protect locked sections traversing cancellation points

All fs methods invoking user-defined handlers may reach cancellation
points indirectly, so protect all locks held across those calls
against asynchronous cancellation of the registry thread (although
this should never happen under normal circumstances).

---

 lib/copperplate/registry.c |8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/lib/copperplate/registry.c b/lib/copperplate/registry.c
index b3ef2ed..1606cd7 100644
--- a/lib/copperplate/registry.c
+++ b/lib/copperplate/registry.c
@@ -367,7 +367,8 @@ static int regfs_open(const char *path, struct 
fuse_file_info *fi)
int ret = 0;
void *priv;
 
-   read_lock_nocancel(&p->lock);
+   push_cleanup_lock(&p->lock);
+   read_lock(&p->lock);
 
hobj = pvhash_search(&p->files, path, strlen(path));
if (hobj == NULL) {
@@ -395,6 +396,7 @@ static int regfs_open(const char *path, struct 
fuse_file_info *fi)
ret = __bt(fsobj->ops->open(fsobj, priv));
 done:
read_unlock(&p->lock);
+   pop_cleanup_lock(&p->lock);
 
return __bt(ret);
 }
@@ -407,7 +409,8 @@ static int regfs_release(const char *path, struct 
fuse_file_info *fi)
int ret = 0;
void *priv;
 
-   read_lock_nocancel(&p->lock);
+   push_cleanup_lock(&p->lock);
+   read_lock(&p->lock);
 
hobj = pvhash_search(&p->files, path, strlen(path));
if (hobj == NULL) {
@@ -423,6 +426,7 @@ static int regfs_release(const char *path, struct 
fuse_file_info *fi)
__STD(free(priv));
 done:
read_unlock(&p->lock);
+   pop_cleanup_lock(&p->lock);
 
return __bt(ret);
 }


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/task: use builtin specifier for infinite delay

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 689a22adc6a52d4b5a713e3da7d2af8123aa2bb2
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=689a22adc6a52d4b5a713e3da7d2af8123aa2bb2

Author: Philippe Gerum 
Date:   Wed Apr 23 12:25:54 2014 +0200

alchemy/task: use builtin specifier for infinite delay

---

 lib/alchemy/task.c |   12 +++-
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c
index bd238c3..8d106fc 100644
--- a/lib/alchemy/task.c
+++ b/lib/alchemy/task.c
@@ -880,7 +880,10 @@ int rt_task_wait_period(unsigned long *overruns_r)
  * time in such a state.
  *
  * @param date An absolute date expressed in clock ticks, specifying a
- * wakeup date (see note).
+ * wakeup date (see note). As a special case, TM_INFINITE is an
+ * acceptable value that causes the caller to block indefinitely,
+ * until rt_task_unblock() is called against it. Otherwise, any wake
+ * up date in the past causes the task to return immediately.
  *
  * @return Zero is returned upon success. Otherwise:
  *
@@ -908,10 +911,9 @@ int rt_task_sleep_until(RTIME date)
if (!threadobj_current_p())
return -EPERM;
 
-   if (date == TM_INFINITE) {
-   ts.tv_sec = (time_t)-1 >> 1;
-   ts.tv_nsec = 9;
-   } else {
+   if (date == TM_INFINITE)
+   ts = zero_time;
+   else {
clockobj_get_time(&alchemy_clock, &now, NULL);
if (date <= now)
return -ETIMEDOUT;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/map: drop typedefs for non-opaque aggregates

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 42f329035543fe8208672c80033c476af4625634
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=42f329035543fe8208672c80033c476af4625634

Author: Philippe Gerum 
Date:   Tue Apr 15 17:38:08 2014 +0200

cobalt/map: drop typedefs for non-opaque aggregates

---

 include/cobalt/kernel/map.h |   22 ++
 kernel/cobalt/map.c |   20 ++--
 2 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/include/cobalt/kernel/map.h b/include/cobalt/kernel/map.h
index 4a67602..cd58dc1 100644
--- a/include/cobalt/kernel/map.h
+++ b/include/cobalt/kernel/map.h
@@ -30,8 +30,7 @@
 
 #define XNMAP_MAX_KEYS (BITS_PER_LONG * BITS_PER_LONG)
 
-typedef struct xnmap {
-
+struct xnmap {
 int nkeys;
 int ukeys;
 int offset;
@@ -41,29 +40,28 @@ typedef struct xnmap {
 unsigned long lomap[__IDMAP_LONGS];
 #undef __IDMAP_LONGS
 void *objarray[1];
+};
 
-} xnmap_t;
-
-xnmap_t *xnmap_create(int nkeys,
- int reserve,
- int offset);
+struct xnmap *xnmap_create(int nkeys,
+  int reserve,
+  int offset);
 
-void xnmap_delete(xnmap_t *map);
+void xnmap_delete(struct xnmap *map);
 
-int xnmap_enter(xnmap_t *map,
+int xnmap_enter(struct xnmap *map,
int key,
void *objaddr);
 
-int xnmap_remove(xnmap_t *map,
+int xnmap_remove(struct xnmap *map,
 int key);
 
-static inline void *xnmap_fetch_nocheck(xnmap_t *map, int key)
+static inline void *xnmap_fetch_nocheck(struct xnmap *map, int key)
 {
int ofkey = key - map->offset;
return map->objarray[ofkey];
 }
 
-static inline void *xnmap_fetch(xnmap_t *map, int key)
+static inline void *xnmap_fetch(struct xnmap *map, int key)
 {
int ofkey = key - map->offset;
 
diff --git a/kernel/cobalt/map.c b/kernel/cobalt/map.c
index 8b66a20..a98b4c6 100644
--- a/kernel/cobalt/map.c
+++ b/kernel/cobalt/map.c
@@ -81,9 +81,9 @@
  * @remark Tags: none.
  */
 
-xnmap_t *xnmap_create(int nkeys, int reserve, int offset)
+struct xnmap *xnmap_create(int nkeys, int reserve, int offset)
 {
-   xnmap_t *map;
+   struct xnmap *map;
int mapsize;
 
if (nkeys <= 0 || (nkeys & (nkeys - 1)) != 0)
@@ -108,7 +108,7 @@ xnmap_t *xnmap_create(int nkeys, int reserve, int offset)
 EXPORT_SYMBOL_GPL(xnmap_create);
 
 /**
- * @fn void xnmap_delete(xnmap_t *map)
+ * @fn void xnmap_delete(struct xnmap *map)
  * @brief Delete a map.
  *
  * Deletes a map, freeing any associated memory back to the Xenomai
@@ -119,14 +119,14 @@ EXPORT_SYMBOL_GPL(xnmap_create);
  * @remark Tags: none.
  */
 
-void xnmap_delete(xnmap_t *map)
+void xnmap_delete(struct xnmap *map)
 {
xnfree(map);
 }
 EXPORT_SYMBOL_GPL(xnmap_delete);
 
 /**
- * @fn void xnmap_enter(xnmap_t *map, int key, void *objaddr)
+ * @fn void xnmap_enter(struct xnmap *map, int key, void *objaddr)
  * @brief Index an object into a map.
  *
  * Insert a new object into the given map.
@@ -153,7 +153,7 @@ EXPORT_SYMBOL_GPL(xnmap_delete);
  * @remark Tags: isr-allowed.
  */
 
-int xnmap_enter(xnmap_t *map, int key, void *objaddr)
+int xnmap_enter(struct xnmap *map, int key, void *objaddr)
 {
int hi, lo, ofkey = key - map->offset;
spl_t s;
@@ -195,7 +195,7 @@ int xnmap_enter(xnmap_t *map, int key, void *objaddr)
 EXPORT_SYMBOL_GPL(xnmap_enter);
 
 /**
- * @fn void xnmap_remove(xnmap_t *map, int key)
+ * @fn void xnmap_remove(struct xnmap *map, int key)
  * @brief Remove an object reference from a map.
  *
  * Removes an object reference from the given map, releasing the
@@ -213,7 +213,7 @@ EXPORT_SYMBOL_GPL(xnmap_enter);
  * @remark Tags: isr-allowed.
  */
 
-int xnmap_remove(xnmap_t *map, int key)
+int xnmap_remove(struct xnmap *map, int key)
 {
int ofkey = key - map->offset, hi, lo;
spl_t s;
@@ -235,7 +235,7 @@ int xnmap_remove(xnmap_t *map, int key)
 EXPORT_SYMBOL_GPL(xnmap_remove);
 
 /**
- * @fn void xnmap_fetch(xnmap_t *map, int key)
+ * @fn void xnmap_fetch(struct xnmap *map, int key)
  * @brief Search an object into a map.
  *
  * Retrieve an object reference from the given map by its index key.
@@ -252,7 +252,7 @@ EXPORT_SYMBOL_GPL(xnmap_remove);
  */
 
 /**
- * @fn void xnmap_fetch_nocheck(xnmap_t *map, int key)
+ * @fn void xnmap_fetch_nocheck(struct xnmap *map, int key)
  * @brief Search an object into a map - unchecked form.
  *
  * Retrieve an object reference from the given map by its index key,


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/kernel: introduce knamecpy()

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 54a2a404919a86e3f108f07190db4794525c38e6
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=54a2a404919a86e3f108f07190db4794525c38e6

Author: Philippe Gerum 
Date:   Sun Apr 20 11:22:29 2014 +0200

cobalt/kernel: introduce knamecpy()

---

 include/cobalt/kernel/ancillaries.h |   13 +
 include/cobalt/kernel/registry.h|6 --
 kernel/cobalt/clock.c   |4 ++--
 kernel/cobalt/heap.c|2 +-
 kernel/cobalt/posix/thread.c|3 +--
 kernel/cobalt/sched.c   |4 ++--
 kernel/cobalt/timer.c   |9 ++---
 kernel/cobalt/trace/cobalt-core.h   |4 +---
 8 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/include/cobalt/kernel/ancillaries.h 
b/include/cobalt/kernel/ancillaries.h
index 88c0afb..312c181 100644
--- a/include/cobalt/kernel/ancillaries.h
+++ b/include/cobalt/kernel/ancillaries.h
@@ -20,6 +20,8 @@
 #define _COBALT_KERNEL_ANCILLARIES_H
 
 #include 
+#include 
+#include 
 
 #define ksformat(__dst, __len, __fmt, __args...)   \
({  \
@@ -49,4 +51,15 @@
kvasprintf(GFP_KERNEL, __fmt, __ap);\
})
 
+void __knamecpy_requires_character_array_as_destination(void);
+
+#define knamecpy(__dst, __src) \
+   ({  \
+   if (!__builtin_types_compatible_p(typeof(__dst), char[])) \
+   __knamecpy_requires_character_array_as_destination();   
\
+   strncpy((__dst), __src, sizeof(__dst) - 1); \
+   __dst[sizeof(__dst) - 1] = '\0';\
+   __dst;  \
+})
+   
 #endif /* !_COBALT_KERNEL_ANCILLARIES_H */
diff --git a/include/cobalt/kernel/registry.h b/include/cobalt/kernel/registry.h
index 9c80352..d0109c5 100644
--- a/include/cobalt/kernel/registry.h
+++ b/include/cobalt/kernel/registry.h
@@ -50,12 +50,6 @@ struct xnobject {
struct list_head link;
 };
 
-static inline void xnobject_copy_name(char *dst, const char *src)
-{
-   strncpy(dst, src ?: "", XNOBJECT_NAME_LEN-1);
-   dst[XNOBJECT_NAME_LEN-1] = '\0';
-}
-
 int xnregistry_init(void);
 
 void xnregistry_cleanup(void);
diff --git a/kernel/cobalt/clock.c b/kernel/cobalt/clock.c
index 71fae16..a2553d1 100644
--- a/kernel/cobalt/clock.c
+++ b/kernel/cobalt/clock.c
@@ -385,8 +385,8 @@ static int clock_vfile_next(struct 
xnvfile_snapshot_iterator *it, void *data)
p->timeout = xntimer_get_timeout(timer);
p->interval = xntimer_get_interval(timer);
p->status = timer->status;
-   strncpy(p->handler, timer->handler_name, 16)[16] = '\0';
-   xnobject_copy_name(p->name, timer->name);
+   knamecpy(p->handler, timer->handler_name);
+   knamecpy(p->name, timer->name);
 
return 1;
 }
diff --git a/kernel/cobalt/heap.c b/kernel/cobalt/heap.c
index dcc7129..f267976 100644
--- a/kernel/cobalt/heap.c
+++ b/kernel/cobalt/heap.c
@@ -142,7 +142,7 @@ static int vfile_next(struct xnvfile_snapshot_iterator *it, 
void *data)
p->usable_mem = xnheap_usable_mem(heap);
p->used_mem = xnheap_used_mem(heap);
p->page_size = xnheap_page_size(heap);
-   strncpy(p->label, heap->label, sizeof(p->label));
+   knamecpy(p->label, heap->label);
 
return 1;
 }
diff --git a/kernel/cobalt/posix/thread.c b/kernel/cobalt/posix/thread.c
index 1d547cf..cd5376b 100644
--- a/kernel/cobalt/posix/thread.c
+++ b/kernel/cobalt/posix/thread.c
@@ -1056,8 +1056,7 @@ int cobalt_thread_set_name_np(unsigned long pth, const 
char __user *u_name)
 
xnlock_put_irqrestore(&nklock, s);
 
-   strncpy(p->comm, name, sizeof(p->comm));
-   p->comm[sizeof(p->comm) - 1] = '\0';
+   knamecpy(p->comm, name);
put_task_struct(p);
 
return 0;
diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c
index 61d0580..41aed20 100644
--- a/kernel/cobalt/sched.c
+++ b/kernel/cobalt/sched.c
@@ -908,8 +908,8 @@ static int vfile_schedlist_next(struct 
xnvfile_snapshot_iterator *it,
memcpy(p->name, thread->name, sizeof(p->name));
p->cprio = thread->cprio;
p->state = xnthread_state_flags(thread);
-   xnobject_copy_name(p->sched_class, thread->sched_class->name);
-   xnobject_copy_name(p->personality, thread->personality->name);
+   knamecpy(p->sched_class, thread->sched_class->name);
+   knamecpy(p->personality, thread->personality->name);
period = xnthread_get_period(thread);
timeout = xnthread_get_timeout(thread, priv->start_time);
/*
diff --git a/kernel/cobalt/timer.c b/kernel/cobalt/timer.c
index e493ac6..ac3aa9f 100644
--- a/kernel/cobalt/timer.c
+++ b/kernel/cobalt/timer.c
@@ -347,13 +347,8 @@

[Xenomai-git] Philippe Gerum : cobalt/sched: rebase multi-level queues over regular kernel bitmaps

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: c0fec740d9221b920df0ae2eaede0d99b8756e5c
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=c0fec740d9221b920df0ae2eaede0d99b8756e5c

Author: Philippe Gerum 
Date:   Mon Apr 14 18:04:12 2014 +0200

cobalt/sched: rebase multi-level queues over regular kernel bitmaps

---

 include/cobalt/kernel/schedqueue.h |   21 +++
 kernel/cobalt/sched.c  |   39 
 2 files changed, 20 insertions(+), 40 deletions(-)

diff --git a/include/cobalt/kernel/schedqueue.h 
b/include/cobalt/kernel/schedqueue.h
index 15817b2..09077e4 100644
--- a/include/cobalt/kernel/schedqueue.h
+++ b/include/cobalt/kernel/schedqueue.h
@@ -25,28 +25,23 @@
 #define XNSCHED_CLASS_WEIGHT_FACTOR1024
 
 #ifdef CONFIG_XENO_OPT_SCALABLE_SCHED
+
+#include 
+
 /*
  * Multi-level priority queue, suitable for handling the runnable
  * thread queue of a scheduling class with O(1) property. We only
  * manage a descending queuing order, i.e. highest numbered priorities
  * come first.
  */
-#define XNSCHED_MLQ_LEVELS  264
-
-#if BITS_PER_LONG * BITS_PER_LONG < XNSCHED_MLQ_LEVELS
-#error "internal bitmap cannot hold so many priority levels"
-#endif
-
-#define __MLQ_LONGS ((XNSCHED_MLQ_LEVELS+BITS_PER_LONG-1)/BITS_PER_LONG)
+#define XNSCHED_MLQ_LEVELS  258/* i.e. XNSCHED_RT_NR_PRIO */
 
 struct xnsched_mlq {
int elems;
-   unsigned long himap, lomap[__MLQ_LONGS];
+   DECLARE_BITMAP(prio_map, XNSCHED_MLQ_LEVELS);
struct list_head heads[XNSCHED_MLQ_LEVELS];
 };
 
-#undef __MLQ_LONGS
-
 struct xnthread;
 
 void xnsched_initq(struct xnsched_mlq *q);
@@ -64,14 +59,12 @@ struct xnthread *xnsched_getq(struct xnsched_mlq *q);
 
 static inline int xnsched_emptyq_p(struct xnsched_mlq *q)
 {
-   return q->himap == 0;
+   return q->elems == 0;
 }
 
 static inline int xnsched_weightq(struct xnsched_mlq *q)
 {
-   int hi = ffnz(q->himap);
-   int lo = ffnz(q->lomap[hi]);
-   return hi * BITS_PER_LONG + lo; /* Result is undefined if none set. */
+   return find_first_bit(q->prio_map, XNSCHED_MLQ_LEVELS);
 }
 
 typedef struct xnsched_mlq xnsched_queue_t;
diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c
index d89889e..47d2f13 100644
--- a/kernel/cobalt/sched.c
+++ b/kernel/cobalt/sched.c
@@ -497,8 +497,7 @@ void xnsched_initq(struct xnsched_mlq *q)
int prio;
 
q->elems = 0;
-   q->himap = 0;
-   memset(&q->lomap, 0, sizeof(q->lomap));
+   bitmap_zero(q->prio_map, XNSCHED_MLQ_LEVELS);
 
for (prio = 0; prio < XNSCHED_MLQ_LEVELS; prio++)
INIT_LIST_HEAD(q->heads + prio);
@@ -506,35 +505,30 @@ void xnsched_initq(struct xnsched_mlq *q)
 
 static inline int get_qindex(struct xnsched_mlq *q, int prio)
 {
-   XENO_BUGON(NUCLEUS, prio < XNSCHED_RT_MIN_PRIO ||
-  prio > XNSCHED_RT_MAX_PRIO);
+   XENO_BUGON(NUCLEUS, prio < 0 || prio >= XNSCHED_MLQ_LEVELS);
/*
 * BIG FAT WARNING: We need to rescale the priority level to a
-* 0-based range. We use ffnz() to scan the bitmap which MUST
-* be based on a bit scan forward op. Therefore, the lower the
-* index value, the higher the priority (since least
+* 0-based range. We use find_first_bit() to scan the bitmap
+* which is a bit scan forward operation. Therefore, the lower
+* the index value, the higher the priority (since least
 * significant bits will be found first when scanning the
-* bitmaps).
+* bitmap).
 */
-   return XNSCHED_RT_MAX_PRIO - prio;
+   return XNSCHED_MLQ_LEVELS - prio - 1;
 }
 
 static struct list_head *add_q(struct xnsched_mlq *q, int prio)
 {
struct list_head *head;
-   int hi, lo, idx;
+   int idx;
 
idx = get_qindex(q, prio);
head = q->heads + idx;
q->elems++;
 
/* New item is not linked yet. */
-   if (list_empty(head)) {
-   hi = idx / BITS_PER_LONG;
-   lo = idx % BITS_PER_LONG;
-   q->himap |= (1UL << hi);
-   q->lomap[hi] |= (1UL << lo);
-   }
+   if (list_empty(head))
+   __set_bit(idx, q->prio_map);
 
return head;
 }
@@ -554,20 +548,13 @@ void xnsched_addq_tail(struct xnsched_mlq *q, struct 
xnthread *thread)
 static void del_q(struct xnsched_mlq *q,
  struct list_head *entry, int idx)
 {
-   struct list_head *head;
-   int hi, lo;
+   struct list_head *head = q->heads + idx;
 
-   head = q->heads + idx;
list_del(entry);
q->elems--;
 
-   if (list_empty(head)) {
-   hi = idx / BITS_PER_LONG;
-   lo = idx % BITS_PER_LONG;
-   q->lomap[hi] &= ~(1UL << lo);
-   if (q->lomap[hi] == 0)
-   q->himap &= ~(1UL << hi);
-   }
+   if (list_empty(head))
+   __clear_bit(idx, q->prio_map)

[Xenomai-git] Philippe Gerum : cobalt/sched-tp: only warn on partition crossing ( do not panic)

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 255a709b8d07850e489949784562145e45431082
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=255a709b8d07850e489949784562145e45431082

Author: Philippe Gerum 
Date:   Thu Apr 24 16:46:42 2014 +0200

cobalt/sched-tp: only warn on partition crossing (do not panic)

---

 kernel/cobalt/sched-tp.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/cobalt/sched-tp.c b/kernel/cobalt/sched-tp.c
index 794f4c9..13c4416 100644
--- a/kernel/cobalt/sched-tp.c
+++ b/kernel/cobalt/sched-tp.c
@@ -152,7 +152,7 @@ static void xnsched_tp_trackprio(struct xnthread *thread,
 */
if (p) {
/* We should never cross partition boundaries. */
-   XENO_BUGON(NUCLEUS,
+   XENO_WARNON(NUCLEUS,
   thread->base_class == &xnsched_class_tp &&
   thread->tps - thread->sched->tp.partitions != 
p->tp.ptid);
thread->cprio = p->tp.prio;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/init: assign explicit priority to constructor

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: d1d4d9e23c563ce11c9203161755ffddc54cdfbc
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d1d4d9e23c563ce11c9203161755ffddc54cdfbc

Author: Philippe Gerum 
Date:   Tue Apr 15 10:40:27 2014 +0200

alchemy/init: assign explicit priority to constructor

---

 lib/alchemy/Makefile.am |1 +
 lib/alchemy/Makefile.in |   10 +-
 lib/alchemy/init.c  |3 ++-
 lib/alchemy/init.h  |   25 +
 4 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/lib/alchemy/Makefile.am b/lib/alchemy/Makefile.am
index 5362695..788a4bb 100644
--- a/lib/alchemy/Makefile.am
+++ b/lib/alchemy/Makefile.am
@@ -4,6 +4,7 @@ libalchemy_la_LDFLAGS = @XENO_LIB_LDFLAGS@ -version-info 0:0:0
 
 libalchemy_la_SOURCES =\
init.c  \
+   init.h  \
internal.c  \
internal.h  \
reference.h \
diff --git a/lib/alchemy/Makefile.in b/lib/alchemy/Makefile.in
index f194abb..0621cbb 100644
--- a/lib/alchemy/Makefile.in
+++ b/lib/alchemy/Makefile.in
@@ -131,7 +131,7 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(libdir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libalchemy_la_LIBADD =
-am__libalchemy_la_SOURCES_DIST = init.c internal.c internal.h \
+am__libalchemy_la_SOURCES_DIST = init.c init.h internal.c internal.h \
reference.h alarm.c alarm.h buffer.c buffer.h cond.c cond.h \
event.c event.h heap.c heap.h mutex.c mutex.h queue.c queue.h \
task.c task.h sem.c sem.h timer.c timer.h pipe.c pipe.h
@@ -385,10 +385,10 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 lib_LTLIBRARIES = libalchemy.la
 libalchemy_la_LDFLAGS = @XENO_LIB_LDFLAGS@ -version-info 0:0:0
-libalchemy_la_SOURCES = init.c internal.c internal.h reference.h \
-   alarm.c alarm.h buffer.c buffer.h cond.c cond.h event.c \
-   event.h heap.c heap.h mutex.c mutex.h queue.c queue.h task.c \
-   task.h sem.c sem.h timer.c timer.h $(am__append_1)
+libalchemy_la_SOURCES = init.c init.h internal.c internal.h \
+   reference.h alarm.c alarm.h buffer.c buffer.h cond.c cond.h \
+   event.c event.h heap.c heap.h mutex.c mutex.h queue.c queue.h \
+   task.c task.h sem.c sem.h timer.c timer.h $(am__append_1)
 libalchemy_la_CPPFLAGS = \
@XENO_USER_CFLAGS@  \
-I$(top_srcdir)/include \
diff --git a/lib/alchemy/init.c b/lib/alchemy/init.c
index ad2e72b..2052cc9 100644
--- a/lib/alchemy/init.c
+++ b/lib/alchemy/init.c
@@ -22,6 +22,7 @@
 #include 
 #include 
 #include 
+#include "init.h"
 #include "timer.h"
 #include "task.h"
 #include "sem.h"
@@ -113,7 +114,7 @@ static struct copperskin alchemy_skin = {
.help = alchemy_help,
 };
 
-static __attribute__ ((constructor)) void register_alchemy(void)
+static __libalchemy_ctor void register_alchemy(void)
 {
copperplate_register_skin(&alchemy_skin);
 }
diff --git a/lib/alchemy/init.h b/lib/alchemy/init.h
new file mode 100644
index 000..ff95bb3
--- /dev/null
+++ b/lib/alchemy/init.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2014 Philippe Gerum .
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef _ALCHEMY_INIT_H
+#define _ALCHEMY_INIT_H
+
+#define __LIBALCHEMY_CTOR_PRIO  300
+
+#define __libalchemy_ctor  __attribute__ 
((constructor(__LIBALCHEMY_CTOR_PRIO)))
+
+#endif /* _ALCHEMY_INIT_H */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/threadobj: drop recursive locking property

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 123256b96cadb35daaf96c65c0ca4a6095d0ec28
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=123256b96cadb35daaf96c65c0ca4a6095d0ec28

Author: Philippe Gerum 
Date:   Mon Apr 14 17:10:25 2014 +0200

copperplate/threadobj: drop recursive locking property

---

 lib/copperplate/threadobj.c |1 -
 1 file changed, 1 deletion(-)

diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index d82473d..8261841 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -865,7 +865,6 @@ void threadobj_init(struct threadobj *thobj,
 */
 
__RT(pthread_mutexattr_init(&mattr));
-   __RT(pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, mutex_scope_attribute));
__RT(pthread_mutex_init(&thobj->lock, &mattr));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/posix/clock: clock_nanosleep: return EINVAL if request->tv_sec < 0

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 23a94d1dc7fd9852f6c11513ec8e1420eb143168
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=23a94d1dc7fd9852f6c11513ec8e1420eb143168

Author: Philippe Gerum 
Date:   Wed Apr 23 10:39:54 2014 +0200

cobalt/posix/clock: clock_nanosleep: return EINVAL if request->tv_sec < 0

Stick to the linux behavior, even if POSIX 1003.1 does not mention
this error case.

---

 kernel/cobalt/posix/clock.c |3 +++
 1 file changed, 3 insertions(+)

diff --git a/kernel/cobalt/posix/clock.c b/kernel/cobalt/posix/clock.c
index 12bbaad..f98592c 100644
--- a/kernel/cobalt/posix/clock.c
+++ b/kernel/cobalt/posix/clock.c
@@ -261,6 +261,9 @@ int cobalt_clock_nanosleep(clockid_t clock_id, int flags,
clock_id != CLOCK_REALTIME)
return -EOPNOTSUPP;
 
+   if (rqt.tv_sec < 0)
+   return -EINVAL;
+
if ((unsigned long)rqt.tv_nsec >= ONE_BILLION)
return -EINVAL;
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : config: bump UAPI level

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: c764713096b634a8dc45a4471ef5b3bccfeedb54
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=c764713096b634a8dc45a4471ef5b3bccfeedb54

Author: Philippe Gerum 
Date:   Thu Apr 24 16:11:15 2014 +0200

config: bump UAPI level

---

 config/apirev |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config/apirev b/config/apirev
index b8626c4..7ed6ff8 100644
--- a/config/apirev
+++ b/config/apirev
@@ -1 +1 @@
-4
+5


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/threadobj: fix cancel state upon start failure

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: d19f23a172aa299e4e215144cd4c0d70a3e661dc
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d19f23a172aa299e4e215144cd4c0d70a3e661dc

Author: Philippe Gerum 
Date:   Wed Apr 23 15:41:38 2014 +0200

copperplate/threadobj: fix cancel state upon start failure

---

 lib/copperplate/threadobj.c |2 ++
 1 file changed, 2 insertions(+)

diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index 5429876..a17870c 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -1082,6 +1082,8 @@ int threadobj_start(struct threadobj *thobj)  /* 
thobj->lock held. */
 * caller to forget about it as well.
 */
if (thobj->run_state == __THREAD_S_DORMANT) {
+   /* Keep cancel-safe after unlock. */
+   thobj->cancel_state = PTHREAD_CANCEL_DISABLE;
threadobj_unlock(thobj);
destroy_thread(thobj);
threadobj_free(thobj);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/kernel: convert legacy trace markers to kernel tracepoints

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 0f9deebd9ed7fc4f8c7294df8dc6b607f95c0839
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=0f9deebd9ed7fc4f8c7294df8dc6b607f95c0839

Author: Philippe Gerum 
Date:   Thu Apr 17 16:02:23 2014 +0200

cobalt/kernel: convert legacy trace markers to kernel tracepoints

Rebase trace statements in the Cobalt core over the generic tracepoint
API. A few former trace markers which did not help in analysing the
dynamic behavior of the system have been dropped in the process.

This work is originally based on Jan Kiszka's trace events conversion
patch series for Xenomai 2.6.

---

 include/cobalt/kernel/synch.h |3 +
 include/cobalt/kernel/thread.h|   25 --
 include/cobalt/kernel/trace.h |5 +-
 kernel/cobalt/clock.c |   10 +-
 kernel/cobalt/init.c  |4 -
 kernel/cobalt/intr.c  |   47 +--
 kernel/cobalt/sched.c |   16 +-
 kernel/cobalt/shadow.c|   70 ++--
 kernel/cobalt/synch.c |   48 ++-
 kernel/cobalt/thread.c|   85 ++---
 kernel/cobalt/timer.c |   12 +-
 kernel/cobalt/trace/cobalt-core.h |  658 +
 scripts/prepare-kernel.sh |1 +
 13 files changed, 768 insertions(+), 216 deletions(-)

diff --git a/include/cobalt/kernel/synch.h b/include/cobalt/kernel/synch.h
index 78f3402..a316e3f 100644
--- a/include/cobalt/kernel/synch.h
+++ b/include/cobalt/kernel/synch.h
@@ -152,6 +152,9 @@ int xnsynch_acquire(struct xnsynch *synch,
xnticks_t timeout,
xntmode_t timeout_mode);
 
+struct xnthread *xnsynch_release(struct xnsynch *synch,
+struct xnthread *thread);
+
 struct xnthread *xnsynch_peek_pendq(struct xnsynch *synch);
 
 int xnsynch_flush(struct xnsynch *synch, int reason);
diff --git a/include/cobalt/kernel/thread.h b/include/cobalt/kernel/thread.h
index b28400b..e053845 100644
--- a/include/cobalt/kernel/thread.h
+++ b/include/cobalt/kernel/thread.h
@@ -317,31 +317,6 @@ static inline int xnthread_try_grab(struct xnthread 
*thread,
return 1;
 }
 
-/*
- * XXX: Mutual dependency issue with synch.h, we have to define
- * xnsynch_release() here.
- */
-static inline struct xnthread *
-xnsynch_release(struct xnsynch *synch, struct xnthread *thread)
-{
-   atomic_long_t *lockp;
-   xnhandle_t threadh;
-
-   XENO_BUGON(NUCLEUS, (synch->status & XNSYNCH_OWNER) == 0);
-
-   trace_mark(xn_nucleus, synch_release, "synch %p", synch);
-
-   if (unlikely(xnthread_test_state(thread, XNWEAK)))
-   __xnsynch_fixup_rescnt(thread);
-
-   lockp = xnsynch_fastlock(synch);
-   threadh = xnthread_handle(thread);
-   if (likely(xnsynch_fast_release(lockp, threadh)))
-   return NULL;
-
-   return __xnsynch_transfer_ownership(synch, thread);
-}
-
 static inline int normalize_priority(int prio)
 {
return prio < MAX_RT_PRIO ? prio : MAX_RT_PRIO - 1;
diff --git a/include/cobalt/kernel/trace.h b/include/cobalt/kernel/trace.h
index 87c01d3..d143e3a 100644
--- a/include/cobalt/kernel/trace.h
+++ b/include/cobalt/kernel/trace.h
@@ -23,12 +23,9 @@
 #include 
 #include 
 
-#ifdef CONFIG_LTT
-#include 
-#else
+/* TEMP */
 #undef trace_mark
 #define trace_mark(channel, ev, fmt, args...)  do { } while (0)
-#endif
 
 static inline int xntrace_max_begin(unsigned long v)
 {
diff --git a/kernel/cobalt/clock.c b/kernel/cobalt/clock.c
index 479b7b2..71fae16 100644
--- a/kernel/cobalt/clock.c
+++ b/kernel/cobalt/clock.c
@@ -30,6 +30,7 @@
 #include 
 #include 
 #include 
+#include 
 
 unsigned long nktimerlat;
 
@@ -307,9 +308,6 @@ void xnclock_adjust(struct xnclock *clock, xnsticks_t delta)
nkvdso->wallclock_offset = nkclock.wallclock_offset;
now = xnclock_read_monotonic(clock) + nkclock.wallclock_offset;
adjust_clock_timers(clock, delta);
-
-   trace_mark(xn_nucleus, clock_adjust, "clock %s, delta %Lu",
-  clock->name, delta);
 }
 EXPORT_SYMBOL_GPL(xnclock_adjust);
 
@@ -482,8 +480,6 @@ int xnclock_register(struct xnclock *clock)
 
secondary_mode_only();
 
-   trace_mark(xn_nucleus, clock_register, "clock %s", clock->name);
-
/* Allocate the percpu timer queue slot. */
clock->timerdata = alloc_percpu(struct xntimerdata);
if (clock->timerdata == NULL)
@@ -525,8 +521,6 @@ void xnclock_deregister(struct xnclock *clock)
 
secondary_mode_only();
 
-   trace_mark(xn_nucleus, clock_deregister, "clock %s", clock->name);
-
cleanup_clock_proc(clock);
 
for_each_online_cpu(cpu) {
@@ -588,7 +582,7 @@ void xnclock_tick(struct xnclock *clock)
if (delta > (xnsticks_t)clock->gravity)
break;
 
-   trace_mark(xn_nucleus, timer_expire, "timer %p", timer);
+   trace_cobalt_timer_expire(timer);
 
xntimer_dequeue(timer, timerq);

[Xenomai-git] Philippe Gerum : cobalt/kernel: bump ABI revision level

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: edf55494f55e1daa04d2b425c5a8314ce2df3cd3
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=edf55494f55e1daa04d2b425c5a8314ce2df3cd3

Author: Philippe Gerum 
Date:   Thu Apr 24 16:10:43 2014 +0200

cobalt/kernel: bump ABI revision level

---

 kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h  |2 +-
 kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h |2 +-
 kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h|2 +-
 kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h  |2 +-
 kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h   |2 +-
 kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h  |2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h
index 28bfecc..2570664 100644
--- a/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h
@@ -29,7 +29,7 @@
 #define __XN_TSC_TYPE_FREERUNNING_COUNTDOWN 5
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP (__xn_feat_generic_mask)
 
diff --git a/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h
index fa1b46f..9eedd29 100644
--- a/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_BLACKFIN_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h
index 09017f9..b168993 100644
--- a/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_NIOS2_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   4UL
+#define XENOMAI_ABI_REV   5UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h
index 8d404a2..46e51c2 100644
--- a/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_POWERPC_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h
index 2559ac1..4be9417 100644
--- a/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_SH_ASM_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   2UL
+#define XENOMAI_ABI_REV   3UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h
index 68f88c0..3884c5a 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_X86_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/timer: update context tags in documentation

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 1d6310773a58f7a50e2569a15f6c58f77193b76c
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=1d6310773a58f7a50e2569a15f6c58f77193b76c

Author: Philippe Gerum 
Date:   Tue Apr 15 16:28:47 2014 +0200

cobalt/timer: update context tags in documentation

---

 kernel/cobalt/timer.c |   94 ++---
 1 file changed, 27 insertions(+), 67 deletions(-)

diff --git a/kernel/cobalt/timer.c b/kernel/cobalt/timer.c
index acc3989..f51d13f 100644
--- a/kernel/cobalt/timer.c
+++ b/kernel/cobalt/timer.c
@@ -158,10 +158,10 @@ int xntimer_start(struct xntimer *timer,
 }
 EXPORT_SYMBOL_GPL(xntimer_start);
 
-/*!
- * \fn int xntimer_stop(struct xntimer *timer)
+/**
+ * @fn int xntimer_stop(struct xntimer *timer)
  *
- * \brief Disarm a timer.
+ * @brief Disarm a timer.
  *
  * This service deactivates a timer previously armed using
  * xntimer_start(). Once disarmed, the timer can be subsequently
@@ -169,15 +169,7 @@ EXPORT_SYMBOL_GPL(xntimer_start);
  *
  * @param timer The address of a valid timer descriptor.
  *
- * Environments:
- *
- * This service can be called from:
- *
- * - Any kernel context.
- *
- * Rescheduling: never.
- *
- * @note Must be called with nklock held, IRQs off.
+ * @remark Tags: atomic-entry, isr-allowed.
  */
 void __xntimer_stop(struct xntimer *timer)
 {
@@ -202,10 +194,10 @@ void __xntimer_stop(struct xntimer *timer)
 }
 EXPORT_SYMBOL_GPL(__xntimer_stop);
 
-/*!
- * \fn xnticks_t xntimer_get_date(struct xntimer *timer)
+/**
+ * @fn xnticks_t xntimer_get_date(struct xntimer *timer)
  *
- * \brief Return the absolute expiration date.
+ * @brief Return the absolute expiration date.
  *
  * Return the next expiration date of a timer as an absolute count of
  * nanoseconds.
@@ -215,13 +207,7 @@ EXPORT_SYMBOL_GPL(__xntimer_stop);
  * @return The expiration date in nanoseconds. The special value
  * XN_INFINITE is returned if @a timer is currently disabled.
  *
- * Environments:
- *
- * This service can be called from:
- *
- * - Any kernel context.
- *
- * Rescheduling: never.
+ * @remark Tags: isr-allowed.
  */
 xnticks_t xntimer_get_date(struct xntimer *timer)
 {
@@ -233,10 +219,10 @@ xnticks_t xntimer_get_date(struct xntimer *timer)
 }
 EXPORT_SYMBOL_GPL(xntimer_get_date);
 
-/*!
- * \fn xnticks_t xntimer_get_timeout(struct xntimer *timer)
+/**
+ * @fn xnticks_t xntimer_get_timeout(struct xntimer *timer)
  *
- * \brief Return the relative expiration date.
+ * @brief Return the relative expiration date.
  *
  * This call returns the count of nanoseconds remaining until the
  * timer expires.
@@ -249,13 +235,7 @@ EXPORT_SYMBOL_GPL(xntimer_get_date);
  * the associated handler has not been fired yet); in such a case, 1
  * is returned.
  *
- * Environments:
- *
- * This service can be called from:
- *
- * - Any kernel context.
- *
- * Rescheduling: never.
+ * @remark Tags: irqs-off, isr-allowed.
  */
 xnticks_t xntimer_get_timeout(struct xntimer *timer)
 {
@@ -276,10 +256,10 @@ xnticks_t xntimer_get_timeout(struct xntimer *timer)
 }
 EXPORT_SYMBOL_GPL(xntimer_get_timeout);
 
-/*!
- * \fn xnticks_t xntimer_get_interval(struct xntimer *timer)
+/**
+ * @fn xnticks_t xntimer_get_interval(struct xntimer *timer)
  *
- * \brief Return the timer interval value.
+ * @brief Return the timer interval value.
  *
  * Return the timer interval value in nanoseconds.
  *
@@ -289,13 +269,7 @@ EXPORT_SYMBOL_GPL(xntimer_get_timeout);
  * XN_INFINITE is returned if @a timer is currently disabled or
  * one shot.
  *
- * Environments:
- *
- * This service can be called from:
- *
- * - Any kernel context.
- *
- * Rescheduling: never.
+ * @remark Tags: isr-allowed.
  */
 xnticks_t xntimer_get_interval(struct xntimer *timer)
 {
@@ -305,9 +279,9 @@ xnticks_t xntimer_get_interval(struct xntimer *timer)
 }
 EXPORT_SYMBOL_GPL(xntimer_get_interval);
 
-/*!
- * \fn void xntimer_init(struct xntimer *timer,struct xnclock *clock,void 
(*handler)(struct xntimer *timer), struct xnthread *thread)
- * \brief Initialize a timer object.
+/**
+ * @fn void xntimer_init(struct xntimer *timer,struct xnclock *clock,void 
(*handler)(struct xntimer *timer), struct xnthread *thread)
+ * @brief Initialize a timer object.
  *
  * Creates a timer. When created, a timer is left disarmed; it must be
  * started using xntimer_start() in order to be activated.
@@ -332,13 +306,7 @@ EXPORT_SYMBOL_GPL(xntimer_get_interval);
  * There is no limitation on the number of timers which can be
  * created/active concurrently.
  *
- * Environments:
- *
- * This service can be called from:
- *
- * - Any kernel context.
- *
- * Rescheduling: never.
+ * @remark Tags: none.
  */
 #ifdef DOXYGEN_CPP
 void xntimer_init(struct xntimer *timer, struct xnclock *clock,
@@ -419,10 +387,10 @@ EXPORT_SYMBOL_GPL(xntimer_switch_tracking);
 
 #endif /* CONFIG_XENO_OPT_EXTCLOCK && CONFIG_XENO_OPT_STATS */
 
-/*!
- * \fn void xntimer_destroy(struct xntimer *timer)
+/**
+ * @fn v

[Xenomai-git] Philippe Gerum : cobalt/bufd: drop obsolete sanity checks

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: da2ed45520a773b6f9e5f7ccf64fb4526caed673
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=da2ed45520a773b6f9e5f7ccf64fb4526caed673

Author: Philippe Gerum 
Date:   Thu Apr 24 14:51:24 2014 +0200

cobalt/bufd: drop obsolete sanity checks

With kernel-based Xenomai threads now underlaid by regular kernel task
contexts, those checks have become useless/redundant.

---

 kernel/cobalt/bufd.c |8 ++--
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/kernel/cobalt/bufd.c b/kernel/cobalt/bufd.c
index d05b238..cea140f 100644
--- a/kernel/cobalt/bufd.c
+++ b/kernel/cobalt/bufd.c
@@ -235,8 +235,6 @@ EXPORT_SYMBOL_GPL(xnbufd_map_kmem);
 
 void xnbufd_map_umem(struct xnbufd *bufd, void __user *ptr, size_t len)
 {
-   XENO_BUGON(NUCLEUS, !xnthread_test_state(xnsched_current_thread(),
-XNROOT|XNUSER));
bufd->b_ptr = ptr;
bufd->b_len = len;
bufd->b_mm = current->mm;
@@ -330,8 +328,7 @@ ssize_t xnbufd_copy_to_kmem(void *to, struct xnbufd *bufd, 
size_t len)
 * here, since the source buffer would live in kernel space in
 * such a case.
 */
-   if (xnthread_test_state(xnsched_current_thread(), XNROOT|XNUSER) &&
-   !xnsched_interrupt_p() && current->mm == bufd->b_mm) {
+   if (!xnsched_interrupt_p() && current->mm == bufd->b_mm) {
preemptible_only();
if (__xn_safe_copy_from_user(to, (void __user *)from, len))
return -EFAULT;
@@ -436,8 +433,7 @@ ssize_t xnbufd_copy_from_kmem(struct xnbufd *bufd, void 
*from, size_t len)
 * here: feeding a RT activity with data from a non-RT context
 * is wrong in the first place, so never mind.
 */
-   if (xnthread_test_state(xnsched_current_thread(), XNROOT|XNUSER) &&
-   !xnsched_interrupt_p() && current->mm == bufd->b_mm) {
+   if (!xnsched_interrupt_p() && current->mm == bufd->b_mm) {
preemptible_only();
if (__xn_safe_copy_to_user((void __user *)to, from, len))
return -EFAULT;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/rtdm: convert legacy trace markers to kernel tracepoints

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 6f56d574a9120df36e686c97c681c1edf41da187
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6f56d574a9120df36e686c97c681c1edf41da187

Author: Philippe Gerum 
Date:   Fri Apr 18 11:57:02 2014 +0200

cobalt/rtdm: convert legacy trace markers to kernel tracepoints

---

 include/cobalt/kernel/rtdm/driver.h |   17 +-
 include/cobalt/kernel/trace.h   |4 -
 kernel/cobalt/rtdm/core.c   |   73 +++---
 kernel/cobalt/rtdm/device.c |   25 +-
 kernel/cobalt/rtdm/drvlib.c |   27 +--
 kernel/cobalt/trace/cobalt-rtdm.h   |  453 +++
 6 files changed, 503 insertions(+), 96 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index 50d6e02..9c432c4 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -44,6 +44,7 @@
 
 /* debug support */
 #include 
+#include 
 #ifdef CONFIG_PCI
 #include 
 #endif /* CONFIG_PCI */
@@ -1165,7 +1166,7 @@ void rtdm_toseq_init(rtdm_toseq_t *timeout_seq, 
nanosecs_rel_t timeout);
 
 /* --- event services --- */
 
-typedef struct {
+typedef struct rtdm_event {
struct xnsynch synch_base;
DECLARE_XNSELECT(select_block);
 } rtdm_event_t;
@@ -1187,13 +1188,13 @@ void __rtdm_synch_flush(struct xnsynch *synch, unsigned 
long reason);
 
 static inline void rtdm_event_pulse(rtdm_event_t *event)
 {
-   trace_mark(xn_rtdm, event_pulse, "event %p", event);
+   trace_cobalt_driver_event_pulse(event);
__rtdm_synch_flush(&event->synch_base, 0);
 }
 
 static inline void rtdm_event_destroy(rtdm_event_t *event)
 {
-   trace_mark(xn_rtdm, event_destroy, "event %p", event);
+   trace_cobalt_driver_event_destroy(event);
__rtdm_synch_flush(&event->synch_base, XNRMID);
xnselect_destroy(&event->select_block);
 }
@@ -1201,7 +1202,7 @@ static inline void rtdm_event_destroy(rtdm_event_t *event)
 
 /* --- semaphore services --- */
 
-typedef struct {
+typedef struct rtdm_sem {
unsigned long value;
struct xnsynch synch_base;
DECLARE_XNSELECT(select_block);
@@ -1218,7 +1219,7 @@ void rtdm_sem_up(rtdm_sem_t *sem);
 #ifndef DOXYGEN_CPP /* Avoid static inline tags for RTDM in doxygen */
 static inline void rtdm_sem_destroy(rtdm_sem_t *sem)
 {
-   trace_mark(xn_rtdm, sem_destroy, "sem %p", sem);
+   trace_cobalt_driver_sem_destroy(sem);
__rtdm_synch_flush(&sem->synch_base, XNRMID);
xnselect_destroy(&sem->select_block);
 }
@@ -1226,7 +1227,7 @@ static inline void rtdm_sem_destroy(rtdm_sem_t *sem)
 
 /* --- mutex services --- */
 
-typedef struct {
+typedef struct rtdm_mutex {
struct xnsynch synch_base;
 } rtdm_mutex_t;
 
@@ -1241,7 +1242,7 @@ static inline void rtdm_mutex_unlock(rtdm_mutex_t *mutex)
if (!XENO_ASSERT(RTDM, !xnsched_interrupt_p()))
return;
 
-   trace_mark(xn_rtdm, mutex_unlock, "mutex %p", mutex);
+   trace_cobalt_driver_mutex_release(mutex);
 
if (unlikely(xnsynch_release(&mutex->synch_base,
 xnsched_current_thread()) != NULL))
@@ -1250,7 +1251,7 @@ static inline void rtdm_mutex_unlock(rtdm_mutex_t *mutex)
 
 static inline void rtdm_mutex_destroy(rtdm_mutex_t *mutex)
 {
-   trace_mark(xn_rtdm, mutex_destroy, "mutex %p", mutex);
+   trace_cobalt_driver_mutex_destroy(mutex);
 
__rtdm_synch_flush(&mutex->synch_base, XNRMID);
 }
diff --git a/include/cobalt/kernel/trace.h b/include/cobalt/kernel/trace.h
index d143e3a..5f2b6ca 100644
--- a/include/cobalt/kernel/trace.h
+++ b/include/cobalt/kernel/trace.h
@@ -23,10 +23,6 @@
 #include 
 #include 
 
-/* TEMP */
-#undef trace_mark
-#define trace_mark(channel, ev, fmt, args...)  do { } while (0)
-
 static inline int xntrace_max_begin(unsigned long v)
 {
ipipe_trace_begin(v);
diff --git a/kernel/cobalt/rtdm/core.c b/kernel/cobalt/rtdm/core.c
index 71f6d08..5c3af51 100644
--- a/kernel/cobalt/rtdm/core.c
+++ b/kernel/cobalt/rtdm/core.c
@@ -26,13 +26,14 @@
  * @{
  */
 
+#include 
 #include 
 #include 
 #include 
 #include "rtdm/syscall.h"
 #include "rtdm/internal.h"
-
-#include 
+#define CREATE_TRACE_POINTS
+#include 
 
 #define CLOSURE_RETRY_PERIOD_MS100
 
@@ -229,7 +230,7 @@ static void close_callback(struct work_struct *work)
if (err == -EAGAIN)
reschedule = 1;
} else {
-   trace_mark(xn_rtdm, fd_closed, "fd %d", context->fd);
+   trace_cobalt_fd_closed(context);
 
cleanup_instance(context->device, context,
 test_bit(RTDM_CREATED_IN_NRT,
@@ -263,8 +264,6 @@ int __rt_dev_open(rtdm_user_info_t *user_info, const char 
*path, int oflag)
int nrt_mode = !rtdm_in_rt_context();
 
device = get_named_device(path);
-   trace_mark(xn_rtdm, open, "user_info %

[Xenomai-git] Philippe Gerum : analogy/device: sanitize device release handler

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: fc41e93affa0382a7f820fcde897baeec78677dd
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fc41e93affa0382a7f820fcde897baeec78677dd

Author: Philippe Gerum 
Date:   Fri Apr 11 15:16:02 2014 +0200

analogy/device: sanitize device release handler

This change fixes a crash when a zero-sized private area is specified
for the driver:
http://www.xenomai.org/pipermail/xenomai/2014-April/030628.html

More fixups are included to sanitize this handler a bit further.

---

 kernel/drivers/analogy/device.c |   27 ---
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/kernel/drivers/analogy/device.c b/kernel/drivers/analogy/device.c
index b93ae72..60b2977 100644
--- a/kernel/drivers/analogy/device.c
+++ b/kernel/drivers/analogy/device.c
@@ -278,17 +278,15 @@ int a4l_assign_driver(a4l_cxt_t * cxt,
a4l_dev_t *dev = a4l_get_dev(cxt);
 
dev->driver = drv;
+   INIT_LIST_HEAD(&dev->subdvsq);
 
if (drv->privdata_size == 0)
__a4l_dbg(1, core_dbg,
  "a4l_assign_driver: warning! "
  "the field priv will not be usable\n");
else {
-
-   INIT_LIST_HEAD(&dev->subdvsq);
-
dev->priv = rtdm_malloc(drv->privdata_size);
-   if (dev->priv == NULL && drv->privdata_size != 0) {
+   if (dev->priv == NULL) {
__a4l_err("a4l_assign_driver: "
  "call(alloc) failed\n");
ret = -ENOMEM;
@@ -325,27 +323,26 @@ out_assign_driver:
 
 int a4l_release_driver(a4l_cxt_t * cxt)
 {
-   int ret = 0;
a4l_dev_t *dev = a4l_get_dev(cxt);
+   a4l_subd_t *subd, *tmp;
+   int ret = 0;
 
if ((ret = dev->driver->detach(dev)) != 0)
goto out_release_driver;
 
-   /* Decrease module's count
-  so as to allow module unloading */
module_put(dev->driver->owner);
 
/* In case, the driver developer did not free the subdevices */
-   while (&dev->subdvsq != dev->subdvsq.next) {
-   struct list_head *this = dev->subdvsq.next;
-   a4l_subd_t *tmp = list_entry(this, a4l_subd_t, list);
-
-   list_del(this);
-   rtdm_free(tmp);
-   }
+   if (!list_empty(&dev->subdvsq))
+   list_for_each_entry_safe(subd, tmp, &dev->subdvsq, list) {
+   list_del(&subd->list);
+   rtdm_free(subd);
+   }
 
/* Free the private field */
-   rtdm_free(dev->priv);
+   if (dev->priv)
+   rtdm_free(dev->priv);
+
dev->driver = NULL;
 
 out_release_driver:


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/task: protect cancel-unsafe section

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: fa422c2e695aee85a68c06178ecc5ad7aac96b63
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fa422c2e695aee85a68c06178ecc5ad7aac96b63

Author: Philippe Gerum 
Date:   Wed Apr 23 12:39:59 2014 +0200

alchemy/task: protect cancel-unsafe section

---

 lib/alchemy/task.c |3 +++
 1 file changed, 3 insertions(+)

diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c
index 254aa5f..ebc8987 100644
--- a/lib/alchemy/task.c
+++ b/lib/alchemy/task.c
@@ -906,6 +906,7 @@ int rt_task_wait_period(unsigned long *overruns_r)
 int rt_task_sleep_until(RTIME date)
 {
struct timespec ts;
+   struct service svc;
ticks_t now;
 
if (!threadobj_current_p())
@@ -917,7 +918,9 @@ int rt_task_sleep_until(RTIME date)
clockobj_get_time(&alchemy_clock, &now, NULL);
if (date <= now)
return -ETIMEDOUT;
+   CANCEL_DEFER(svc);
clockobj_ticks_to_timespec(&alchemy_clock, date, &ts);
+   CANCEL_RESTORE(svc);
}
 
return threadobj_sleep(&ts);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/kernel: retrieve current TCB using xnshadow_current() when unambiguous

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 3b09ec2b4dec367a02b68f03f80eb2b606b06802
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=3b09ec2b4dec367a02b68f03f80eb2b606b06802

Author: Philippe Gerum 
Date:   Thu Apr 24 14:39:27 2014 +0200

cobalt/kernel: retrieve current TCB using xnshadow_current() when unambiguous

Unlike xnsched_current_thread(), xnshadow_current() does not involve
accessing protected per-cpu data on SMP. So prefer it when the context
is obviously primary, which guarantees that xnsched_current_thread()
== xnshadow_current().

---

 kernel/cobalt/posix/clock.c   |2 +-
 kernel/cobalt/posix/monitor.c |   29 +
 kernel/cobalt/posix/mutex.c   |   24 +---
 kernel/cobalt/posix/select.c  |   12 +---
 kernel/cobalt/posix/signal.c  |2 +-
 kernel/cobalt/posix/thread.c  |4 ++--
 kernel/cobalt/registry.c  |3 +--
 kernel/cobalt/rtdm/drvlib.c   |   20 +++-
 kernel/cobalt/select.c|   15 ++-
 kernel/cobalt/shadow.c|   26 +-
 kernel/cobalt/synch.c |   18 ++
 kernel/cobalt/thread.c|8 
 12 files changed, 92 insertions(+), 71 deletions(-)

diff --git a/kernel/cobalt/posix/clock.c b/kernel/cobalt/posix/clock.c
index f98592c..68383a7 100644
--- a/kernel/cobalt/posix/clock.c
+++ b/kernel/cobalt/posix/clock.c
@@ -270,7 +270,7 @@ int cobalt_clock_nanosleep(clockid_t clock_id, int flags,
if (flags & ~TIMER_ABSTIME)
return -EINVAL;
 
-   cur = xnsched_current_thread();
+   cur = xnshadow_current();
 
xnlock_get_irqsave(&nklock, s);
 
diff --git a/kernel/cobalt/posix/monitor.c b/kernel/cobalt/posix/monitor.c
index c6b982e..5507829 100644
--- a/kernel/cobalt/posix/monitor.c
+++ b/kernel/cobalt/posix/monitor.c
@@ -114,9 +114,8 @@ int cobalt_monitor_init(struct cobalt_monitor_shadow __user 
*u_mon,
 }
 
 /* nklock held, irqs off */
-static int cobalt_monitor_enter_inner(xnhandle_t handle)
+static int cobalt_monitor_enter_inner(xnhandle_t handle, struct xnthread *curr)
 {
-   struct xnthread *cur = xnsched_current_thread();
struct cobalt_monitor *mon;
int ret = 0, info;
 
@@ -131,11 +130,11 @@ static int cobalt_monitor_enter_inner(xnhandle_t handle)
 *
 * NOTE: monitors do not support recursive entries.
 */
-   ret = xnsynch_fast_acquire(mon->gate.fastlock, xnthread_handle(cur));
+   ret = xnsynch_fast_acquire(mon->gate.fastlock, xnthread_handle(curr));
switch(ret) {
case 0:
-   if (xnthread_test_state(cur, XNWEAK))
-   xnthread_inc_rescnt(cur);
+   if (xnthread_test_state(curr, XNWEAK))
+   xnthread_inc_rescnt(curr);
break;
default:
/* Nah, we really have to wait. */
@@ -154,6 +153,7 @@ static int cobalt_monitor_enter_inner(xnhandle_t handle)
 
 int cobalt_monitor_enter(struct cobalt_monitor_shadow __user *u_mon)
 {
+   struct xnthread *curr = xnshadow_current();
xnhandle_t handle;
int ret;
spl_t s;
@@ -161,7 +161,7 @@ int cobalt_monitor_enter(struct cobalt_monitor_shadow 
__user *u_mon)
handle = cobalt_get_handle_from_user(&u_mon->handle);
 
xnlock_get_irqsave(&nklock, s);
-   ret = cobalt_monitor_enter_inner(handle);
+   ret = cobalt_monitor_enter_inner(handle, curr);
xnlock_put_irqrestore(&nklock, s);
 
return ret;
@@ -301,7 +301,7 @@ int cobalt_monitor_wait(struct cobalt_monitor_shadow __user 
*u_mon,
opret = -ETIMEDOUT;
}
 
-   ret = cobalt_monitor_enter_inner(handle);
+   ret = cobalt_monitor_enter_inner(handle, &curr->threadbase);
 out:
xnlock_put_irqrestore(&nklock, s);
 
@@ -313,11 +313,13 @@ out:
 int cobalt_monitor_sync(struct cobalt_monitor_shadow __user *u_mon)
 {
struct cobalt_monitor *mon;
+   struct xnthread *curr;
xnhandle_t handle;
int ret = 0;
spl_t s;
 
handle = cobalt_get_handle_from_user(&u_mon->handle);
+   curr = xnshadow_current();
 
xnlock_get_irqsave(&nklock, s);
 
@@ -326,9 +328,9 @@ int cobalt_monitor_sync(struct cobalt_monitor_shadow __user 
*u_mon)
ret = -EINVAL;
else if (mon->data->flags & COBALT_MONITOR_SIGNALED) {
cobalt_monitor_wakeup(mon);
-   xnsynch_release(&mon->gate, xnsched_current_thread());
+   xnsynch_release(&mon->gate, curr);
xnsched_run();
-   ret = cobalt_monitor_enter_inner(handle);
+   ret = cobalt_monitor_enter_inner(handle, curr);
}
 
xnlock_put_irqrestore(&nklock, s);
@@ -339,11 +341,13 @@ int cobalt_monitor_sync(struct cobalt_monitor_shadow 
__user *u_mon)
 int cobalt_monitor_exit(struct cobalt_monitor_shadow __user *u_mon)
 {
struct cobalt_monitor *m

[Xenomai-git] Philippe Gerum : copperplate/registry: fix delay for connection attempts to sysregd

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 9f5c5be61f509ad673a1b5b258ac3b3b9f298e43
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=9f5c5be61f509ad673a1b5b258ac3b3b9f298e43

Author: Philippe Gerum 
Date:   Fri Apr 11 10:54:14 2014 +0200

copperplate/registry: fix delay for connection attempts to sysregd

---

 lib/copperplate/registry.c |6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/lib/copperplate/registry.c b/lib/copperplate/registry.c
index 270ed97..ef6aa45 100644
--- a/lib/copperplate/registry.c
+++ b/lib/copperplate/registry.c
@@ -628,11 +628,15 @@ static int spawn_daemon(const char *sessdir)
ret = -errno;
break;
default:
+   /*
+* Make sure we sleep at least one second regardless
+* of signal receipts.
+*/
+   while (__STD(sleep(1)) > 0) ;
regd_pid = pid;
barrier();
sa.sa_handler = sigchld_handler;
sigaction(SIGCHLD, &sa, NULL);
-   usleep(100);
ret = 0;
break;
}


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/testsuite: check block+suspend conjunctive wait

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 83cf9f5eea2065c670398c1905570ee4b23b25da
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=83cf9f5eea2065c670398c1905570ee4b23b25da

Author: Philippe Gerum 
Date:   Thu Apr 24 10:38:21 2014 +0200

alchemy/testsuite: check block+suspend conjunctive wait

---

 lib/alchemy/testsuite/Makefile  |1 +
 lib/alchemy/testsuite/task-10.c |   72 +++
 2 files changed, 73 insertions(+)

diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile
index 04a299d..5726cad 100644
--- a/lib/alchemy/testsuite/Makefile
+++ b/lib/alchemy/testsuite/Makefile
@@ -21,6 +21,7 @@ TESTS :=  \
task-7  \
task-8  \
task-9  \
+   task-10 \
mq-1\
mq-2\
mq-3\
diff --git a/lib/alchemy/testsuite/task-10.c b/lib/alchemy/testsuite/task-10.c
new file mode 100644
index 000..3b16ff3
--- /dev/null
+++ b/lib/alchemy/testsuite/task-10.c
@@ -0,0 +1,72 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+
+static struct traceobj trobj;
+
+static int tseq[] = {
+   1, 6, 2, 3, 4, 7, 5
+};
+
+static RT_TASK t_test;
+
+static RT_SEM sem;
+
+static void test_task(void *arg)
+{
+   int ret;
+
+   traceobj_enter(&trobj);
+
+   traceobj_mark(&trobj, 6);
+
+   ret = rt_sem_p(&sem, TM_INFINITE);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 7);
+
+   traceobj_exit(&trobj);
+}
+
+int main(int argc, char *const argv[])
+{
+   int ret;
+
+   traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int));
+
+   ret = rt_sem_create(&sem, "SEMA", 0, S_FIFO);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_create(&t_test, "test_task", 0, 10, 0);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 1);
+
+   ret = rt_task_start(&t_test, test_task, NULL);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 2);
+
+   ret = rt_task_suspend(&t_test);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 3);
+
+   ret = rt_sem_v(&sem);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 4);
+
+   ret = rt_task_resume(&t_test);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 5);
+
+   traceobj_join(&trobj);
+
+   traceobj_verify(&trobj, tseq, sizeof(tseq) / sizeof(int));
+
+   exit(0);
+}


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/clockobj: drop useless locking in clockobj_ticks_to_timespec()

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 6689f1e0fdd1d0c8b6beab4ba19ca4f27f746066
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6689f1e0fdd1d0c8b6beab4ba19ca4f27f746066

Author: Philippe Gerum 
Date:   Thu Apr 24 16:54:27 2014 +0200

copperplate/clockobj: drop useless locking in clockobj_ticks_to_timespec()

---

 include/copperplate/clockobj.h |2 --
 1 file changed, 2 deletions(-)

diff --git a/include/copperplate/clockobj.h b/include/copperplate/clockobj.h
index bbc2cf2..28709ae 100644
--- a/include/copperplate/clockobj.h
+++ b/include/copperplate/clockobj.h
@@ -206,9 +206,7 @@ static inline
 void clockobj_ticks_to_timespec(struct clockobj *clkobj,
ticks_t ticks, struct timespec *ts)
 {
-   read_lock_nocancel(&clkobj->lock);
__clockobj_ticks_to_timespec(clkobj, ticks, ts);
-   read_unlock(&clkobj->lock);
 }
 
 static inline


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/shadow: check for signal receipt unambiguously

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 29ca1d5c79c39c6776d459c64a16b2159b8ac63b
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=29ca1d5c79c39c6776d459c64a16b2159b8ac63b

Author: Philippe Gerum 
Date:   Wed Apr 23 15:08:57 2014 +0200

cobalt/shadow: check for signal receipt unambiguously

---

 kernel/cobalt/shadow.c |   61 ++--
 1 file changed, 33 insertions(+), 28 deletions(-)

diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c
index 4115362..1603aad 100644
--- a/kernel/cobalt/shadow.c
+++ b/kernel/cobalt/shadow.c
@@ -211,28 +211,6 @@ static inline void process_remove(struct xnshadow_process 
*p)
xnshadow_set_process(NULL);
 }
 
-static void request_syscall_restart(struct xnthread *thread,
-   struct pt_regs *regs,
-   int sysflags)
-{
-   int notify = 0;
-
-   if (xnthread_test_info(thread, XNKICKED)) {
-   if (__xn_interrupted_p(regs)) {
-   __xn_error_return(regs,
- (sysflags & __xn_exec_norestart) ?
- -EINTR : -ERESTARTSYS);
-   notify = !xnthread_test_state(thread, XNDEBUG);
-   xnthread_clear_info(thread, XNBREAK);
-   }
-   xnthread_clear_info(thread, XNKICKED);
-   }
-
-   xnthread_test_cancel();
-
-   xnshadow_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
-}
-
 static inline void lock_timers(void)
 {
smp_mb__before_atomic_inc();
@@ -1851,6 +1829,29 @@ void xnshadow_pop_personality(struct xnpersonality *prev)
 }
 EXPORT_SYMBOL_GPL(xnshadow_pop_personality);
 
+static void prepare_for_signal(struct task_struct *p,
+  struct xnthread *thread,
+  struct pt_regs *regs,
+  int sysflags)
+{
+   int notify = 0;
+
+   if (xnthread_test_info(thread, XNKICKED)) {
+   if (signal_pending(p)) {
+   __xn_error_return(regs,
+ (sysflags & __xn_exec_norestart) ?
+ -EINTR : -ERESTARTSYS);
+   notify = !xnthread_test_state(thread, XNDEBUG);
+   xnthread_clear_info(thread, XNBREAK);
+   }
+   xnthread_clear_info(thread, XNKICKED);
+   }
+
+   xnthread_test_cancel();
+
+   xnshadow_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
+}
+
 static int handle_head_syscall(struct ipipe_domain *ipd, struct pt_regs *regs)
 {
int muxid, muxop, switched, ret, sigs;
@@ -1858,6 +1859,7 @@ static int handle_head_syscall(struct ipipe_domain *ipd, 
struct pt_regs *regs)
struct xnshadow_process *process;
struct xnthread *thread;
unsigned long sysflags;
+   struct task_struct *p;
struct xnsyscall *sc;
 
thread = xnshadow_current();
@@ -1991,10 +1993,11 @@ done:
__xn_status_return(regs, ret);
sigs = 0;
if (!xnsched_root_p()) {
-   if (signal_pending(current) ||
+   p = current;
+   if (signal_pending(p) ||
xnthread_test_info(thread, XNKICKED)) {
sigs = 1;
-   request_syscall_restart(thread, regs, sysflags);
+   prepare_for_signal(p, thread, regs, sysflags);
} else if (xnthread_test_state(thread, XNWEAK) &&
   xnthread_get_rescnt(thread) == 0) {
if (switched)
@@ -2053,13 +2056,14 @@ static int handle_root_syscall(struct ipipe_domain 
*ipd, struct pt_regs *regs)
 {
int muxid, muxop, sysflags, switched, ret, sigs;
struct xnthread *thread;
+   struct task_struct *p;
struct xnsyscall *sc;
 
/*
 * Catch cancellation requests pending for user shadows
 * running mostly in secondary mode, i.e. XNWEAK. In that
-* case, we won't run request_syscall_restart() that
-* frequently, so check for cancellation here.
+* case, we won't run prepare_for_signal() that frequently, so
+* check for cancellation here.
 */
xnthread_test_cancel();
 
@@ -2132,9 +2136,10 @@ restart:
 * just invoked, so make sure to fetch it.
 */
thread = xnshadow_current();
-   if (signal_pending(current)) {
+   p = current;
+   if (signal_pending(p)) {
sigs = 1;
-   request_syscall_restart(thread, regs, sysflags);
+   prepare_for_signal(p, thread, regs, sysflags);
} else if (xnthread_test_state(thread, XNWEAK) &&
   xnthread_get_rescnt(thread) == 0)
sysflags |= __xn_exec_switchback;


___

[Xenomai-git] Philippe Gerum : copperplate/threadobj: define implementation-specific rrb signal

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: ed167e88613deb825edf6a22ff3fc7dc0ccbbeef
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ed167e88613deb825edf6a22ff3fc7dc0ccbbeef

Author: Philippe Gerum 
Date:   Thu Apr 24 10:17:11 2014 +0200

copperplate/threadobj: define implementation-specific rrb signal

---

 include/mercury/boilerplate/signal.h |1 +
 lib/copperplate/threadobj.c  |4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/mercury/boilerplate/signal.h 
b/include/mercury/boilerplate/signal.h
index 996711f..ac7b1c7 100644
--- a/include/mercury/boilerplate/signal.h
+++ b/include/mercury/boilerplate/signal.h
@@ -27,6 +27,7 @@
 #define SIGNOTIFY  (SIGRTMIN + 8) /* Internal notification */
 #define SIGRELS(SIGRTMIN + 9) /* Syscall abort */
 #define SIGWAKEUP  (SIGRTMIN + 10) /* Sleep abort */
+#define SIGRRB (SIGRTMIN + 11) /* Round-robin event */
 
 #define SIGSAFE_LOCK_ENTRY(__safelock) \
do {\
diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index a17870c..f4eb8cc 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -445,7 +445,7 @@ static inline void pkg_init_corespec(void)
sigaction(SIGRELS, &sa, NULL);
sigaction(SIGWAKEUP, &sa, NULL);
sa.sa_handler = roundrobin_handler;
-   sigaction(SIGVTALRM, &sa, NULL);
+   sigaction(SIGRRB, &sa, NULL);
 
notifier_pkg_init();
 }
@@ -518,7 +518,7 @@ static inline int threadobj_setup_corespec(struct threadobj 
*thobj)
/*
 * Create the per-thread round-robin timer.
 */
-   sev.sigev_signo = SIGVTALRM;
+   sev.sigev_signo = SIGRRB;
ret = timer_create(CLOCK_THREAD_CPUTIME_ID, &sev,
   &thobj->core.rr_timer);
if (ret) {


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/testsuite: check for rt_task_unblock()

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: e885fec06cd66e317955283da79da1cb746abde9
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e885fec06cd66e317955283da79da1cb746abde9

Author: Philippe Gerum 
Date:   Wed Apr 23 13:01:34 2014 +0200

alchemy/testsuite: check for rt_task_unblock()

---

 lib/alchemy/testsuite/Makefile |1 +
 lib/alchemy/testsuite/task-9.c |   70 
 2 files changed, 71 insertions(+)

diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile
index 950a2aa..04a299d 100644
--- a/lib/alchemy/testsuite/Makefile
+++ b/lib/alchemy/testsuite/Makefile
@@ -20,6 +20,7 @@ TESTS :=  \
task-6  \
task-7  \
task-8  \
+   task-9  \
mq-1\
mq-2\
mq-3\
diff --git a/lib/alchemy/testsuite/task-9.c b/lib/alchemy/testsuite/task-9.c
new file mode 100644
index 000..168afbb
--- /dev/null
+++ b/lib/alchemy/testsuite/task-9.c
@@ -0,0 +1,70 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+
+static struct traceobj trobj;
+
+static RT_TASK t_test;
+
+#define ONE_SECOND  10ULL
+
+void sighandler(int sig)
+{
+   /* nop */
+}
+
+static void test_task(void *arg)
+{
+   int ret;
+
+   traceobj_enter(&trobj);
+
+   ret = rt_task_sleep_until(TM_INFINITE);
+   traceobj_assert(&trobj, ret == -EINTR);
+
+   traceobj_exit(&trobj);
+}
+
+int main(int argc, char *const argv[])
+{
+   struct sigaction sa;
+   RT_TASK_INFO info;
+   sigset_t set;
+   int ret;
+
+   memset(&sa, 0, sizeof(sa));
+   sa.sa_handler = sighandler;
+   sigaction(SIGUSR1, &sa, NULL);
+
+   traceobj_init(&trobj, argv[0], 0);
+
+   ret = rt_task_create(&t_test, "test_task", 0, 10, 0);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_inquire(&t_test, &info);
+   traceobj_assert(&trobj, ret == 0);
+
+   sigemptyset(&set);
+   sigaddset(&set, SIGUSR1);
+   pthread_sigmask(SIG_BLOCK, &set, NULL);
+
+   ret = rt_task_start(&t_test, test_task, NULL);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_sleep(ONE_SECOND);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = __STD(kill(info.pid, SIGUSR1));
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_sleep(ONE_SECOND);
+   traceobj_assert(&trobj, ret == 0);
+   ret = rt_task_unblock(&t_test);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_join(&trobj);
+
+   exit(0);
+}


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate: enable error checking for mutexes in debug mode

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: ecc2483637d83eceb992ec192a2795855e85daee
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ecc2483637d83eceb992ec192a2795855e85daee

Author: Philippe Gerum 
Date:   Wed Apr 16 16:55:50 2014 +0200

boilerplate: enable error checking for mutexes in debug mode

---

 include/boilerplate/lock.h |6 ++
 lib/boilerplate/hash.c |2 ++
 2 files changed, 8 insertions(+)

diff --git a/include/boilerplate/lock.h b/include/boilerplate/lock.h
index 4819b34..879f736 100644
--- a/include/boilerplate/lock.h
+++ b/include/boilerplate/lock.h
@@ -206,4 +206,10 @@ int __check_cancel_type(const char *locktype);
 #define read_unlock_safe(__lock, __state)  \
__do_unlock_safe(__lock, __state)
 
+#ifdef CONFIG_XENO_DEBUG
+#define mutex_type_attribute PTHREAD_MUTEX_ERRORCHECK
+#else
+#define mutex_type_attribute PTHREAD_MUTEX_NORMAL
+#endif
+
 #endif /* _BOILERPLATE_LOCK_H */
diff --git a/lib/boilerplate/hash.c b/lib/boilerplate/hash.c
index 32a3d65..04fdeee 100644
--- a/lib/boilerplate/hash.c
+++ b/lib/boilerplate/hash.c
@@ -101,6 +101,7 @@ void __hash_init(void *heap, struct hash_table *t,
 
t->compare = compare;
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, mutex_scope_attribute));
__RT(pthread_mutex_init(&t->lock, &mattr));
@@ -322,6 +323,7 @@ void pvhash_init(struct pvhash_table *t,
 
t->compare = compare;
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE));
__RT(pthread_mutex_init(&t->lock, &mattr));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy: introduce RT_ALARM_INFO.active flag

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 9612c54c1612218be1133de4bc14962a4c900026
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=9612c54c1612218be1133de4bc14962a4c900026

Author: Philippe Gerum 
Date:   Wed Apr 16 12:11:08 2014 +0200

alchemy: introduce RT_ALARM_INFO.active flag

This flag is returned by rt_alarm_inquire() into the RT_ALARM_INFO
structure, reflecting the current state of the queried object. If
non-zero, the alarm is enabled (i.e. started).

---

 config/apirev   |2 +-
 doc/asciidoc/MIGRATION.adoc |4 
 include/alchemy/alarm.h |4 
 lib/alchemy/alarm.c |2 ++
 4 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/config/apirev b/config/apirev
index 00750ed..b8626c4 100644
--- a/config/apirev
+++ b/config/apirev
@@ -1 +1 @@
-3
+4
diff --git a/doc/asciidoc/MIGRATION.adoc b/doc/asciidoc/MIGRATION.adoc
index 6b5b5e2..a013447 100644
--- a/doc/asciidoc/MIGRATION.adoc
+++ b/doc/asciidoc/MIGRATION.adoc
@@ -786,6 +786,10 @@ instead.
* field +expiration+ has been removed, since the corresponding
  information is too short-lived to be valuable to the caller.
 
+   * field +active+ has been added, to reflect the current state of
+ the alarm object. If non-zero, the alarm is enabled
+ (i.e. started).
+
 .Message pipes
 
 - Writing to a message pipe is allowed from all contexts, including
diff --git a/include/alchemy/alarm.h b/include/alchemy/alarm.h
index fd84150..46e7d19 100644
--- a/include/alchemy/alarm.h
+++ b/include/alchemy/alarm.h
@@ -44,6 +44,10 @@ struct RT_ALARM_INFO {
 * Name of alarm object.
 */
char name[XNOBJECT_NAME_LEN];
+   /**
+* Active flag.
+*/
+   int active;
 };
 
 typedef struct RT_ALARM_INFO RT_ALARM_INFO;
diff --git a/lib/alchemy/alarm.c b/lib/alchemy/alarm.c
index 84c34eb..16475d4 100644
--- a/lib/alchemy/alarm.c
+++ b/lib/alchemy/alarm.c
@@ -387,6 +387,8 @@ int rt_alarm_inquire(RT_ALARM *alarm, RT_ALARM_INFO *info)
 
strcpy(info->name, acb->name);
info->expiries = acb->expiries;
+   info->active = !(alchemy_poll_mode(&acb->itmspec.it_value) &&
+alchemy_poll_mode(&acb->itmspec.it_interval));
 
put_alchemy_alarm(acb);
 out:


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : rtipc: convert to using kvasformat() helper

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: ed10058599308df653e0dc3a8e3186f5b4c65fe2
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=ed10058599308df653e0dc3a8e3186f5b4c65fe2

Author: Philippe Gerum 
Date:   Thu Apr 17 11:56:57 2014 +0200

rtipc: convert to using kvasformat() helper

---

 kernel/drivers/ipc/bufp.c |   10 +-
 kernel/drivers/ipc/iddp.c |   10 +-
 kernel/drivers/ipc/xddp.c |   10 +-
 3 files changed, 3 insertions(+), 27 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 7204fdf..37884f8 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -79,16 +79,8 @@ static struct xnmap *portmap;
 static char *__bufp_link_target(void *obj)
 {
struct bufp_socket *sk = obj;
-   char *buf;
 
-   /* XXX: older kernels don't have kasprintf(). */
-   buf = kmalloc(32, GFP_KERNEL);
-   if (buf == NULL)
-   return buf;
-
-   ksformat(buf, 32, "%d", sk->name.sipc_port);
-
-   return buf;
+   return kasformat("%d", sk->name.sipc_port);
 }
 
 extern struct xnptree rtipc_ptree;
diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c
index 1f0e44e..0d4a9f7 100644
--- a/kernel/drivers/ipc/iddp.c
+++ b/kernel/drivers/ipc/iddp.c
@@ -84,16 +84,8 @@ static int poolwait;
 static char *__iddp_link_target(void *obj)
 {
struct iddp_socket *sk = obj;
-   char *buf;
 
-   /* XXX: older kernels don't have kasprintf(). */
-   buf = kmalloc(32, GFP_KERNEL);
-   if (buf == NULL)
-   return buf;
-
-   ksformat(buf, 32, "%d", sk->name.sipc_port);
-
-   return buf;
+   return kasformat("%d", sk->name.sipc_port);
 }
 
 extern struct xnptree rtipc_ptree;
diff --git a/kernel/drivers/ipc/xddp.c b/kernel/drivers/ipc/xddp.c
index 54f1e35..f516c9d 100644
--- a/kernel/drivers/ipc/xddp.c
+++ b/kernel/drivers/ipc/xddp.c
@@ -77,16 +77,8 @@ static int portmap[CONFIG_XENO_OPT_PIPE_NRDEV]; /* indexes 
RTDM fildes */
 static char *__xddp_link_target(void *obj)
 {
struct xddp_socket *sk = obj;
-   char *buf;
 
-   /* XXX: older kernels don't have kasprintf(). */
-   buf = kmalloc(32, GFP_KERNEL);
-   if (buf == NULL)
-   return buf;
-
-   ksformat(buf, 32, "/dev/rtp%d", sk->minor);
-
-   return buf;
+   return kasformat("%d", sk->minor);
 }
 
 extern struct xnptree rtipc_ptree;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Matthias Schneider : copperplate/notifier: drop pointless select() loop from sighandler

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 2ac9031e9ac788d3349315693a70d16d08e9be03
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=2ac9031e9ac788d3349315693a70d16d08e9be03

Author: Matthias Schneider 
Date:   Wed Apr 23 15:44:53 2014 +0200

copperplate/notifier: drop pointless select() loop from sighandler

---

 lib/copperplate/notifier.c |   24 +---
 1 file changed, 1 insertion(+), 23 deletions(-)

diff --git a/lib/copperplate/notifier.c b/lib/copperplate/notifier.c
index d069a66..7fa48f3 100644
--- a/lib/copperplate/notifier.c
+++ b/lib/copperplate/notifier.c
@@ -34,41 +34,21 @@ static pthread_mutex_t notifier_lock;
 
 static struct sigaction notifier_old_sa;
 
-static fd_set notifier_rset;
-
 static void notifier_sighandler(int sig, siginfo_t *siginfo, void *uc)
 {
-   static struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
int ret, matched = 0;
struct notifier *nf;
-   fd_set rfds;
pid_t tid;
char c;
 
tid = copperplate_get_tid();
 
-   if (siginfo->si_code == SI_SIGIO) {
-   FD_ZERO(&rfds);
-   FD_SET(siginfo->si_fd, &rfds);
-   } else {
-   /*
-* We will have to find out by ourselves which fd was
-* notified.
-*/
-   rfds = notifier_rset;
-   do
-   ret = __STD(select(FD_SETSIZE, &rfds, NULL, NULL, &tv));
-   while (ret == -1 && errno == EINTR);
-   if (ret <= 0)
-   goto hand_over;
-   }
-
if (pvlist_empty(¬ifier_list))
goto hand_over;
 
/* We may NOT alter the notifier list, but only scan it. */
pvlist_for_each_entry(nf, ¬ifier_list, link) {
-   if (!FD_ISSET(nf->psfd[0], &rfds))
+   if (nf->psfd[0] != siginfo->si_fd)
continue;
/*
 * Ignore misdirected notifications. We want those to
@@ -173,7 +153,6 @@ int notifier_init(struct notifier *nf,
push_cleanup_lock(¬ifier_lock);
lock_notifier_list(&oset);
pvlist_append(&nf->link, ¬ifier_list);
-   FD_SET(nf->psfd[0], ¬ifier_rset);
unlock_notifier_list(&oset);
pop_cleanup_lock(¬ifier_lock);
 
@@ -208,7 +187,6 @@ void notifier_destroy(struct notifier *nf)
push_cleanup_lock(¬ifier_lock);
lock_notifier_list(&oset);
pvlist_remove(&nf->link);
-   FD_CLR(nf->psfd[0], ¬ifier_rset);
unlock_notifier_list(&oset);
pop_cleanup_lock(¬ifier_lock);
__STD(close(nf->psfd[0]));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/posix/monitor: drop redundant queuing flag

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 7a5f4a8f57f3a5714ae565eb0db55dbf16df9c93
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=7a5f4a8f57f3a5714ae565eb0db55dbf16df9c93

Author: Philippe Gerum 
Date:   Tue Apr 22 16:19:22 2014 +0200

cobalt/posix/monitor: drop redundant queuing flag

---

 kernel/cobalt/posix/monitor.c |   10 +++---
 kernel/cobalt/posix/thread.c  |1 -
 kernel/cobalt/posix/thread.h  |1 -
 3 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/kernel/cobalt/posix/monitor.c b/kernel/cobalt/posix/monitor.c
index f1bc84d..c6b982e 100644
--- a/kernel/cobalt/posix/monitor.c
+++ b/kernel/cobalt/posix/monitor.c
@@ -206,8 +206,7 @@ static void cobalt_monitor_wakeup(struct cobalt_monitor 
*mon)
if (bcast ||
(p->u_window->grant_value && p->wchan == 
&thread->monitor_synch)) {
xnsynch_wakeup_this_sleeper(&thread->monitor_synch, p);
-   list_del(&thread->monitor_link);
-   thread->monitor_queued = 0;
+   list_del_init(&thread->monitor_link);
}
}
 drain:
@@ -277,7 +276,6 @@ int cobalt_monitor_wait(struct cobalt_monitor_shadow __user 
*u_mon,
else {
curr->threadbase.u_window->grant_value = 0;
list_add_tail(&curr->monitor_link, &mon->waiters);
-   curr->monitor_queued = 1;
}
datp->flags |= COBALT_MONITOR_PENDED;
 
@@ -291,10 +289,8 @@ int cobalt_monitor_wait(struct cobalt_monitor_shadow 
__user *u_mon,
}
 
if ((event & COBALT_MONITOR_WAITDRAIN) == 0 &&
-   curr->monitor_queued) {
-   list_del(&curr->monitor_link);
-   curr->monitor_queued = 0;
-   }
+   !list_empty(&curr->monitor_link))
+   list_del_init(&curr->monitor_link);
 
if (list_empty(&mon->waiters) && !xnsynch_pended_p(&mon->drain))
datp->flags &= ~COBALT_MONITOR_PENDED;
diff --git a/kernel/cobalt/posix/thread.c b/kernel/cobalt/posix/thread.c
index cd5376b..3ab3879 100644
--- a/kernel/cobalt/posix/thread.c
+++ b/kernel/cobalt/posix/thread.c
@@ -639,7 +639,6 @@ static inline int pthread_create(struct cobalt_thread 
**thread_p,
thread->sched_u_policy = policy;
thread->magic = COBALT_THREAD_MAGIC;
xnsynch_init(&thread->monitor_synch, XNSYNCH_FIFO, NULL);
-   thread->monitor_queued = 0;
 
xnsynch_init(&thread->sigwait, XNSYNCH_FIFO, NULL);
sigemptyset(&thread->sigpending);
diff --git a/kernel/cobalt/posix/thread.h b/kernel/cobalt/posix/thread.h
index b1fee6b..b68336e 100644
--- a/kernel/cobalt/posix/thread.h
+++ b/kernel/cobalt/posix/thread.h
@@ -106,7 +106,6 @@ struct cobalt_thread {
/** Monitor wait object and link holder. */
struct xnsynch monitor_synch;
struct list_head monitor_link;
-   int monitor_queued;
 
struct cobalt_local_hkey hkey;
 };


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/thread: expose personality via cobalt_thread_stat( )

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: b5a9cba414e536d71cbddf3c68cb29a99637387a
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=b5a9cba414e536d71cbddf3c68cb29a99637387a

Author: Philippe Gerum 
Date:   Thu Apr 17 12:14:23 2014 +0200

cobalt/thread: expose personality via cobalt_thread_stat()

---

 include/cobalt/uapi/thread.h |1 +
 kernel/cobalt/posix/thread.c |1 +
 2 files changed, 2 insertions(+)

diff --git a/include/cobalt/uapi/thread.h b/include/cobalt/uapi/thread.h
index b9b6b68..94df9f5 100644
--- a/include/cobalt/uapi/thread.h
+++ b/include/cobalt/uapi/thread.h
@@ -48,6 +48,7 @@ struct cobalt_threadstat {
unsigned long pf;
unsigned long long timeout;
char name[XNOBJECT_NAME_LEN];
+   char personality[XNOBJECT_NAME_LEN];
 };
 
 #endif /* !_COBALT_UAPI_THREAD_H */
diff --git a/kernel/cobalt/posix/thread.c b/kernel/cobalt/posix/thread.c
index 950e154..1d547cf 100644
--- a/kernel/cobalt/posix/thread.c
+++ b/kernel/cobalt/posix/thread.c
@@ -1165,6 +1165,7 @@ int cobalt_thread_stat(pid_t pid,
stat.timeout = xnthread_get_timeout(thread,
xnclock_read_monotonic(&nkclock));
strcpy(stat.name, xnthread_name(thread));
+   strcpy(stat.personality, xnthread_personality(thread)->name);
xnlock_put_irqrestore(&nklock, s);
 
return __xn_safe_copy_to_user(u_stat, &stat, sizeof(stat));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate: sanity checks for non-SMP libraries over SMP kernel

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 90fa271f5d06607a7c8727d7bca3358ff51b317b
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=90fa271f5d06607a7c8727d7bca3358ff51b317b

Author: Philippe Gerum 
Date:   Mon Apr 21 11:22:04 2014 +0200

copperplate: sanity checks for non-SMP libraries over SMP kernel

---

 lib/cobalt/init.c  |6 ++
 lib/copperplate/init.c |5 +
 2 files changed, 11 insertions(+)

diff --git a/lib/cobalt/init.c b/lib/cobalt/init.c
index a903814..7c36745 100644
--- a/lib/cobalt/init.c
+++ b/lib/cobalt/init.c
@@ -216,6 +216,12 @@ static __libcobalt_ctor void __init_cobalt(void)
_exit(0);
}
 
+#ifndef CONFIG_SMP
+   ret = get_static_cpu_count();
+   if (ret > 0)
+   report_error("running non-SMP libraries on SMP kernel?");
+#endif
+
__cobalt_main_tid = tid;
 
if (__cobalt_defer_init)
diff --git a/lib/copperplate/init.c b/lib/copperplate/init.c
index 4cb0c6f..0603a51 100644
--- a/lib/copperplate/init.c
+++ b/lib/copperplate/init.c
@@ -504,6 +504,11 @@ void copperplate_init(int *argcp, char *const **argvp)
return;
}
 
+#if defined(CONFIG_MERCURY) && !defined(CONFIG_SMP)
+   ret = get_static_cpu_count();
+   if (ret > 0)
+   early_panic("running non-SMP libraries on SMP kernel?");
+#endif
boilerplate_init();
 
threadobj_init_key();


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate: set SA_RESTART for internal signals

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 6951f64c0a438c708711e24434143969c6c62567
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6951f64c0a438c708711e24434143969c6c62567

Author: Philippe Gerum 
Date:   Wed Apr 23 15:19:44 2014 +0200

copperplate: set SA_RESTART for internal signals

---

 lib/copperplate/registry.c  |1 +
 lib/copperplate/threadobj.c |1 +
 2 files changed, 2 insertions(+)

diff --git a/lib/copperplate/registry.c b/lib/copperplate/registry.c
index 1606cd7..f6bb148 100644
--- a/lib/copperplate/registry.c
+++ b/lib/copperplate/registry.c
@@ -641,6 +641,7 @@ static int spawn_daemon(const char *sessdir)
regd_pid = pid;
barrier();
sa.sa_handler = sigchld_handler;
+   sa.sa_flags = SA_RESTART;
sigaction(SIGCHLD, &sa, NULL);
ret = 0;
break;
diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index 9901a54..5429876 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -441,6 +441,7 @@ static inline void pkg_init_corespec(void)
 
memset(&sa, 0, sizeof(sa));
sa.sa_handler = unblock_sighandler;
+   sa.sa_flags = SA_RESTART;
sigaction(SIGRELS, &sa, NULL);
sigaction(SIGWAKEUP, &sa, NULL);
sa.sa_handler = roundrobin_handler;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : psos: enable error checking for mutexes in debug mode

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: f4adb1b5bac2c2e847229001b04e6bdb7406660a
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=f4adb1b5bac2c2e847229001b04e6bdb7406660a

Author: Philippe Gerum 
Date:   Wed Apr 16 16:56:15 2014 +0200

psos: enable error checking for mutexes in debug mode

---

 lib/psos/pt.c |1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/psos/pt.c b/lib/psos/pt.c
index c0bbf25..0189b74 100644
--- a/lib/psos/pt.c
+++ b/lib/psos/pt.c
@@ -185,6 +185,7 @@ u_long pt_create(const char *name,
*nbuf = pt->nblks;
 
__RT(pthread_mutexattr_init(&mattr));
+   __RT(pthread_mutexattr_settype(&mattr, mutex_type_attribute));
__RT(pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT));
__RT(pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE));
__RT(pthread_mutex_init(&pt->lock, &mattr));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : drivers/testing: move to new-style atomic sections

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 9e0b1d0650123e5c57320b80c1fcd2c9a4345ae1
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=9e0b1d0650123e5c57320b80c1fcd2c9a4345ae1

Author: Philippe Gerum 
Date:   Thu Apr 10 11:41:22 2014 +0200

drivers/testing: move to new-style atomic sections

---

 kernel/drivers/testing/timerbench.c |   33 +++--
 1 file changed, 15 insertions(+), 18 deletions(-)

diff --git a/kernel/drivers/testing/timerbench.c 
b/kernel/drivers/testing/timerbench.c
index 7d056d4..3a88cd9 100644
--- a/kernel/drivers/testing/timerbench.c
+++ b/kernel/drivers/testing/timerbench.c
@@ -141,22 +141,19 @@ static void eval_outer_loop(struct rt_tmbench_context 
*ctx)
 static void timer_task_proc(void *arg)
 {
struct rt_tmbench_context *ctx = arg;
-   int count;
+   int count, err;
+   spl_t s;
 
/* first event: one millisecond from now. */
ctx->date = rtdm_clock_read_monotonic() + 100;
 
while (1) {
-   int err;
-
for (count = 0; count < ctx->samples_per_sec; count++) {
-   RTDM_EXECUTE_ATOMICALLY(
-   ctx->start_time = rtdm_clock_read_monotonic();
-   err =
-   rtdm_task_sleep_abs(ctx->date,
-   
RTDM_TIMERMODE_ABSOLUTE);
-   );
-
+   rtdm_atomic_enter(s);
+   ctx->start_time = rtdm_clock_read_monotonic();
+   err = rtdm_task_sleep_abs(ctx->date,
+ RTDM_TIMERMODE_ABSOLUTE);
+   rtdm_atomic_leave(s);
if (err)
return;
 
@@ -237,6 +234,7 @@ static int rt_tmbench_start(struct rtdm_dev_context 
*context,
struct rttst_tmbench_config __user *user_config)
 {
int err = 0;
+   spl_t s;
 
struct rttst_tmbench_config config_buf;
struct rttst_tmbench_config *config =
@@ -311,16 +309,15 @@ static int rt_tmbench_start(struct rtdm_dev_context 
*context,
if (!test_bit(RTDM_CLOSING, &context->context_flags)) {
ctx->mode = RTTST_TMBENCH_HANDLER;
 
-   RTDM_EXECUTE_ATOMICALLY(
-   ctx->start_time = rtdm_clock_read_monotonic();
+   rtdm_atomic_enter(s);
+   ctx->start_time = rtdm_clock_read_monotonic();
 
-   /* first event: one millisecond from now. */
-   ctx->date = ctx->start_time + 100;
+   /* first event: one millisecond from now. */
+   ctx->date = ctx->start_time + 100;
 
-   err =
-   rtdm_timer_start(&ctx->timer, ctx->date, 0,
-RTDM_TIMERMODE_ABSOLUTE);
-   );
+   err = rtdm_timer_start(&ctx->timer, ctx->date, 0,
+  RTDM_TIMERMODE_ABSOLUTE);
+   rtdm_atomic_leave(s);
}
}
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : config: fixup dist rules

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 2d8498789f807b2794b3db4b7dd5f151ecfcaeae
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=2d8498789f807b2794b3db4b7dd5f151ecfcaeae

Author: Philippe Gerum 
Date:   Wed Apr 16 11:20:50 2014 +0200

config: fixup dist rules

---

 config/Makefile.am |9 +-
 config/Makefile.in |   10 +-
 config/compile |  310 
 3 files changed, 12 insertions(+), 317 deletions(-)

diff --git a/config/Makefile.am b/config/Makefile.am
index 05199e0..2730d58 100644
--- a/config/Makefile.am
+++ b/config/Makefile.am
@@ -1,3 +1,6 @@
-EXTRA_DIST= \
-   acinclude.m4 \
-   docbook.m4
+EXTRA_DIST=\
+   acinclude.m4\
+   docbook.m4  \
+   apirev  \
+   version \
+   ac_prog_cc_for_build.m4
diff --git a/config/Makefile.in b/config/Makefile.in
index 1fc260d..9b0c7a0 100644
--- a/config/Makefile.in
+++ b/config/Makefile.in
@@ -80,8 +80,7 @@ host_triplet = @host@
 target_triplet = @target@
 subdir = config
 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am INSTALL \
-   compile config.guess config.sub depcomp install-sh missing \
-   ltmain.sh
+   config.guess config.sub depcomp install-sh missing ltmain.sh
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/ac_prog_cc_for_build.m4 \
$(top_srcdir)/config/docbook.m4 \
@@ -290,8 +289,11 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 EXTRA_DIST = \
-   acinclude.m4 \
-   docbook.m4
+   acinclude.m4\
+   docbook.m4  \
+   apirev  \
+   version \
+   ac_prog_cc_for_build.m4
 
 all: all-am
 
diff --git a/config/compile b/config/compile
deleted file mode 100755
index bac481c..000
--- a/config/compile
+++ /dev/null
@@ -1,310 +0,0 @@
-#! /bin/sh
-# Wrapper for compilers which do not understand `-c -o'.
-
-scriptversion=2010-11-15.09; # UTC
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010 Free Software
-# Foundation, Inc.
-# Written by Tom Tromey .
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see .
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to  or send patches to
-# .
-
-nl='
-'
-
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent tools from complaining about whitespace usage.
-IFS=" ""   $nl"
-
-file_conv=
-
-# func_file_conv build_file lazy
-# Convert a $build file to $host form and store it in $file
-# Currently only supports Win32 hosts. If the determined conversion
-# type is listed in (the comma separated) LAZY, no conversion will
-# take place.
-func_file_conv ()
-{
-  file=$1
-  case $file in
-/ | /[!/]*) # absolute file, and not a UNC file
-  if test -z "$file_conv"; then
-   # lazily determine how to convert abs files
-   case `uname -s` in
- MINGW*)
-   file_conv=mingw
-   ;;
- CYGWIN*)
-   file_conv=cygwin
-   ;;
- *)
-   file_conv=wine
-   ;;
-   esac
-  fi
-  case $file_conv/,$2, in
-   *,$file_conv,*)
- ;;
-   mingw/*)
- file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
- ;;
-   cygwin/*)
- file=`cygpath -m "$file" || echo "$file"`
- ;;
-   wine/*)
- file=`winepath -w "$file" || echo "$file"`
- ;;
-  esac
-  ;;
-  esac
-}
-
-# func_cl_wrapper cl arg...
-# Adjust compile command to suit cl
-func_cl_wrapper ()
-{
-  # Assume a capable shell
-  lib_path=
-  shared=:
-  linker_opts=
-  for arg
-  do
-if test -n "$eat"; then
-  eat=
-else
-  case $1 in
-   -o)
- # configure might choose to run compile as `compile cc -o foo foo.c'.
- eat=1
- case $2 in
-   *.o | *.[oO][bB][jJ])
- func_file_conv "$2"
- set x "$@" -Fo"$file"
- shift
- ;;
-   *)
- func_file_conv "$2"
- set x "$@" -Fe"$file"
- 

[Xenomai-git] Philippe Gerum : rtdm: introduce lock name as RTDM_LOCK_UNLOCK() argument

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: rtdm-api-waitqueues
Commit: 61150a92f2ebca24d37a614d6ac55609062b4e55
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=61150a92f2ebca24d37a614d6ac55609062b4e55

Author: Philippe Gerum 
Date:   Sat Apr 12 17:35:51 2014 +0200

rtdm: introduce lock name as RTDM_LOCK_UNLOCK() argument

Mapping RTDM locks over native spinlocks will require to pass the lock
name to the native spinlock initializer, so make sure we receive it
from the RTDM client code.

This change is propagated to all driver stacks concerned (i.e. analogy
and CAN).

---

 include/analogy/os_facilities.h   |5 -
 include/cobalt/kernel/rtdm/driver.h   |7 +--
 kernel/drivers/analogy/testing/fake.c |2 +-
 kernel/drivers/can/rtcan_dev.c|2 +-
 4 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/include/analogy/os_facilities.h b/include/analogy/os_facilities.h
index 0f99cbf..35f4155 100644
--- a/include/analogy/os_facilities.h
+++ b/include/analogy/os_facilities.h
@@ -85,7 +85,10 @@
 
 typedef rtdm_lock_t a4l_lock_t;
 
-#define A4L_LOCK_UNLOCKED RTDM_LOCK_UNLOCKED
+#define A4L_LOCK_UNLOCKED(__name) RTDM_LOCK_UNLOCKED(__name)
+
+#define DEFINE_A4L_LOCK(__name)\
+   a4l_lock_t __name = A4L_LOCK_UNLOCKED(__name)
 
 #define a4l_lock_init(lock) rtdm_lock_init(lock)
 #define a4l_lock(lock) rtdm_lock_get(lock)
diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index bbcc6fb..77e0341 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -690,7 +690,10 @@ int rtdm_select_bind(int fd, rtdm_selector_t *selector,
 /**
  * Static lock initialisation
  */
-#define RTDM_LOCK_UNLOCKED IPIPE_SPIN_LOCK_UNLOCKED
+#define RTDM_LOCK_UNLOCKED(__name) IPIPE_SPIN_LOCK_UNLOCKED
+
+#define DEFINE_RTDM_LOCK(__name)   \
+   rtdm_lock_t __name = RTDM_LOCK_UNLOCKED(__name)
 
 /** Lock variable */
 typedef ipipe_spinlock_t rtdm_lock_t;
@@ -1443,7 +1446,7 @@ int rtdm_ratelimit(struct rtdm_ratelimit_state *rs, const 
char *func);
 
 #define DEFINE_RTDM_RATELIMIT_STATE(name, interval_init, burst_init)   \
struct rtdm_ratelimit_state name = {\
-   .lock   = RTDM_LOCK_UNLOCKED,   \
+   .lock   = RTDM_LOCK_UNLOCKED((name).lock),  \
.interval   = interval_init,\
.burst  = burst_init,   \
}
diff --git a/kernel/drivers/analogy/testing/fake.c 
b/kernel/drivers/analogy/testing/fake.c
index 3871cc5..a2390aa 100644
--- a/kernel/drivers/analogy/testing/fake.c
+++ b/kernel/drivers/analogy/testing/fake.c
@@ -116,7 +116,7 @@ static inline uint16_t ai_value_output(struct ai_priv *priv)
0x8000, 0xa000, 0xc000, 0x
};
static unsigned int output_idx;
-   static a4l_lock_t output_lock = A4L_LOCK_UNLOCKED;
+   static DEFINE_A4L_LOCK(output_lock);
 
unsigned long flags;
unsigned int idx;
diff --git a/kernel/drivers/can/rtcan_dev.c b/kernel/drivers/can/rtcan_dev.c
index 3280587..5caea3a 100644
--- a/kernel/drivers/can/rtcan_dev.c
+++ b/kernel/drivers/can/rtcan_dev.c
@@ -34,7 +34,7 @@
 
 
 static struct rtcan_device *rtcan_devices[RTCAN_MAX_DEVICES];
-static rtdm_lock_t rtcan_devices_rt_lock = RTDM_LOCK_UNLOCKED;
+static DEFINE_RTDM_LOCK(rtcan_devices_rt_lock);
 
 static int rtcan_global_init_done;
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate/ancillaries: define ONE_BILLION

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 823efeeed450ae7b86fa7e7af50b04f0dc71e417
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=823efeeed450ae7b86fa7e7af50b04f0dc71e417

Author: Philippe Gerum 
Date:   Thu Apr 24 17:30:15 2014 +0200

boilerplate/ancillaries: define ONE_BILLION

---

 include/boilerplate/ancillaries.h |2 ++
 testsuite/latency/latency.c   |1 -
 testsuite/unit/sched-quota.c  |2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/boilerplate/ancillaries.h 
b/include/boilerplate/ancillaries.h
index c8b4ec7..9d5818f 100644
--- a/include/boilerplate/ancillaries.h
+++ b/include/boilerplate/ancillaries.h
@@ -43,6 +43,8 @@ struct name_generator {
.serial = 1,\
}
 
+#define ONE_BILLION  10
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/testsuite/latency/latency.c b/testsuite/latency/latency.c
index 12b90a9..5efc344 100644
--- a/testsuite/latency/latency.c
+++ b/testsuite/latency/latency.c
@@ -19,7 +19,6 @@ RT_TASK latency_task, display_task;
 
 RT_SEM display_sem;
 
-#define ONE_BILLION  10
 #define TEN_MILLION1000
 
 unsigned max_relaxed;
diff --git a/testsuite/unit/sched-quota.c b/testsuite/unit/sched-quota.c
index 1347bf7..fef6880 100644
--- a/testsuite/unit/sched-quota.c
+++ b/testsuite/unit/sched-quota.c
@@ -36,10 +36,10 @@
 #include 
 #include 
 #include 
+#include 
 
 #define MAX_THREADS 8
 #define TEST_SECS   1
-#define ONE_BILLION 10UL
 
 static unsigned long long crunch_per_sec, loops_per_sec;
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : include/rtdm: fix rt_dev API wrappers

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: fff312ec6c2dd9afe08c50914be784056b746263
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fff312ec6c2dd9afe08c50914be784056b746263

Author: Philippe Gerum 
Date:   Thu Apr 24 17:21:35 2014 +0200

include/rtdm: fix rt_dev API wrappers

---

 include/rtdm/rtdm.h |   26 +-
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/include/rtdm/rtdm.h b/include/rtdm/rtdm.h
index 92b228f..88deee6 100644
--- a/include/rtdm/rtdm.h
+++ b/include/rtdm/rtdm.h
@@ -41,6 +41,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -51,15 +52,22 @@
  */
 #ifndef RTDM_NO_DEFAULT_USER_API
 
-#define rt_dev_open__RT(open)
-#define rt_dev_socket  __RT(socket)
-#define rt_dev_close   __RT(close)
-#define rt_dev_ioctl   __RT(ioctl)
-#define rt_dev_read__RT(read)
-#define rt_dev_write   __RT(write)
-#define rt_dev_recvmsg __RT(recvmsg)
-#define rt_dev_sendmsg __RT(sendmsg)
-#define rt_dev_recvfrom __RT(recvfrom)
+#define rt_dev_call(__call, __args...) \
+({ \
+   int __ret;  \
+   __ret = __RT(__call(__args));   \
+   __ret < 0 ? -errno : __ret; \
+})
+
+#define rt_dev_open(__args...) rt_dev_call(open, __args)
+#define rt_dev_socket(__args...)   rt_dev_call(socket, __args)
+#define rt_dev_close(__args...)rt_dev_call(close, __args)
+#define rt_dev_ioctl(__args...)rt_dev_call(ioctl, __args)
+#define rt_dev_read(__args...) rt_dev_call(read, __args)
+#define rt_dev_write(__args...)rt_dev_call(write, __args)
+#define rt_dev_recvmsg(__args...)  rt_dev_call(recvmsg, __args)
+#define rt_dev_sendmsg(__args...)  rt_dev_call(sendmsg, __args)
+#define rt_dev_recvfrom(__args...) rt_dev_call(recvfrom, __args)
 
 #endif /* !RTDM_NO_DEFAULT_USER_API */
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/clockobj: drop useless locking in clockobj_ticks_to_timespec()

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 6689f1e0fdd1d0c8b6beab4ba19ca4f27f746066
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6689f1e0fdd1d0c8b6beab4ba19ca4f27f746066

Author: Philippe Gerum 
Date:   Thu Apr 24 16:54:27 2014 +0200

copperplate/clockobj: drop useless locking in clockobj_ticks_to_timespec()

---

 include/copperplate/clockobj.h |2 --
 1 file changed, 2 deletions(-)

diff --git a/include/copperplate/clockobj.h b/include/copperplate/clockobj.h
index bbc2cf2..28709ae 100644
--- a/include/copperplate/clockobj.h
+++ b/include/copperplate/clockobj.h
@@ -206,9 +206,7 @@ static inline
 void clockobj_ticks_to_timespec(struct clockobj *clkobj,
ticks_t ticks, struct timespec *ts)
 {
-   read_lock_nocancel(&clkobj->lock);
__clockobj_ticks_to_timespec(clkobj, ticks, ts);
-   read_unlock(&clkobj->lock);
 }
 
 static inline


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/sched-tp: only warn on partition crossing ( do not panic)

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 255a709b8d07850e489949784562145e45431082
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=255a709b8d07850e489949784562145e45431082

Author: Philippe Gerum 
Date:   Thu Apr 24 16:46:42 2014 +0200

cobalt/sched-tp: only warn on partition crossing (do not panic)

---

 kernel/cobalt/sched-tp.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/cobalt/sched-tp.c b/kernel/cobalt/sched-tp.c
index 794f4c9..13c4416 100644
--- a/kernel/cobalt/sched-tp.c
+++ b/kernel/cobalt/sched-tp.c
@@ -152,7 +152,7 @@ static void xnsched_tp_trackprio(struct xnthread *thread,
 */
if (p) {
/* We should never cross partition boundaries. */
-   XENO_BUGON(NUCLEUS,
+   XENO_WARNON(NUCLEUS,
   thread->base_class == &xnsched_class_tp &&
   thread->tps - thread->sched->tp.partitions != 
p->tp.ptid);
thread->cprio = p->tp.prio;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : config: bump UAPI level

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: c764713096b634a8dc45a4471ef5b3bccfeedb54
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=c764713096b634a8dc45a4471ef5b3bccfeedb54

Author: Philippe Gerum 
Date:   Thu Apr 24 16:11:15 2014 +0200

config: bump UAPI level

---

 config/apirev |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config/apirev b/config/apirev
index b8626c4..7ed6ff8 100644
--- a/config/apirev
+++ b/config/apirev
@@ -1 +1 @@
-4
+5


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : cobalt/kernel: bump ABI revision level

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: edf55494f55e1daa04d2b425c5a8314ce2df3cd3
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=edf55494f55e1daa04d2b425c5a8314ce2df3cd3

Author: Philippe Gerum 
Date:   Thu Apr 24 16:10:43 2014 +0200

cobalt/kernel: bump ABI revision level

---

 kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h  |2 +-
 kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h |2 +-
 kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h|2 +-
 kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h  |2 +-
 kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h   |2 +-
 kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h  |2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h
index 28bfecc..2570664 100644
--- a/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/arm/include/asm/xenomai/uapi/features.h
@@ -29,7 +29,7 @@
 #define __XN_TSC_TYPE_FREERUNNING_COUNTDOWN 5
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP (__xn_feat_generic_mask)
 
diff --git a/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h
index fa1b46f..9eedd29 100644
--- a/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/blackfin/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_BLACKFIN_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h
index 09017f9..b168993 100644
--- a/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/nios2/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_NIOS2_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   4UL
+#define XENOMAI_ABI_REV   5UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h
index 8d404a2..46e51c2 100644
--- a/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/powerpc/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_POWERPC_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h
index 2559ac1..4be9417 100644
--- a/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/sh/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_SH_ASM_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   2UL
+#define XENOMAI_ABI_REV   3UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h 
b/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h
index 68f88c0..3884c5a 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/uapi/features.h
@@ -19,7 +19,7 @@
 #define _COBALT_X86_ASM_UAPI_FEATURES_H
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   5UL
+#define XENOMAI_ABI_REV   6UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/threadobj: protect threadobj_sleep() against spurious wakeups

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 390e073e93c2e69d4540e79d055e743f01cb7625
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=390e073e93c2e69d4540e79d055e743f01cb7625

Author: Philippe Gerum 
Date:   Tue Apr 22 18:57:18 2014 +0200

copperplate/threadobj: protect threadobj_sleep() against spurious wakeups

threadobj_sleep() should return upon wait completion or
threadobj_unblock() request, whichever comes first. However, receiving
a regular linux signal should not abort this call.

---

 include/copperplate/clockobj.h   |2 +
 include/copperplate/threadobj.h  |4 +
 include/mercury/boilerplate/signal.h |1 +
 lib/copperplate/syncobj.c|6 +-
 lib/copperplate/threadobj.c  |  173 ++
 5 files changed, 143 insertions(+), 43 deletions(-)

diff --git a/include/copperplate/clockobj.h b/include/copperplate/clockobj.h
index 58dbbf9..bbc2cf2 100644
--- a/include/copperplate/clockobj.h
+++ b/include/copperplate/clockobj.h
@@ -51,6 +51,8 @@ struct clockobj {
const char *name;   /* __ref FIXME */
 };
 
+#define zero_time  ((struct timespec){ .tv_sec = 0, .tv_nsec = 0 })
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/include/copperplate/threadobj.h b/include/copperplate/threadobj.h
index 2c6794f..5438790 100644
--- a/include/copperplate/threadobj.h
+++ b/include/copperplate/threadobj.h
@@ -22,6 +22,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -88,6 +89,9 @@ struct threadobj_corespec {
ticks_t period;
/** Timeout reported by sysregd. */
struct timespec timeout;
+   /** Timer data for threadobj_sleep() */
+   struct sigevent sleep_sev;
+   timer_t sleep_timer;
 };
 
 struct threadobj_stat {
diff --git a/include/mercury/boilerplate/signal.h 
b/include/mercury/boilerplate/signal.h
index 14523cd..996711f 100644
--- a/include/mercury/boilerplate/signal.h
+++ b/include/mercury/boilerplate/signal.h
@@ -26,6 +26,7 @@
 
 #define SIGNOTIFY  (SIGRTMIN + 8) /* Internal notification */
 #define SIGRELS(SIGRTMIN + 9) /* Syscall abort */
+#define SIGWAKEUP  (SIGRTMIN + 10) /* Sleep abort */
 
 #define SIGSAFE_LOCK_ENTRY(__safelock) \
do {\
diff --git a/lib/copperplate/syncobj.c b/lib/copperplate/syncobj.c
index 7834f86..5aee1a2 100644
--- a/lib/copperplate/syncobj.c
+++ b/lib/copperplate/syncobj.c
@@ -50,9 +50,9 @@
  * emulated via a mutex and two condition variables over Mercury (one
  * of which being hosted by the thread object implementation).
  *
- * NOTE: we do no do error backtracing in this file, since error
- * returns when locking, pending or deleting sync objects express
- * normal runtime conditions.
+ * NOTE: we don't do error backtracing in this file, since error
+ * returns when locking, pending or deleting sync objects usually
+ * express normal runtime conditions.
  */
 
 #ifdef CONFIG_XENO_COBALT
diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index a2a9dcd..9901a54 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -178,6 +178,43 @@ int threadobj_resume(struct threadobj *thobj) /* 
thobj->lock held */
return __bt(-ret);
 }
 
+int threadobj_sleep(struct timespec *ts)
+{
+   struct threadobj *current = threadobj_current();
+   sigset_t set;
+   int sig, ret;
+
+   /*
+* threadobj_sleep() shall return -EINTR immediately upon
+* threadobj_unblock(), to honor forced wakeup semantics for
+* RTOS personalities.
+*
+* Otherwise, the sleep should be silently restarted until
+* completion after a Linux signal is handled.
+*/
+   current->run_state = __THREAD_S_DELAYED;
+   threadobj_save_timeout(¤t->core, ts);
+
+   do {
+   /*
+* Waiting on a null signal set causes an infinite
+* delay, so that only threadobj_unblock() or a linux
+* signal can unblock us.
+*/
+   if (ts->tv_sec == 0 && ts->tv_nsec == 0) {
+   sigemptyset(&set);
+   ret = -__RT(sigwait(&set, &sig));
+   } else
+   ret = -__RT(clock_nanosleep(CLOCK_COPPERPLATE,
+   TIMER_ABSTIME, ts, NULL));
+   } while (ret == -EINTR &&
+(current->core.u_window->info & XNBREAK) == 0);
+
+   current->run_state = __THREAD_S_RUNNING;
+
+   return ret;
+}
+
 int __threadobj_lock_sched(struct threadobj *current)
 {
smp_rmb();
@@ -405,6 +442,7 @@ static inline void pkg_init_corespec(void)
memset(&sa, 0, sizeof(sa));
sa.sa_handler = unblock_sighandler;
sigaction(SIGRELS, &sa, NULL);
+   sigaction(SIGWAKEUP, &sa, NULL);
sa.sa_handler = roundrobin_handler;
   

[Xenomai-git] Philippe Gerum : cobalt/kernel: retrieve current TCB using xnshadow_current() when unambiguous

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 3b09ec2b4dec367a02b68f03f80eb2b606b06802
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=3b09ec2b4dec367a02b68f03f80eb2b606b06802

Author: Philippe Gerum 
Date:   Thu Apr 24 14:39:27 2014 +0200

cobalt/kernel: retrieve current TCB using xnshadow_current() when unambiguous

Unlike xnsched_current_thread(), xnshadow_current() does not involve
accessing protected per-cpu data on SMP. So prefer it when the context
is obviously primary, which guarantees that xnsched_current_thread()
== xnshadow_current().

---

 kernel/cobalt/posix/clock.c   |2 +-
 kernel/cobalt/posix/monitor.c |   29 +
 kernel/cobalt/posix/mutex.c   |   24 +---
 kernel/cobalt/posix/select.c  |   12 +---
 kernel/cobalt/posix/signal.c  |2 +-
 kernel/cobalt/posix/thread.c  |4 ++--
 kernel/cobalt/registry.c  |3 +--
 kernel/cobalt/rtdm/drvlib.c   |   20 +++-
 kernel/cobalt/select.c|   15 ++-
 kernel/cobalt/shadow.c|   26 +-
 kernel/cobalt/synch.c |   18 ++
 kernel/cobalt/thread.c|8 
 12 files changed, 92 insertions(+), 71 deletions(-)

diff --git a/kernel/cobalt/posix/clock.c b/kernel/cobalt/posix/clock.c
index f98592c..68383a7 100644
--- a/kernel/cobalt/posix/clock.c
+++ b/kernel/cobalt/posix/clock.c
@@ -270,7 +270,7 @@ int cobalt_clock_nanosleep(clockid_t clock_id, int flags,
if (flags & ~TIMER_ABSTIME)
return -EINVAL;
 
-   cur = xnsched_current_thread();
+   cur = xnshadow_current();
 
xnlock_get_irqsave(&nklock, s);
 
diff --git a/kernel/cobalt/posix/monitor.c b/kernel/cobalt/posix/monitor.c
index c6b982e..5507829 100644
--- a/kernel/cobalt/posix/monitor.c
+++ b/kernel/cobalt/posix/monitor.c
@@ -114,9 +114,8 @@ int cobalt_monitor_init(struct cobalt_monitor_shadow __user 
*u_mon,
 }
 
 /* nklock held, irqs off */
-static int cobalt_monitor_enter_inner(xnhandle_t handle)
+static int cobalt_monitor_enter_inner(xnhandle_t handle, struct xnthread *curr)
 {
-   struct xnthread *cur = xnsched_current_thread();
struct cobalt_monitor *mon;
int ret = 0, info;
 
@@ -131,11 +130,11 @@ static int cobalt_monitor_enter_inner(xnhandle_t handle)
 *
 * NOTE: monitors do not support recursive entries.
 */
-   ret = xnsynch_fast_acquire(mon->gate.fastlock, xnthread_handle(cur));
+   ret = xnsynch_fast_acquire(mon->gate.fastlock, xnthread_handle(curr));
switch(ret) {
case 0:
-   if (xnthread_test_state(cur, XNWEAK))
-   xnthread_inc_rescnt(cur);
+   if (xnthread_test_state(curr, XNWEAK))
+   xnthread_inc_rescnt(curr);
break;
default:
/* Nah, we really have to wait. */
@@ -154,6 +153,7 @@ static int cobalt_monitor_enter_inner(xnhandle_t handle)
 
 int cobalt_monitor_enter(struct cobalt_monitor_shadow __user *u_mon)
 {
+   struct xnthread *curr = xnshadow_current();
xnhandle_t handle;
int ret;
spl_t s;
@@ -161,7 +161,7 @@ int cobalt_monitor_enter(struct cobalt_monitor_shadow 
__user *u_mon)
handle = cobalt_get_handle_from_user(&u_mon->handle);
 
xnlock_get_irqsave(&nklock, s);
-   ret = cobalt_monitor_enter_inner(handle);
+   ret = cobalt_monitor_enter_inner(handle, curr);
xnlock_put_irqrestore(&nklock, s);
 
return ret;
@@ -301,7 +301,7 @@ int cobalt_monitor_wait(struct cobalt_monitor_shadow __user 
*u_mon,
opret = -ETIMEDOUT;
}
 
-   ret = cobalt_monitor_enter_inner(handle);
+   ret = cobalt_monitor_enter_inner(handle, &curr->threadbase);
 out:
xnlock_put_irqrestore(&nklock, s);
 
@@ -313,11 +313,13 @@ out:
 int cobalt_monitor_sync(struct cobalt_monitor_shadow __user *u_mon)
 {
struct cobalt_monitor *mon;
+   struct xnthread *curr;
xnhandle_t handle;
int ret = 0;
spl_t s;
 
handle = cobalt_get_handle_from_user(&u_mon->handle);
+   curr = xnshadow_current();
 
xnlock_get_irqsave(&nklock, s);
 
@@ -326,9 +328,9 @@ int cobalt_monitor_sync(struct cobalt_monitor_shadow __user 
*u_mon)
ret = -EINVAL;
else if (mon->data->flags & COBALT_MONITOR_SIGNALED) {
cobalt_monitor_wakeup(mon);
-   xnsynch_release(&mon->gate, xnsched_current_thread());
+   xnsynch_release(&mon->gate, curr);
xnsched_run();
-   ret = cobalt_monitor_enter_inner(handle);
+   ret = cobalt_monitor_enter_inner(handle, curr);
}
 
xnlock_put_irqrestore(&nklock, s);
@@ -339,11 +341,13 @@ int cobalt_monitor_sync(struct cobalt_monitor_shadow 
__user *u_mon)
 int cobalt_monitor_exit(struct cobalt_monitor_shadow __user *u_mon)
 {
struct cobalt_monitor *mon;
+   str

[Xenomai-git] Philippe Gerum : alchemy/task: protect cancel-unsafe section

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: fa422c2e695aee85a68c06178ecc5ad7aac96b63
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fa422c2e695aee85a68c06178ecc5ad7aac96b63

Author: Philippe Gerum 
Date:   Wed Apr 23 12:39:59 2014 +0200

alchemy/task: protect cancel-unsafe section

---

 lib/alchemy/task.c |3 +++
 1 file changed, 3 insertions(+)

diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c
index 254aa5f..ebc8987 100644
--- a/lib/alchemy/task.c
+++ b/lib/alchemy/task.c
@@ -906,6 +906,7 @@ int rt_task_wait_period(unsigned long *overruns_r)
 int rt_task_sleep_until(RTIME date)
 {
struct timespec ts;
+   struct service svc;
ticks_t now;
 
if (!threadobj_current_p())
@@ -917,7 +918,9 @@ int rt_task_sleep_until(RTIME date)
clockobj_get_time(&alchemy_clock, &now, NULL);
if (date <= now)
return -ETIMEDOUT;
+   CANCEL_DEFER(svc);
clockobj_ticks_to_timespec(&alchemy_clock, date, &ts);
+   CANCEL_RESTORE(svc);
}
 
return threadobj_sleep(&ts);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/testsuite: check for rt_task_unblock()

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: e885fec06cd66e317955283da79da1cb746abde9
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=e885fec06cd66e317955283da79da1cb746abde9

Author: Philippe Gerum 
Date:   Wed Apr 23 13:01:34 2014 +0200

alchemy/testsuite: check for rt_task_unblock()

---

 lib/alchemy/testsuite/Makefile |1 +
 lib/alchemy/testsuite/task-9.c |   70 
 2 files changed, 71 insertions(+)

diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile
index 950a2aa..04a299d 100644
--- a/lib/alchemy/testsuite/Makefile
+++ b/lib/alchemy/testsuite/Makefile
@@ -20,6 +20,7 @@ TESTS :=  \
task-6  \
task-7  \
task-8  \
+   task-9  \
mq-1\
mq-2\
mq-3\
diff --git a/lib/alchemy/testsuite/task-9.c b/lib/alchemy/testsuite/task-9.c
new file mode 100644
index 000..168afbb
--- /dev/null
+++ b/lib/alchemy/testsuite/task-9.c
@@ -0,0 +1,70 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+
+static struct traceobj trobj;
+
+static RT_TASK t_test;
+
+#define ONE_SECOND  10ULL
+
+void sighandler(int sig)
+{
+   /* nop */
+}
+
+static void test_task(void *arg)
+{
+   int ret;
+
+   traceobj_enter(&trobj);
+
+   ret = rt_task_sleep_until(TM_INFINITE);
+   traceobj_assert(&trobj, ret == -EINTR);
+
+   traceobj_exit(&trobj);
+}
+
+int main(int argc, char *const argv[])
+{
+   struct sigaction sa;
+   RT_TASK_INFO info;
+   sigset_t set;
+   int ret;
+
+   memset(&sa, 0, sizeof(sa));
+   sa.sa_handler = sighandler;
+   sigaction(SIGUSR1, &sa, NULL);
+
+   traceobj_init(&trobj, argv[0], 0);
+
+   ret = rt_task_create(&t_test, "test_task", 0, 10, 0);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_inquire(&t_test, &info);
+   traceobj_assert(&trobj, ret == 0);
+
+   sigemptyset(&set);
+   sigaddset(&set, SIGUSR1);
+   pthread_sigmask(SIG_BLOCK, &set, NULL);
+
+   ret = rt_task_start(&t_test, test_task, NULL);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_sleep(ONE_SECOND);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = __STD(kill(info.pid, SIGUSR1));
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_sleep(ONE_SECOND);
+   traceobj_assert(&trobj, ret == 0);
+   ret = rt_task_unblock(&t_test);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_join(&trobj);
+
+   exit(0);
+}


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Matthias Schneider : copperplate/notifier: drop pointless select() loop from sighandler

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 2ac9031e9ac788d3349315693a70d16d08e9be03
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=2ac9031e9ac788d3349315693a70d16d08e9be03

Author: Matthias Schneider 
Date:   Wed Apr 23 15:44:53 2014 +0200

copperplate/notifier: drop pointless select() loop from sighandler

---

 lib/copperplate/notifier.c |   24 +---
 1 file changed, 1 insertion(+), 23 deletions(-)

diff --git a/lib/copperplate/notifier.c b/lib/copperplate/notifier.c
index d069a66..7fa48f3 100644
--- a/lib/copperplate/notifier.c
+++ b/lib/copperplate/notifier.c
@@ -34,41 +34,21 @@ static pthread_mutex_t notifier_lock;
 
 static struct sigaction notifier_old_sa;
 
-static fd_set notifier_rset;
-
 static void notifier_sighandler(int sig, siginfo_t *siginfo, void *uc)
 {
-   static struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
int ret, matched = 0;
struct notifier *nf;
-   fd_set rfds;
pid_t tid;
char c;
 
tid = copperplate_get_tid();
 
-   if (siginfo->si_code == SI_SIGIO) {
-   FD_ZERO(&rfds);
-   FD_SET(siginfo->si_fd, &rfds);
-   } else {
-   /*
-* We will have to find out by ourselves which fd was
-* notified.
-*/
-   rfds = notifier_rset;
-   do
-   ret = __STD(select(FD_SETSIZE, &rfds, NULL, NULL, &tv));
-   while (ret == -1 && errno == EINTR);
-   if (ret <= 0)
-   goto hand_over;
-   }
-
if (pvlist_empty(¬ifier_list))
goto hand_over;
 
/* We may NOT alter the notifier list, but only scan it. */
pvlist_for_each_entry(nf, ¬ifier_list, link) {
-   if (!FD_ISSET(nf->psfd[0], &rfds))
+   if (nf->psfd[0] != siginfo->si_fd)
continue;
/*
 * Ignore misdirected notifications. We want those to
@@ -173,7 +153,6 @@ int notifier_init(struct notifier *nf,
push_cleanup_lock(¬ifier_lock);
lock_notifier_list(&oset);
pvlist_append(&nf->link, ¬ifier_list);
-   FD_SET(nf->psfd[0], ¬ifier_rset);
unlock_notifier_list(&oset);
pop_cleanup_lock(¬ifier_lock);
 
@@ -208,7 +187,6 @@ void notifier_destroy(struct notifier *nf)
push_cleanup_lock(¬ifier_lock);
lock_notifier_list(&oset);
pvlist_remove(&nf->link);
-   FD_CLR(nf->psfd[0], ¬ifier_rset);
unlock_notifier_list(&oset);
pop_cleanup_lock(¬ifier_lock);
__STD(close(nf->psfd[0]));


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate: set SA_RESTART for internal signals

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 6951f64c0a438c708711e24434143969c6c62567
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6951f64c0a438c708711e24434143969c6c62567

Author: Philippe Gerum 
Date:   Wed Apr 23 15:19:44 2014 +0200

copperplate: set SA_RESTART for internal signals

---

 lib/copperplate/registry.c  |1 +
 lib/copperplate/threadobj.c |1 +
 2 files changed, 2 insertions(+)

diff --git a/lib/copperplate/registry.c b/lib/copperplate/registry.c
index 1606cd7..f6bb148 100644
--- a/lib/copperplate/registry.c
+++ b/lib/copperplate/registry.c
@@ -641,6 +641,7 @@ static int spawn_daemon(const char *sessdir)
regd_pid = pid;
barrier();
sa.sa_handler = sigchld_handler;
+   sa.sa_flags = SA_RESTART;
sigaction(SIGCHLD, &sa, NULL);
ret = 0;
break;
diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index 9901a54..5429876 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -441,6 +441,7 @@ static inline void pkg_init_corespec(void)
 
memset(&sa, 0, sizeof(sa));
sa.sa_handler = unblock_sighandler;
+   sa.sa_flags = SA_RESTART;
sigaction(SIGRELS, &sa, NULL);
sigaction(SIGWAKEUP, &sa, NULL);
sa.sa_handler = roundrobin_handler;


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/testsuite: check block+suspend conjunctive wait

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 83cf9f5eea2065c670398c1905570ee4b23b25da
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=83cf9f5eea2065c670398c1905570ee4b23b25da

Author: Philippe Gerum 
Date:   Thu Apr 24 10:38:21 2014 +0200

alchemy/testsuite: check block+suspend conjunctive wait

---

 lib/alchemy/testsuite/Makefile  |1 +
 lib/alchemy/testsuite/task-10.c |   72 +++
 2 files changed, 73 insertions(+)

diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile
index 04a299d..5726cad 100644
--- a/lib/alchemy/testsuite/Makefile
+++ b/lib/alchemy/testsuite/Makefile
@@ -21,6 +21,7 @@ TESTS :=  \
task-7  \
task-8  \
task-9  \
+   task-10 \
mq-1\
mq-2\
mq-3\
diff --git a/lib/alchemy/testsuite/task-10.c b/lib/alchemy/testsuite/task-10.c
new file mode 100644
index 000..3b16ff3
--- /dev/null
+++ b/lib/alchemy/testsuite/task-10.c
@@ -0,0 +1,72 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+
+static struct traceobj trobj;
+
+static int tseq[] = {
+   1, 6, 2, 3, 4, 7, 5
+};
+
+static RT_TASK t_test;
+
+static RT_SEM sem;
+
+static void test_task(void *arg)
+{
+   int ret;
+
+   traceobj_enter(&trobj);
+
+   traceobj_mark(&trobj, 6);
+
+   ret = rt_sem_p(&sem, TM_INFINITE);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 7);
+
+   traceobj_exit(&trobj);
+}
+
+int main(int argc, char *const argv[])
+{
+   int ret;
+
+   traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int));
+
+   ret = rt_sem_create(&sem, "SEMA", 0, S_FIFO);
+   traceobj_assert(&trobj, ret == 0);
+
+   ret = rt_task_create(&t_test, "test_task", 0, 10, 0);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 1);
+
+   ret = rt_task_start(&t_test, test_task, NULL);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 2);
+
+   ret = rt_task_suspend(&t_test);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 3);
+
+   ret = rt_sem_v(&sem);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 4);
+
+   ret = rt_task_resume(&t_test);
+   traceobj_assert(&trobj, ret == 0);
+
+   traceobj_mark(&trobj, 5);
+
+   traceobj_join(&trobj);
+
+   traceobj_verify(&trobj, tseq, sizeof(tseq) / sizeof(int));
+
+   exit(0);
+}


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : copperplate/threadobj: fix cancel state upon start failure

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: d19f23a172aa299e4e215144cd4c0d70a3e661dc
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=d19f23a172aa299e4e215144cd4c0d70a3e661dc

Author: Philippe Gerum 
Date:   Wed Apr 23 15:41:38 2014 +0200

copperplate/threadobj: fix cancel state upon start failure

---

 lib/copperplate/threadobj.c |2 ++
 1 file changed, 2 insertions(+)

diff --git a/lib/copperplate/threadobj.c b/lib/copperplate/threadobj.c
index 5429876..a17870c 100644
--- a/lib/copperplate/threadobj.c
+++ b/lib/copperplate/threadobj.c
@@ -1082,6 +1082,8 @@ int threadobj_start(struct threadobj *thobj)  /* 
thobj->lock held. */
 * caller to forget about it as well.
 */
if (thobj->run_state == __THREAD_S_DORMANT) {
+   /* Keep cancel-safe after unlock. */
+   thobj->cancel_state = PTHREAD_CANCEL_DISABLE;
threadobj_unlock(thobj);
destroy_thread(thobj);
threadobj_free(thobj);


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : boilerplate/lock: include cancelability state in safety check

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: a48cd406581e0434d8e00df7830d3db150582727
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=a48cd406581e0434d8e00df7830d3db150582727

Author: Philippe Gerum 
Date:   Wed Apr 23 15:42:57 2014 +0200

boilerplate/lock: include cancelability state in safety check

---

 lib/boilerplate/ancillaries.c |   18 --
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/lib/boilerplate/ancillaries.c b/lib/boilerplate/ancillaries.c
index 2d5f532..fc58afd 100644
--- a/lib/boilerplate/ancillaries.c
+++ b/lib/boilerplate/ancillaries.c
@@ -209,15 +209,21 @@ __attribute__ ((weak)) void *__main_heap = NULL;
 
 int __check_cancel_type(const char *locktype)
 {
-   int oldtype;
+   int oldtype, oldstate;
 
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
-   if (oldtype != PTHREAD_CANCEL_DEFERRED) {
-   warning("%s_nocancel() section is NOT cancel-safe", locktype);
-   return __bt(-EINVAL);
-   }
+   if (oldtype == PTHREAD_CANCEL_DEFERRED)
+   return 0;
+
+   pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
+   if (oldstate == PTHREAD_CANCEL_DISABLE)
+   return 0;
+
+   abort();
+   warning("%s_nocancel() section is NOT cancel-safe", locktype);
+   pthread_setcancelstate(oldstate, NULL);
 
-   return 0;
+   return __bt(-EINVAL);
 }
 
 #endif /* CONFIG_XENO_DEBUG */


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


[Xenomai-git] Philippe Gerum : alchemy/task: export kernel tid to RT_TASK_INFO

2014-04-24 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 5d9db042e4ebeb8283dcaeb4949356f5da806ae8
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=5d9db042e4ebeb8283dcaeb4949356f5da806ae8

Author: Philippe Gerum 
Date:   Wed Apr 23 12:31:25 2014 +0200

alchemy/task: export kernel tid to RT_TASK_INFO

---

 doc/asciidoc/MIGRATION.adoc |2 ++
 include/alchemy/task.h  |4 
 lib/alchemy/task.c  |1 +
 3 files changed, 7 insertions(+)

diff --git a/doc/asciidoc/MIGRATION.adoc b/doc/asciidoc/MIGRATION.adoc
index a013447..b7a5787 100644
--- a/doc/asciidoc/MIGRATION.adoc
+++ b/doc/asciidoc/MIGRATION.adoc
@@ -724,6 +724,8 @@ Rationale: This behavior can be achieved by not calling
  corresponding information is too short-lived to be valuable to
  the caller. The task's base priority is still available from
  the +prio+ field.
+   * new field +pid+ represents the Linux kernel task identifier for
+ the Alchemy task, as obtained from syscall(__NR_gettid).
* other fields which represent runtime statistics are now avail
  from a core-specific +stat+ field sub-structure.
 
diff --git a/include/alchemy/task.h b/include/alchemy/task.h
index 7a2eb1c..0387e57 100644
--- a/include/alchemy/task.h
+++ b/include/alchemy/task.h
@@ -76,6 +76,10 @@ struct RT_TASK_INFO {
 * Name of task.
 */
char name[XNOBJECT_NAME_LEN];
+   /**
+* Host pid.
+*/
+   pid_t pid;
 };
 
 typedef struct RT_TASK_INFO RT_TASK_INFO;
diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c
index 8d106fc..254aa5f 100644
--- a/lib/alchemy/task.c
+++ b/lib/alchemy/task.c
@@ -1480,6 +1480,7 @@ int rt_task_inquire(RT_TASK *task, RT_TASK_INFO *info)
 
strcpy(info->name, tcb->name);
info->prio = threadobj_get_priority(&tcb->thobj);
+   info->pid = threadobj_get_pid(&tcb->thobj);
 
put_alchemy_task(tcb);
 out:


___
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git


  1   2   >