private heaps for native pipes
PATCH 1/1 private heaps for native pipes
Hi,
this is basically the last version of my rt_pipe_create-ext patch to add private, user-resizeable heaps to native pipes. Joerg has tested this patch successfully under the 2.1 trunk, and I added a ChangeLog snippet. Attached both 2.0.x and 2.1.x patches - please apply at least the 2.1 variant.
Jan
ChangeLog +9 -0
@@ -1,3 +1,12 @@ +2005-11-25 Jan Kiszka <[email protected]> + + * skins/native/{pipe.c,pipe.h,syscall.c,lib/pipe.c}: Added poolsize + parameter to rt_pipe_create for setting up pipes with private buffer + pools of user-defined size. Also, the addressed pipe has to be passed + to rt_pipe_alloc and rt_pipe_free now. + + * testsuite/klatency/latency-module.c: Adapted to rt_pipe_* changes. + 2005-11-21 Philippe Gerum <[email protected]> * skins/native, nucleus/pipe.c: Globally replace ENOSPC by
native/pipe.h +12 -3
@@ -37,6 +37,8 @@#ifdef __KERNEL__ +#include <nucleus/heap.h> +#define XENO_PIPE_MAGIC 0x55550202typedef xnpipe_mh_t RT_PIPE_MSG ;
@@ -57,6 +59,10 @@RT_PIPE_MSG *buffer;/* !< Buffer used in byte stream mode. */ +xnheap_t *bufpool;/* !< Current buffer pool. */ + +xnheap_t privpool;/* !< Private buffer pool. */ +size_t fillsz;/* !< Bytes written to the buffer. */ u_long flushable;/* !< Flush request flag. */
@@ -85,7 +91,8 @@int rt_pipe_create (RT_PIPE *pipe,const char *name, -int minor); +int minor, +size_t poolsize);int rt_pipe_delete (RT_PIPE *pipe);
@@ -113,9 +120,11 @@size_t size, int mode); -RT_PIPE_MSG *rt_pipe_alloc (size_t size); +RT_PIPE_MSG *rt_pipe_alloc (RT_PIPE *pipe, +size_t size); -int rt_pipe_free (RT_PIPE_MSG *msg); +int rt_pipe_free (RT_PIPE *pipe, +RT_PIPE_MSG *msg);ssize_t rt_pipe_flush (RT_PIPE *pipe);
native/syscall.c +11 -7
@@ -3194,6 +3194,7 @@char name[XNOBJECT_NAME_LEN ];RT_PIPE_PLACEHOLDER ph;int err, minor; +size_t poolsize;RT_PIPE *pipe;if (!__xn_access_ok (curr,VERIFY_WRITE ,__xn_reg_arg1 (regs),sizeof (ph)))
@@ -3213,12 +3214,15 @@/* Device minor. */ minor = (int )__xn_reg_arg3 (regs); +/* Buffer pool size. */ + poolsize = (size_t )__xn_reg_arg4 (regs); + pipe = (RT_PIPE *)xnmalloc (sizeof (*pipe));if (!pipe)return -ENOMEM ; - err =rt_pipe_create (pipe,name,minor); + err =rt_pipe_create (pipe,name,minor,poolsize);if (err ==0 ) {
@@ -3332,7 +3336,7 @@/* Zero-sized messages are allowed, so we still need to free the message buffer even if no data copy took place. */ -rt_pipe_free (msg); +rt_pipe_free (pipe,msg);return err; }
@@ -3374,7 +3378,7 @@if (!__xn_access_ok (curr,VERIFY_READ ,__xn_reg_arg2 (regs),size))return -EFAULT ; - msg =rt_pipe_alloc (size); + msg =rt_pipe_alloc (pipe,size);if (!msg)return -ENOMEM ;
@@ -3386,7 +3390,7 @@if (err != size)/* If the operation failed, we need to free the message buffer by ourselves. */ -rt_pipe_free (msg); +rt_pipe_free (pipe,msg);return err; }
@@ -3436,7 +3440,7 @@ }else { - msg =rt_pipe_alloc (size); + msg =rt_pipe_alloc (pipe,size);if (!msg)return -ENOMEM ;
@@ -3449,7 +3453,7 @@ err =rt_pipe_stream (pipe,buf,size);if (msg) -rt_pipe_free (msg); +rt_pipe_free (pipe,msg);return err; }
@@ -3595,7 +3599,7 @@ [__xeno_intr_enable ] = { &__rt_intr_enable, __xn_exec_any }, [__xeno_intr_disable ] = { &__rt_intr_disable, __xn_exec_any }, [__xeno_intr_inquire ] = { &__rt_intr_inquire, __xn_exec_any }, - [__xeno_pipe_create ] = { &__rt_pipe_create, __xn_exec_any }, + [__xeno_pipe_create ] = { &__rt_pipe_create, __xn_exec_lostage }, [__xeno_pipe_bind ] = { &__rt_pipe_bind, __xn_exec_conforming }, [__xeno_pipe_delete ] = { &__rt_pipe_delete, __xn_exec_any }, [__xeno_pipe_read ] = { &__rt_pipe_read, __xn_exec_primary },
native/lib/pipe.c +5 -3
@@ -23,13 +23,15 @@int rt_pipe_create (RT_PIPE *pipe,const char *name, -int minor) +int minor, +size_t poolsize) { -return XENOMAI_SKINCALL3 (__xeno_muxid, +return XENOMAI_SKINCALL4 (__xeno_muxid, __xeno_pipe_create, pipe, name, - minor); + minor, + poolsize); } int rt_pipe_bind (RT_PIPE *pipe,
native/pipe.c +84 -23
253 lines not on this page · raw message
klatency/latency-module.c +3 -3
@@ -83,7 +83,7 @@ maxjitter = maxj; avgjitter = sumj / sample_count; - msg =rt_pipe_alloc (sizeof (struct latency_stat )); + msg =rt_pipe_alloc (&pipe,sizeof (struct latency_stat ));if (!msg) {
@@ -103,7 +103,7 @@ourselves. */ if (rt_pipe_send (&pipe,msg,sizeof (*s),0 ) !=sizeof (*s)) -rt_pipe_free (msg); +rt_pipe_free (&pipe,msg); } }
@@ -128,7 +128,7 @@return 2 ; } - err =rt_pipe_create (&pipe,"klatency" ,0 ); + err =rt_pipe_create (&pipe,"klatency" ,0 ,0 );if (err) {
native/pipe.h +11 -3
@@ -23,6 +23,7 @@#define _XENO_PIPE_H#include <xenomai/nucleus/pipe.h> +#include <xenomai/nucleus/heap.h> #include <xenomai/native/types.h> /* Operation flags. */
@@ -57,6 +58,10 @@RT_PIPE_MSG *buffer;/* !< Buffer used in byte stream mode. */ +xnheap_t *bufpool;/* !< Current buffer pool. */ + +xnheap_t privpool;/* !< Private buffer pool. */ +size_t fillsz;/* !< Bytes written to the buffer. */ u_long flushable;/* !< Flush request flag. */
@@ -85,7 +90,8 @@int rt_pipe_create (RT_PIPE *pipe,const char *name, -int minor); +int minor, +size_t poolsize);int rt_pipe_delete (RT_PIPE *pipe);
@@ -116,9 +122,11 @@size_t size, int mode); -RT_PIPE_MSG *rt_pipe_alloc (size_t size); +RT_PIPE_MSG *rt_pipe_alloc (RT_PIPE *pipe, +size_t size); -int rt_pipe_free (RT_PIPE_MSG *msg); +int rt_pipe_free (RT_PIPE *pipe, +RT_PIPE_MSG *msg);int __native_pipe_pkg_init (void );
ChangeLog +8 -0
@@ -1,3 +1,11 @@ +2005-11-25 Jan Kiszka <[email protected]> + + * ksrc/skins/native/{pipe.c,syscall.c}, src/skins/native/pipe.c, + include/native/pipe.h: Added poolsize parameter to rt_pipe_create + for setting up pipes with private buffer pools of user-defined + size. Also, the addressed pipe has to be passed to rt_pipe_alloc + and rt_pipe_free now. + 2005-11-25 Philippe Gerum <[email protected]> * configure.in: Enable x86-tsc by default.
skins/native/pipe.c +5 -3
@@ -23,13 +23,15 @@int rt_pipe_create (RT_PIPE *pipe,const char *name, -int minor) +int minor, +size_t poolsize) { -return XENOMAI_SKINCALL3 (__native_muxid, +return XENOMAI_SKINCALL4 (__native_muxid, __native_pipe_create, pipe, name, - minor); + minor, + poolsize); } int rt_pipe_bind (RT_PIPE *pipe,
skins/native/syscall.c +13 -9
@@ -3194,6 +3194,7 @@char name[XNOBJECT_NAME_LEN ];RT_PIPE_PLACEHOLDER ph;int err, minor; +size_t poolsize;RT_PIPE *pipe;if (!__xn_access_ok (curr,VERIFY_WRITE ,__xn_reg_arg1 (regs),sizeof (ph)))
@@ -3213,12 +3214,15 @@/* Device minor. */ minor = (int )__xn_reg_arg3 (regs); +/* Buffer pool size. */ + poolsize = (size_t )__xn_reg_arg4 (regs); + pipe = (RT_PIPE *)xnmalloc (sizeof (*pipe));if (!pipe)return -ENOMEM ; - err =rt_pipe_create (pipe,name,minor); + err =rt_pipe_create (pipe,name,minor,poolsize);if (err ==0 ) {
@@ -3332,7 +3336,7 @@/* Zero-sized messages are allowed, so we still need to free the message buffer even if no data copy took place. */ -rt_pipe_free (msg); +rt_pipe_free (pipe,msg);return err; }
@@ -3374,8 +3378,8 @@if (!__xn_access_ok (curr,VERIFY_READ ,__xn_reg_arg2 (regs),size))return -EFAULT ; - msg =rt_pipe_alloc (size); - + msg =rt_pipe_alloc (pipe,size); +if (!msg)return -ENOMEM ;
@@ -3386,7 +3390,7 @@if (err != size)/* If the operation failed, we need to free the message buffer by ourselves. */ -rt_pipe_free (msg); +rt_pipe_free (pipe,msg);return err; }
@@ -3436,8 +3440,8 @@ }else { - msg =rt_pipe_alloc (size); - + msg =rt_pipe_alloc (pipe,size); +if (!msg)return -ENOMEM ;
@@ -3449,7 +3453,7 @@ err =rt_pipe_stream (pipe,buf,size);if (msg) -rt_pipe_free (msg); +rt_pipe_free (pipe,msg);return err; }
@@ -3616,7 +3620,7 @@ [__native_intr_enable ] = { &__rt_intr_enable, __xn_exec_any }, [__native_intr_disable ] = { &__rt_intr_disable, __xn_exec_any }, [__native_intr_inquire ] = { &__rt_intr_inquire, __xn_exec_any }, - [__native_pipe_create ] = { &__rt_pipe_create, __xn_exec_any }, + [__native_pipe_create ] = { &__rt_pipe_create, __xn_exec_lostage }, [__native_pipe_bind ] = { &__rt_pipe_bind, __xn_exec_conforming }, [__native_pipe_delete ] = { &__rt_pipe_delete, __xn_exec_any }, [__native_pipe_read ] = { &__rt_pipe_read, __xn_exec_primary },
skins/native/pipe.c +87 -26
258 lines not on this page · raw message
Philippe Gerum
AppliedQuoted 8 lines · Jan Kiszka
Hi,
this is basically the last version of my rt_pipe_create-ext patch to add private, user-resizeable heaps to native pipes. Joerg has tested this patch successfully under the 2.1 trunk, and I added a ChangeLog snippet. Attached both 2.0.x and 2.1.x patches - please apply at least the 2.1 variant.
Applied to 2.1, thanks. We need to keep the 2.0 branch 100% compatible with the former RTAI/fusion API-wise, so I won't merge this in 2.0 though.
Signature · 1 line
Philippe.
Quoted 10 lines · Philippe Gerum
Quoted 8 lines · Jan Kiszka
Hi,
this is basically the last version of my rt_pipe_create-ext patch to add private, user-resizeable heaps to native pipes. Joerg has tested this patch successfully under the 2.1 trunk, and I added a ChangeLog snippet. Attached both 2.0.x and 2.1.x patches - please apply at least the 2.1 variant.
Quoted 3 lines
Applied to 2.1, thanks. We need to keep the 2.0 branch 100% compatible with the former RTAI/fusion API-wise, so I won't merge this in 2.0 though.
No problem. The patch was first developed on 2.0, so I just attached that version. Now, as I returned from my short travel, Joerg told me that he is already happily working over 2.1-trunk and had adapted my patch. :)
BTW, RTnet also compiles against trunk now, I just have to get the patch into SVN.
Jan