Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);               
};
Exemple #4
0
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);
  }
}
Exemple #5
0
void shm_install(void)
{
	kprint("[+] Installing shared memory layer...\n", 0x07);
	shm_tree = tree_create();
	tree_set_root(shm_tree, NULL);	
}