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