static inline SharedPages * _mm_shared_pages_find(SBTree *tree, size_t p_page_start) { SBNode *node = sb_root(tree); while (node) { SharedPages *shared_pages = sb_get(node, SharedPages, _node); if (shared_pages->p_page_start == p_page_start) return shared_pages; if (shared_pages->p_page_start > p_page_start) { if (node->left) { node = node->left; } else if ((node = sb_prev(node))) { return sb_get(node, SharedPages, _node); } else { return NULL; } } else { if (node->right) { node = node->right; } else { return shared_pages; } } } return NULL; }
static strbuf * savechar(strbuf *sb, int idx, int c) { if (sb == 0 || idx >= sb->size) { sb = sb_get(sb, idx + 1); } sb->str[idx] = c; return sb; }
static strbuf * savestr(strbuf *sb, const char *str) { int len = strlen(str); if (sb == 0 || len >= sb->size) { sb = sb_get(sb, len + 1); } strcpy(sb->str, str); return sb; }
static Process * _proc_find(SBTree *tree, size_t id) { SBNode *node = sb_root(tree); while (node) { Process *proc = sb_get(node, Process, _node); if (proc->id == id) return proc; if (proc->id > id) { node = node->left; } else { node = node->right; } } return NULL; }
static void _proc_insert(SBTree *tree, Process *proc) { SBNode **ptr = &sb_root(tree), *parent = NULL; while (*ptr) { parent = *ptr; if (sb_get(*ptr, Process, _node)->id > proc->id) { ptr = &(*ptr)->left; } else { ptr = &(*ptr)->right; } } sb_link(&proc->_node, parent, ptr, tree); }
static inline void _mm_shared_pages_insert(SBTree *tree, SharedPages *node) { SBNode **ptr = &sb_root(tree), *parent = NULL; while (*ptr) { parent = *ptr; SharedPages *shared_pages = sb_get(*ptr, SharedPages, _node); if (shared_pages->p_page_start > node->p_page_start) { ptr = &(*ptr)->left; } else { ptr = &(*ptr)->right; } } sb_link(&node->_node, parent, ptr, tree); }