Пример #1
0
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);
}
Пример #2
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);
    }
}
Пример #3
0
/* Процедура отправки команды на выход из сети закончена */
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;
}
Пример #4
0
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);

}
Пример #5
0
/* Обработка запроса на исключение дочернего узла из сети */
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;
}