예제 #1
0
파일: syscalls.c 프로젝트: thomasloven/os5
int kill(int pid, int sig)
{
#ifndef NDEBUG
  _syscall_printf("\n Syscall kill(%x, %x)", pid, sig);
#endif
  /* errno = EINVAL; */
  /* return -1; */
  int ret = _syscall_kill(pid, sig);
  errno = syscall_errno;
  return ret;
}
/*-------------------------------------------
| Name:_kernel_timer
| Description:
| Parameters:
| Return Type:
| Comments:
| See:
---------------------------------------------*/
void _kernel_timer(void){
   pid_t _pid;
   kill_t kill_dt;

   kernel_pthread_t* pthread_ptr;
   //
   pthread_ptr = g_pthread_lst;
   //
   while(pthread_ptr) {
      if(pthread_ptr
         && (pthread_ptr->pid>0)
         && ((signed long)(pthread_ptr->time_out)>=0L)) {
         //
         if(pthread_ptr->time_out>0L) {
            if( pthread_ptr->time_out-- ) {
               pthread_ptr=pthread_ptr->gnext;
               continue;
            }
         }
         //try make sytem call
         if(__syscall_trylock()==-EBUSY) {
            pthread_ptr=pthread_ptr->gnext;
            continue;
         }
         //prepare to kill pthread
         pthread_ptr->time_out = -1;
         kill_dt.pid = pthread_ptr->pid;
         kill_dt.sig = SIGALRM;
         kill_dt.atomic = 0; //__clrirq(), __setirq() not used.
         //send SIGALRM to pthread
         _syscall_kill(pthread_ptr,pthread_ptr->pid,&kill_dt);
         __set_active_pthread(pthread_ptr);

         //end of sys call
         __syscall_unlock();
      }

      pthread_ptr=pthread_ptr->gnext;
   }

   for(_pid=1; _pid<=PROCESS_MAX; _pid++) {
      if(!process_lst[_pid]) continue;


   }

   rttmr_restart(&kernel_tmr);

}