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); } } } }
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; } }
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 */