⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oldmem.c

📁 一种操作系统源码核
💻 C
📖 第 1 页 / 共 2 页
字号:
    PARTITION_LIST  *pheader  ;
    oldstatus=FALSE;

    suspend_list=(MEM_WAIT_QUEUE *)(pool_ptr->task_wait_header);
	 //   DoProtect();
    if (suspend_list){
	 	
    do {
	request_size=suspend_list->request_size;
       if ((*size)*(pool_ptr->partition_size) >= request_size){
	  task_ptr=suspend_list->suspended_task;
	  suspend_list->return_pointer=(VOID *)((*free_memory)->partition_address);
	  status=_ResumeTask(task_ptr,MEMORY_SUSPEND);
	  if (status==TRUE) oldstatus=status;
	  i=0;
	  if (type){
		 pheader=*free_memory;		
		 while(request_size>0){
                    i++;
                    request_size-=pool_ptr->partition_size;
		    pheader= pheader->next;
		    (*free_memory)->availables--;
		    pheader->allocated=TRUE;
		   
	    	}
		  
	    	(*free_memory)->allocated_size=i;
	    	pheader->availables=(*free_memory)->availables;
	    	*free_memory=pheader;
	   	pheader=*free_memory+(*free_memory)->availables-1;	
		pheader->availables=(*free_memory)->availables;
          }
          else{
          	 while(request_size>0){
                    i++;
                    request_size-=pool_ptr->partition_size;
                    }	
		  *free_memory=(*free_memory)+i;
	    }	  
	 *size-=i;
	  if (size==0) break;
       }//end if 
      suspend_list=(MEM_WAIT_QUEUE *)(suspend_list->next);
    }while(suspend_list!=(MEM_WAIT_QUEUE *)(pool_ptr->task_wait_header));
	   
   } //end if 
	 
  return (oldstatus);

}
INT8U FreeBuff(VOID *memory)
{
	INT8U status;
	INT8U found;
	UNSIGNED size;
	MEM_MCB *pool_ptr;
	PARTITION_LIST  *allocated_memory,*pheader,*prev_header,*next_header;
     
	UNSIGNED i,j,k;
	  if (memory== NULL ) {                                 /* Not allowed to delete idle pool     */
		  return (ERR_INVALID_POINTER);
	 }
	 #ifdef OPTION_ENABLE_STACK_CHECK
		Check_Stack();
	 #endif
	 #ifdef OPTION_ENABLE_HISTORY
	  MakeHistoryLog(DELETE_TASK,pool_ptr->name,SYSTIME);//在日志中记录操作,时间等信息
	 #endif

	 /**************************************************************************
	 寻找所在的存储池
	 ***************************************************************************/
	 pool_ptr=(MEM_MCB *)CreatedPoolsList;
	 found=FALSE;
	 ProtectStruct(MEMLIST_PROTECT);
	 do {
	    if ((memory>=pool_ptr->start_address) && (memory < (INT8U *)(pool_ptr->start_address)+pool_ptr->pool_size)){
		found=TRUE;
		  break;
		}
		pool_ptr=(MEM_MCB *)(pool_ptr->linknode.next);
	 }while(pool_ptr != (MEM_MCB *)CreatedPoolsList);
	 UnProtectStruct(MEMLIST_PROTECT);
	 if (!found) return (ERR_INVALID_POINTER);
	  /**************************************************************************
	 寻找属于哪个已分配的存储块
	 ***************************************************************************/
	 found=FALSE;
	 allocated_memory=(PARTITION_LIST *)pool_ptr->partition_list_header;
	 do {
	    if (memory==(VOID *)(allocated_memory->partition_address)){
		found=TRUE;
		  break;
		}
	  allocated_memory=(PARTITION_LIST *)(allocated_memory->next);
	 }while(allocated_memory != (PARTITION_LIST *)pool_ptr->partition_list_header);
	  if (!found){
	  	 DoUnProtect(pool_ptr);
	  	 return (ERR_INVALID_POINTER);
	  	}
	    
         size=allocated_memory->allocated_size;
        status= _FreeTask(pool_ptr,&allocated_memory,&size,FALSE);
	 
	if(size==0) {
		 if (status==TRUE) _ControlToSystem();
	        return (SUCCESS);
	 }   
	 pheader=allocated_memory;
	 allocated_memory->allocated_size=size;
	 while (size--){
		pheader->allocated=FALSE;
		pheader=pheader->next;

	   }
	   i=allocated_memory->allocated_size;
	   j=0;
	   k=0;
	 if(allocated_memory != pool_ptr->partition_list_header){
	   if((allocated_memory->previous)->allocated==FALSE){
		prev_header=(PARTITION_LIST *)(allocated_memory->previous);
		j=prev_header->availables;
		prev_header=prev_header-(j-1);
	        Remove_From_RdyList(&(LIST_NODE *)(pool_ptr->available_partition_header),(LIST_NODE *)prev_header);

	  }
	 }
	if(pheader != pool_ptr->partition_list_header){
	     if((pheader->allocated)==FALSE){
	     next_header=pheader;
	     k=next_header->availables;
	     next_header=next_header+k-1;
	     Remove_From_RdyList(&(LIST_NODE *)(pool_ptr->available_partition_header),(LIST_NODE *)next_header);
	    }
	  }
	if(j && k){
		prev_header->availables=i+j+k;
		next_header->availables=i+j+k;
		pheader=prev_header;
	     }
	else if(j){
		prev_header->availables=i+j;
		(allocated_memory+i-1)->availables=i+j;
		pheader=prev_header;

		}
	 else if(k){
		allocated_memory->availables=i+k;
		next_header->availables=i+k;
		pheader=allocated_memory;
	   }
	else{
	     allocated_memory->availables=i;
	    (allocated_memory+i-1)->availables=i;
	     pheader=allocated_memory;
	  }
	size=pheader->availables ;	
	if(size!=i)
	  status= _FreeTask(pool_ptr,&pheader,&size,TRUE);
	 if(size==1)
	     Place_On_RdyList(&(LIST_NODE *)(pool_ptr->available_partition_header),(LIST_NODE *)pheader);
	 else if (size>1)
	    Priority_Place_On_RdyList(&(LIST_NODE *)(pool_ptr->available_partition_header),(LIST_NODE *)pheader);
	      
	 DoUnProtect(pool_ptr);
	 if (status==TRUE) _ControlToSystem();
	   return (SUCCESS);


}
/*
*********************************************************************************************************
*            This function removing a suspension block from a Mem pool.
Functions Called
 Remove_From_List
*********************************************************************************************************
*/
static VOID MemCleanup(VOID *information)
{
     MEM_MCB *pool_ptr;
      TASK_TCB *task_ptr;
    MEM_WAIT_QUEUE *linknode;
     pool_ptr=(MEM_MCB *)information;
      DoUnProtect(pool_ptr);
     DisableInt();
    linknode=pool_ptr->task_wait_header;
	 do{
	    task_ptr=linknode->suspended_task;
	    if (task_ptr==CurrentThread)
	       Remove_From_List(&(LIST_NODE *)(pool_ptr->task_wait_header),(LIST_NODE *)(linknode));
	    linknode=(MEM_WAIT_QUEUE *)(linknode->next) ;
	    if (linknode==NULL) break;
	  }while(linknode!=pool_ptr->task_wait_header);

      EnableInt();
}
#ifdef CPU32
/*
*********************************************************************************************************
*            This function returns the current number of established Mem pools.
Functions Called
[ Check_Stack]
*********************************************************************************************************
*/
UNSIGNED GetTotalMemPools(VOID)
{
	#ifdef OPTION_ENABLE_STACK_CHECK
		CheckStack();
	 #endif
	return(Total_Pools);                             /* Increment the #pools counter           */


}
/*
*********************************************************************************************************
*          This function returns information about the specified Mem pool.
Functions Called
[ Check_Stack]
 System_Protect
 Unprotect
*********************************************************************************************************
*/
INT8U  GetMemPoolInfo(MEM_MCB *pool_ptr,UNSIGNED *avalables,TASK_TCB **first_task)
{
       PARTITION_LIST *pheader; 
       UNSIGNED num;
	 if (pool_ptr == NULL) {                                 /* Not allowed to delete idle task     */
		  return (ERR_INVALID_POOL);
	 }

	 #ifdef OPTION_ENABLE_STACK_CHECK
		CheckStack();
	 #endif
		      DoProtect(pool_ptr);
	 pheader=(PARTITION_LIST *)(pool_ptr->available_partition_header);
	  num=0;
	 do {
	   num+=pheader->availables;
	  pheader=pheader->nextrdy;
	 }while(pheader!= (PARTITION_LIST *)pool_ptr->available_partition_header);
	 
	 *availables=num*(pool_ptr->partition_size);
	 *first_task=(pool_ptr->task_wait_header)->suspended_task;
			 
			DoUnProtect(pool_ptr); 
		      return (SUCCESS);

}
#endif
/*
*********************************************************************************************************
*         This function initializes the data structures  of  Mem pool.

*********************************************************************************************************
*/
VOID MemPoolInit(VOID)
{
   CreatedPoolsList=NULL;
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -