From: Jan Kiszka <jan.kiszka@domain.hid>
To: xenomai-core <xenomai@xenomai.org>
Subject: [Xenomai-core] [patch] static buffer for timer-bheap
Date: Fri, 02 Jun 2006 01:05:04 +0200 [thread overview]
Message-ID: <447F72A0.8000000@domain.hid> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 484 bytes --]
Hi,
this patch moves the heap for scalable timer queues into the xnpod_t
structure instead of allocating it dynamically. This simplifies the pod
initialisation and cleanup, which was not fully robust in this regard
anyway. If a pod is now considered too large (but we are discussion
kbytes here), allocating its buffer via xnarch_sysalloc would be an option.
In case this patch is acceptable, I would suggest merging it before 2.2
due to the contained (minor) fix.
Jan
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: bheap-init.patch --]
[-- Type: text/x-patch; name="bheap-init.patch", Size: 7251 bytes --]
Index: ksrc/nucleus/pod.c
===================================================================
--- ksrc/nucleus/pod.c (Revision 1144)
+++ ksrc/nucleus/pod.c (Arbeitskopie)
@@ -433,22 +433,11 @@ int xnpod_init(xnpod_t *pod, int minpri,
#ifdef CONFIG_XENO_OPT_TIMING_PERIODIC
unsigned n;
- for (n = 0; n < XNTIMER_WHEELSIZE; n++) {
- err = -xntlist_init(&pod->sched[cpu].timerwheel[n]);
-
- if (err) {
- xnheap_destroy(&kheap, &xnpod_flush_heap, NULL);
- goto fail;
- }
- }
+ for (n = 0; n < XNTIMER_WHEELSIZE; n++)
+ xntlist_init(&pod->sched[cpu].timerwheel[n]);
#endif /* CONFIG_XENO_OPT_TIMING_PERIODIC */
- err = -xntimerq_init(&pod->sched[cpu].timerqueue);
-
- if (err) {
- xnheap_destroy(&kheap, &xnpod_flush_heap, NULL);
- goto fail;
- }
+ xntimerq_init(&pod->sched[cpu].timerqueue);
}
for (cpu = 0; cpu < nr_cpus; ++cpu) {
@@ -547,7 +536,6 @@ void xnpod_shutdown(int xtype)
{
xnholder_t *holder, *nholder;
xnthread_t *thread;
- unsigned cpu;
spl_t s;
xnlock_get_irqsave(&nklock, s);
@@ -585,16 +573,6 @@ void xnpod_shutdown(int xtype)
__setbits(nkpod->status, XNPIDLE);
- for (cpu = 0; cpu < xnarch_num_online_cpus(); cpu++) {
-#ifdef CONFIG_XENO_OPT_TIMING_PERIODIC
- unsigned n;
-
- for (n = 0; n < XNTIMER_WHEELSIZE; n++)
- xntlist_destroy(&nkpod->sched[cpu].timerwheel[n]);
-#endif /* CONFIG_XENO_OPT_TIMING_PERIODIC */
- xntimerq_destroy(&nkpod->sched[cpu].timerqueue);
- }
-
xnlock_put_irqrestore(&nklock, s);
#ifdef CONFIG_XENO_OPT_REGISTRY
Index: include/nucleus/bheap.h
===================================================================
--- include/nucleus/bheap.h (Revision 1144)
+++ include/nucleus/bheap.h (Arbeitskopie)
@@ -43,9 +43,15 @@ typedef struct bheaph {
typedef struct bheap {
unsigned sz;
unsigned last;
- bheaph_t **elems;
+ bheaph_t *elems[1]; /* only padding, indexing starts at 1 */
} bheap_t;
+#define DECLARE_BHEAP_CONTAINER(name, sz) \
+ struct { \
+ bheap_t bheap; \
+ bheaph_t elems[sz]; \
+ } name
+
static inline bheaph_t *bheap_gethead(bheap_t *heap)
{
if (heap->last == 1)
@@ -68,26 +74,10 @@ static inline bheaph_t *bheaph_child(bhe
return likely(pos < heap->last) ? heap->elems[pos] : NULL;
}
-static inline int bheap_init(bheap_t *heap, unsigned sz)
+static inline void bheap_init(bheap_t *heap, unsigned sz)
{
heap->sz = sz;
heap->last = 1;
- heap->elems = (bheaph_t **) xnarch_sysalloc(sz * sizeof(void *));
-
- if (!heap->elems)
- return ENOMEM;
-
- /* start indexing at 1. */
- heap->elems -= 1;
-
- return 0;
-}
-
-static inline void bheap_destroy(bheap_t *heap)
-{
- xnarch_sysfree(heap->elems + 1, heap->sz * sizeof(void *));
- heap->last = 0;
- heap->sz = 0;
}
static inline void bheap_swap(bheap_t *heap, bheaph_t *h1, bheaph_t *h2)
@@ -115,7 +105,7 @@ static inline void bheap_down(bheap_t *h
for (;;) {
left = bheaph_child(heap, holder, 0);
right = bheaph_child(heap, holder, 1);
-
+
if (left && right)
minchild = bheaph_lt(left, right) ? left : right;
else
@@ -143,10 +133,10 @@ static inline int bheap_insert(bheap_t *
static inline int bheap_delete(bheap_t *heap, bheaph_t *holder)
{
bheaph_t *lasth;
-
+
if (heap->last == 1)
return EINVAL;
-
+
--heap->last;
if (heap->last > 1) {
lasth = heap->elems[heap->last];
@@ -154,7 +144,7 @@ static inline int bheap_delete(bheap_t *
bheaph_pos(lasth) = bheaph_pos(holder);
bheap_down(heap, lasth);
}
-
+
return 0;
}
Index: include/nucleus/timer.h
===================================================================
--- include/nucleus/timer.h (Revision 1144)
+++ include/nucleus/timer.h (Arbeitskopie)
@@ -58,11 +58,10 @@ typedef struct {
((xntlholder_t *)(((char *)laddr) - offsetof(xntlholder_t, link)))
} xntlholder_t;
-#define xntlholder_date(h) ((h)->key)
-#define xntlholder_prio(h) ((h)->prio)
-#define xntlholder_init(h) inith(&(h)->link)
-#define xntlist_init(q) (initq(q),0)
-#define xntlist_destroy(q) do { } while (0)
+#define xntlholder_date(h) ((h)->key)
+#define xntlholder_prio(h) ((h)->prio)
+#define xntlholder_init(h) inith(&(h)->link)
+#define xntlist_init(q) initq(q)
#define xntlist_head(q) \
({ xnholder_t *_h = getheadq(q); \
!_h ? NULL : link2tlholder(_h); \
@@ -71,7 +70,7 @@ typedef struct {
static inline void xntlist_insert(xnqueue_t *q, xntlholder_t *holder)
{
xnholder_t *p;
-
+
/* Insert the new timer at the proper place in the single
queue managed when running in aperiodic mode. O(N) here,
but users of the aperiodic mode need to pay a price for
@@ -82,7 +81,7 @@ static inline void xntlist_insert(xnqueu
(holder->key == link2tlholder(p)->key &&
holder->prio <= link2tlholder(p)->prio))
break;
-
+
insertq(q,p->next,&holder->link);
}
@@ -94,12 +93,14 @@ typedef bheaph_t xntimerh_t;
#define xntimerh_date(h) bheaph_key(h)
#define xntimerh_prio(h) bheaph_prio(h)
#define xntimerh_init(h) bheaph_init(h)
-typedef bheap_t xntimerq_t;
-#define xntimerq_init(q) bheap_init((q), CONFIG_XENO_OPT_TIMER_HEAP_CAPACITY)
-#define xntimerq_destroy(q) bheap_destroy(q)
-#define xntimerq_head(q) bheap_gethead(q)
-#define xntimerq_insert(q, h) bheap_insert((q),(h))
-#define xntimerq_remove(q, h) bheap_delete((q),(h))
+typedef struct {
+ bheap_t bheap;
+ bheaph_t __buffer[CONFIG_XENO_OPT_TIMER_HEAP_CAPACITY];
+} xntimerq_t;
+#define xntimerq_init(q) bheap_init(&(q)->bheap, CONFIG_XENO_OPT_TIMER_HEAP_CAPACITY)
+#define xntimerq_head(q) bheap_gethead(&(q)->bheap)
+#define xntimerq_insert(q, h) bheap_insert(&(q)->bheap,(h))
+#define xntimerq_remove(q, h) bheap_delete(&(q)->bheap,(h))
#else /* CONFIG_XENO_OPT_TIMER_LIST */
typedef xntlholder_t xntimerh_t;
Index: ChangeLog
===================================================================
--- ChangeLog (Revision 1144)
+++ ChangeLog (Arbeitskopie)
@@ -1,3 +1,9 @@
+2006-06-01 Jan Kiszka <jan.kiszka@domain.hid>
+
+ * include/nucleus/{bheap.h,timer.h}, ksrc/nucleus/pod.c:
+ Move timer heap into xnpod_t structure, simplify pod init and
+ cleanup.
+
2006-05-23 Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
* ksrc/arch/i386/nmi.c: Fix alignement for gcc-4.1.
@@ -14,7 +20,7 @@
* ksrc/arch/arm/patches: Upgrade to 2.6.1{4,5}-1.3-04.
-2006-05-19 Jan Kiszka <jan.kiszka@domain.hid>
+2006-05-19 Jan Kiszka <jan.kiszka@domain.hid>
* src/testsuite/latency/latency.c: Add pid to registered names
allowing multiple instances of latency to run. Add -c switch to
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]
next reply other threads:[~2006-06-01 23:05 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-01 23:05 Jan Kiszka [this message]
2006-06-02 11:59 ` [Xenomai-core] Re: [patch] static buffer for timer-bheap Gilles Chanteperdrix
2006-06-02 12:18 ` Jan Kiszka
2006-06-02 13:34 ` Gilles Chanteperdrix
2006-06-02 14:18 ` Gilles Chanteperdrix
2006-06-02 14:55 ` Jan Kiszka
2006-06-02 15:11 ` Gilles Chanteperdrix
2006-06-02 16:07 ` Jan Kiszka
2006-06-02 16:24 ` Gilles Chanteperdrix
2006-06-02 16:58 ` Jan Kiszka
2006-06-02 18:39 ` Jan Kiszka
2006-06-03 15:38 ` Gilles Chanteperdrix
2006-06-03 17:20 ` Jan Kiszka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=447F72A0.8000000@domain.hid \
--to=jan.kiszka@domain.hid \
--cc=xenomai@xenomai.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.