void tasking_install(void) { IRQ_OFF(); /* Install the pit callback, which is acting as a callback service: */ MOD_IOCTL("pit_driver", 1, (uintptr_t)"pit_switch_task", (uintptr_t)pit_switch_task); /* Initialize the very first task, which is the main thread that was already running: */ current_task = main_task = task_create((char*)"rootproc", 0, Kernel::CPU::read_reg(Kernel::CPU::eflags), (uint32_t)Kernel::Memory::Man::curr_dir->table_entries); /* Initialize task list and tree: */ tasklist = list_create(); tasktree = tree_create(); tree_set_root(tasktree, main_task); list_insert(tasklist, main_task); tasking_enable(1); /* Allow tasking to work */ is_tasking_initialized = 1; IRQ_RES(); /* Kickstart tasking */ /* Test tasking: */ task_t * t1 = task_create_and_run((char*)"task1", task1, current_task->regs->eflags, current_task->regs->cr3); task_t * t2 = task_create_and_run((char*)"task2", task2, current_task->regs->eflags, current_task->regs->cr3); task_set_ttl_mode(t1->pid, 0); task_set_ttl_mode(t2->pid, 1); task_set_ttl_fscale(t1, 1000); task_set_ttl(t1, 80); task_set_ttl(t2, 10); }
void map_right_rotate(map* tree, rbnode* node) { rbnode* l = node->left; rbnode_set_left_child(node, l->right); if (rbnode_is_root(node)) tree_set_root(tree, l); else if (rbnode_is_right_child(node)) rbnode_set_right_child(node->parent, l); else rbnode_set_left_child(node->parent, l); rbnode_set_right_child(l, node); }
void map_left_rotate(map* tree, rbnode* node) { rbnode* r; r = node->right; rbnode_set_right_child(node, r->left); if (rbnode_is_root(node)) tree_set_root(tree, r); else if (rbnode_is_right_child(node)) rbnode_set_right_child(node->parent, r); else rbnode_set_left_child(node->parent, r); rbnode_set_left_child(r, node); };
void map_insert(map* tree, const char* key, void* data, const int tag) { rbnode* node = rbnode_create(key, data, tag); rbnode* iterator; int comparison; int fail = 0; if (tree->root == 0) { tree_set_root(tree, node); tree->size = 0; } else { iterator = tree->root; while (iterator != 0) { comparison = strcmp(key, iterator->data.key); /* key already exists */ if (comparison == 0) { fail = 1; iterator = 0; } /* new key < iterator's key */ else if (comparison < 0) { /* left of iterator is free */ if (iterator->left != 0) { iterator = iterator->left; } /* left of iterator is occupied */ else { rbnode_set_left_child(iterator, node); iterator = 0; } } /* new key > iterator's key */ else { /* right of iterator is free */ if (iterator->right != 0) { iterator = iterator->right; } /* right of iterator is occupied */ else { rbnode_set_right_child(iterator, node); iterator = 0; } } } } /* tree requires rebalancing */ if (!fail) { tree->size++; map_insert_balance(tree, node); } }
void shm_install(void) { kprint("[+] Installing shared memory layer...\n", 0x07); shm_tree = tree_create(); tree_set_root(shm_tree, NULL); }