void kill_process(volatile process* p) { invalidate_r_queue(p->pid); invalidate_w_queue(p->pid); child_update(p->pid); p->state = TASK_ZOMBIE; prempt(0); }
void out_of_memory() { for(int i=0; i<20; i++) { volatile process *p = get_ready_process(); invalidate_r_queue(p->pid); invalidate_w_queue(p->pid); child_update(p->pid); free_process_memory(p); } volatile process *p = get_ready_process(); if(p->reg.rsi != 0) { switch_to(p); } else { run_process(p); } }
/* Процедура отправки команды на выход из сети закончена */ void net_leave_done( zcall_t *mac_tx ) { zargs_mac_tx_t *marg = (zargs_mac_tx_t *)(mac_tx->args); zcall_t *zc = mac_tx->assoc_call; ZARG(zc, zargs_leave_t, status) = marg->status; if( SUCCESS == marg->status ) { /* Команда успешно отправлена */ child_update( zc, marg->dst ); } /* Освобождаем занятые ресурсы */ zpkt_free( marg->pkt ); zcall_del( mac_tx ); /* Возвращаем результат вышележащему уровню */ zcall_return( zc ); return; }
void execve(process* p, char* bin_file,char* argv[], char* envp[]){ //printf("\n [in execve fn]Process %s called execve ,fd0 type=%c",p->p_name,p->fdtable[0].filetype); process* new_p = create_process_new(p->pp,bin_file,0); int is_background = is_background_process(argv); //new_p->fdtable = p->fdtable; new_p->maxfd = p->maxfd; invalidate_r_queue(p->pid); new_p->pid = p->pid; //set the environment variable of the new process set_env(new_p,argv,envp); copy_fdtable(p,new_p); free_process_memory(p); if(is_background == 1){ new_p->is_background = 1; child_update(new_p->pid); } add_to_readyQ(new_p); }
/* Обработка запроса на исключение дочернего узла из сети */ void net_leave( zcall_t *zc ) { zcall_t *mac_tx; packet_t *lc; field_t lcfield; void *lcptr; neighbor_t *child_ptr; zargs_leave_t *arg = (zargs_leave_t *)(zc->args); /* Проверяем, является ли исключаемое из сети устройство нашим дочерним узлом */ child_ptr = child_by_eaddr( arg->dev_addr ); if( !IN_TABLE(child_ptr) ) { /* Мы не имеем права исключать из сети не наших детей */ arg->status = NWK_UNKNOWN_DEVICE; goto leave_exit; } if( arg->silent ) { /* Удаляем дочерний узел, не сказав ему ничего */ child_update( zc, child_ptr ); arg->status = SUCCESS; goto leave_exit; } /* Создание пакета, который будет содержать команду на выход из сети */ if( (lc = zpkt_new())==0 ) { arg->status = NWK_INVALID_REQUEST; goto leave_exit; } /* Создание стекового вызова для отправки команды на выход из сети */ if( (mac_tx = zcall_new())==0 ) goto cant_tx; /* Формирование тела команды */ lcptr = zpkt_append( lc, LEAVE_CMD_PAYLOAD_SIZE ); ASSERT( 0==lcptr, "Error: can not append leave cmd payload"); /* Определяем полезную нагрузку пакета */ *((uint8_t *)lcptr) = CMD_LEAVE, lcptr=(uint8_t *)lcptr+1; /* Команда выхода из сети */ *((uint8_t *)lcptr) = LEAVE_REQUEST; /* Принудительный выход */ if( arg->remove_children ) *((uint8_t *)lcptr) |= LEAVE_RMCHLD; /* Исключать ли из сети наших внуков */ if( arg->rejoin ) *((uint8_t *)lcptr) |= LEAVE_REJOIN; /* Переподключаться ли к сети после выхода */ /* Формирование сетевого заголовка */ lcptr = zpkt_append( lc, LEAVE_CMD_HEADER_SIZE ); ASSERT( 0==lcptr, "Error: can not append leave cmd header"); NET_FIELD_INIT( &lcfield, lcptr ); SET_FRAME_CTRL( &lcfield, FC_CMD | FC_PROTOCOL_VER | FC_DADDR ); SET_DST_ADDR( &lcfield, child_ptr->net_addr ); SET_SRC_ADDR( &lcfield, nwkShortAddress ); SET_RADIUS( &lcfield, 1 ); SET_SEQ_NUM( &lcfield, nwkSequenceNumber ), ++nwkSequenceNumber; SET_DST_EADDR( &lcfield, child_ptr->ext_addr ); /* Именно по длинному адресу наш ребёнок будет определять * что команда на выход от нас */ /* Отправка одноадресного пакета */ ZCALL_INIT( mac_tx, ZCALL_MAC_TX_UNICAST, net_leave_done ); ZARG( mac_tx, zargs_mac_utx_t, dst ) = child_ptr; ZARG( mac_tx, zargs_mac_utx_t, pkt ) = lc; mac_tx->assoc_call = zc; if( IS_OK(zcall_invoke( mac_tx )) ) return; zcall_del( mac_tx ); cant_tx: zpkt_free( lc ); leave_exit: zcall_return(zc); return; }