diff options
| -rw-r--r-- | include/kmi/sp_tree.h | 4 | ||||
| -rw-r--r-- | src/mem_regions.c | 31 | ||||
| -rw-r--r-- | src/sp_tree.c | 2 | ||||
| -rw-r--r-- | src/timer.c | 17 | ||||
| -rw-r--r-- | src/uapi/ipc.c | 4 |
5 files changed, 27 insertions, 31 deletions
diff --git a/include/kmi/sp_tree.h b/include/kmi/sp_tree.h index f1f9fca..88facef 100644 --- a/include/kmi/sp_tree.h +++ b/include/kmi/sp_tree.h @@ -110,10 +110,10 @@ struct sp_root { /** Which side of the parent node a new node should be inserted to. */ enum sp_dir { /** Left side. */ - LEFT, + SP_LEFT, /** Right side. */ - RIGHT + SP_RIGHT }; /** diff --git a/src/mem_regions.c b/src/mem_regions.c index 9468774..707c2f0 100644 --- a/src/mem_regions.c +++ b/src/mem_regions.c @@ -54,10 +54,13 @@ static struct mem_region *__insert_free_region(struct mem_region_root *r, struct mem_region *m) { + /* this could be simplified by using my gsptrees in kmx, but at least + * this ensures 'inlining' of the condition checking so I'll let it stay + * for now */ struct sp_node *n = sp_root(&r->free_regions), *p = NULL; vm_t start = m->start; size_t size = m->end - m->start; - enum sp_dir d = LEFT; + enum sp_dir d = SP_LEFT; m->sp_n = (struct sp_node){ 0 }; @@ -68,30 +71,26 @@ static struct mem_region *__insert_free_region(struct mem_region_root *r, if (size < nsize) { n = sp_left(n); - d = LEFT; + d = SP_LEFT; } else if (size > nsize) { n = sp_right(n); - d = RIGHT; + d = SP_RIGHT; } else if (start < t->start) { n = sp_left(n); - d = LEFT; + d = SP_LEFT; } else { n = sp_right(n); - d = RIGHT; + d = SP_RIGHT; } } - if (sp_root(&r->free_regions)) - sp_insert(&sp_root(&r->free_regions), p, &m->sp_n, d); - else - sp_root(&r->free_regions) = &m->sp_n; - + sp_insert(&sp_root(&r->free_regions), p, &m->sp_n, d); return m; } @@ -107,7 +106,7 @@ static struct mem_region *__insert_used_region(struct mem_region_root *r, { struct sp_node *n = sp_root(&r->used_regions), *p = NULL; vm_t start = m->start; - enum sp_dir d = LEFT; + enum sp_dir d = SP_LEFT; m->sp_n = (struct sp_node){ 0 }; @@ -118,22 +117,18 @@ static struct mem_region *__insert_used_region(struct mem_region_root *r, if (start < t->start) { n = sp_left(n); - d = LEFT; + d = SP_LEFT; } else { /* we should never encounter a situation where start = * t->start */ n = sp_right(n); - d = RIGHT; + d = SP_RIGHT; } } - if (sp_root(&r->used_regions)) - sp_insert(&sp_root(&r->used_regions), p, &m->sp_n, d); - else - sp_root(&r->used_regions) = &m->sp_n; - + sp_insert(&sp_root(&r->used_regions), p, &m->sp_n, d); return m; } diff --git a/src/sp_tree.c b/src/sp_tree.c index 9f69158..23f707b 100644 --- a/src/sp_tree.c +++ b/src/sp_tree.c @@ -155,7 +155,7 @@ void sp_insert(struct sp_node **root, struct sp_node *p, struct sp_node *n, return; } - if (d == LEFT) + if (d == SP_LEFT) sp_left(p) = n; else sp_right(p) = n; diff --git a/src/timer.c b/src/timer.c index 272ba02..474d995 100644 --- a/src/timer.c +++ b/src/timer.c @@ -89,7 +89,7 @@ static id_t __insert_timer(struct timer_node *ti) { struct sp_root *root = __cpu_timers(); struct sp_node *n = sp_root(root), *p = NULL; - enum sp_dir d = LEFT; + enum sp_dir d = SP_LEFT; while (n) { struct timer_node *t = container_of(n, struct timer_node, sp_n); if (ti->timer.cid == t->timer.cid) { @@ -100,7 +100,10 @@ static id_t __insert_timer(struct timer_node *ti) * to be handled after the one that's very close, but * the timescales that we're dealing with are probably * tiny enough that this won't matter, even if it - * occurs. */ + * occurs. + * + * This is one thing we couldn't do without having the + * internals of sptrees exposed. Pretty cool, huh? */ ti->timer.cid++; } @@ -108,18 +111,14 @@ static id_t __insert_timer(struct timer_node *ti) if (ti->timer.cid < t->timer.cid) { n = sp_left(n); - d = LEFT; + d = SP_LEFT; } else { n = sp_right(n); - d = RIGHT; + d = SP_RIGHT; } } - if (sp_root(root)) - sp_insert(&sp_root(root), p, &ti->sp_n, d); - else - sp_root(root) = &ti->sp_n; - + sp_insert(&sp_root(root), p, &ti->sp_n, d); return ti->timer.cid; } diff --git a/src/uapi/ipc.c b/src/uapi/ipc.c index cb2ce28..bc836fc 100644 --- a/src/uapi/ipc.c +++ b/src/uapi/ipc.c @@ -315,7 +315,9 @@ SYSCALL_DEFINE4(ipc_resp)(struct tcb *t, sys_arg_t d0, sys_arg_t d1, if (unlikely(!is_rpc(t))) return_args1(t, ERR_MISC); - leave_rpc(t, SYS_RET6(OK, t->tid, d0, d1, d2, d3)); + /* inform requester who answered (pid) in the case of the request being + * kicked forward */ + leave_rpc(t, SYS_RET6(OK, t->pid, d0, d1, d2, d3)); } /** |
