Example #1
0
int findtree(int order,PCB *pcb,node *node,int memsize){
    int f;
  if(node->order==order){//find the right order
    if(!((node->left==NULL)&&(node->right==NULL))){ //not leaf but chunk could only be allocated at leaf
       return(-1);
    }
    else{   //the leaf node
       if(node->free_status==0){  //not free
          return(-1);
       }
       else{   //find one heap chunk!
           node->free_status=0;
           printf("Allocated the block: order = %d, addr= %d , requested mem size = %d, block size = %d\n",node->order,node->address,memsize,node->size); 
           return(node->address);
           }
    }
  }
  else{ //fail to locate correct order,keep searching
    if((node->left==NULL)&&(node->right==NULL)){     //leaf with higher order, should create new node
      if(node->free_status==0){ //not free
         return(-1);
      }
      else{ //insert children
        node->left=&pcb->heapnode[findnode(pcb)];
        node->left->order=node->order-1;
        node->left->address=node->address;
        node->left->size=node->size/2;
        node->left->left=NULL;
        node->left->right=NULL;
        node->left->free_status=1;  //initiate as free
        printf("Created a left child node(order= %d, addr= %d, size= %d) of parent (order= %d, addr= %d, size= %d)\n",node->left->order,node->left->address,node->left->size,node->order,node->address,node->size);
        node->right=&pcb->heapnode[findnode(pcb)];
        node->right->order=node->order-1;
        node->right->address=node->address+(32*(1<<node->right->order));
        node->right->size=node->size/2;
        node->right->left=NULL;
        node->right->right=NULL;
        node->right->free_status=1; //initiate as free
        printf("Created a right child node(order= %d, addr= %d, size= %d) of parent (order= %d, addr= %d, size= %d)\n",node->right->order,node->right->address,node->right->size,node->order,node->address,node->size);
        if(((f=findtree(order,currentPCB,node->left,memsize))==-1)){
          //  printf("f= %d\n",f);
            return(findtree(order,currentPCB,node->right,memsize));
        }
        else{
          //  printf("f= %d\n",f);
            return (f);
        }
      }
    }
    else{ //not a leaf, search in left child first, then right child
      if(((f=findtree(order,currentPCB,node->left,memsize))==-1)){
          return(findtree(order,currentPCB,node->right,memsize));
      }
      else{
          return (f);
      }
    }
  }
}   
Example #2
0
void *malloc(PCB *currentPCB, int memsize){
  int order=0;
  int size,base=32;
  int address;
  uint32 virtual_address,physical_address;
  
  if(memsize<=0){
    return NULL;
  }
  if(memsize>4096){
    return NULL;
  }

  size = memsize;
  while(base<size){
  base=base*2;  //tries to find the order
  order++;
  }
//  printf("allocate order is %d\n",order);
  if((address=findtree(order,currentPCB,currentPCB->heapnode,memsize))!=-1){
 // printf("relative address in the heap is %d\n",address);
  virtual_address=(uint32)(16384+address);
  physical_address=MemoryTranslateUserToSystem (currentPCB,virtual_address);
  printf("Created a heap block of size <%d> bytes; virtual address <0x%x>, physical address <0x%x>\n",memsize,virtual_address,physical_address);
  return((uint32 *)virtual_address); 
  }
  else{
  return NULL;
  }
}
Example #3
0
void tryadd(node *p, node **item, node **nufork)
{
  /* temporarily adds one fork and one tip to the tree.
     if the location where they are added yields greater
     "likelihood" than other locations tested up to that
     time, then keeps that location as there */
  long pos;
  boolean found;

  add(p, *item, *nufork, &root, treenode);
  evaluate(root);
  if (lastrearr) {
    if (like >= bstlike2) {
      savetree();
      if (like > bstlike2) {
        bestlike = bstlike2 = like;
        pos = 1;
        nextree = 1;
        dollop_addtree(&pos);
      } else {
        pos = 0;
        findtree(&found, &pos, nextree, place, bestrees);
                /* findtree calls for a bestelm* but is getting */
                /* a long**, LM                                 */
        if (!found) {
          if (nextree <= maxtrees)
            dollop_addtree(&pos);
        }
      }
    }
  }
  if (like > bestyet) {
    bestyet = like;
    there = p;
  }
  re_move(item, nufork, &root, treenode);
}  /* tryadd */