回头看进程的创建

这个时候回头看进程的创建,在进程池中查找空闲的进程对象时,就属于一个临界段代码,并没有任何的约束,所以这时存在很大的隐患的。现在利用锁机制对其进行改写,有了锁的保护,还可以同时加入pid生成代码。

proc_t  *   Proc_create(const char * name,void * entry,void * param,void * stack)
{
    static uint32_t         pid = 0;
    int                     i;
    proc_t              *   proc;
    uint_t              *   sp;
    
    
    proc = NULL;
    
    Lck_lock(&proc_lock);
    
    for( i = 1 ; i < PROC_MAX ; i++)
    {
        if( PROC_STAT_FREE == proc_pool[i].proc_stat )
        {
            proc = proc_pool + i;
            proc->proc_stat = -1;
            break;
        } 
    }
    
    if( NULL == proc )
    {
        printf("no proc space\n");
        Lck_free(&proc_lock);
        return NULL;
    }
    
create_pid:

    pid++;
    if( 0 == pid ) pid++;                              /*  0是系统进程的PID                */
    
    for( i = 1 ; i < PROC_MAX ; i++)                   /*  检测PID是否存在重复             */
    {
        if( PROC_STAT_FREE == proc_pool[i].proc_stat ) /*  跳过空闲的进程对象              */
            continue;
            
        if( pid == proc_pool[i].proc_pid )             /*  出现重复的pid,则重新生成一个   */
            goto create_pid;                           /*  pid                             */
        
    }
    
    proc->proc_pid = pid;
        
    Lck_free(&proc_lock);
    
    /*  设置运行环境    */
    sp      = stack;
    
    sp--;
    *sp--   = 0;                                       /*  进程退出代码                    */
    *sp--   = (uint_t)param;                           /*  进程入口参数                    */
    *sp--   = (uint_t)Proc_exit;                       /*  进程退出函数入口                */
    *sp--   = (uint_t)entry;                           /*  进程入口                        */
    
    *sp--   = 0x200;                                   /*  进程对应的机器状态字            */
    
    *sp--   = 0;                                       /*  以下为寄存器环境                */
    *sp--   = 0;
    *sp--   = 0;
    *sp--   = 0;
    
    *sp--   = 0;
    *sp--   = 0;
    *sp--   = 0;
    *sp     = 0;                                       /*  运行环境设置结束                */
    
    strcpy(proc->proc_name,name);
    
    proc->proc_stack        = sp;
    proc->proc_entry        = entry;
    proc->proc_cpu_time     = CPU_TIME;
    proc->proc_stat         = PROC_STAT_RUN;
            
    return proc;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值