コード例 #1
0
//Reverse Event Handler
void model_event_reverse (state *s, tw_bf *bf, message *in_msg, tw_lp *lp) {
  int self = lp->gid;

  // undo the state update using the value stored in the 'reverse' message
  SWAP(&(s->value), &(in_msg->contents));

  // handle the message
  switch (in_msg->type) {
    case HELLO :
    {
      s->rcvd_count_H--;
      break;
    }
    case GOODBYE :
    {
      s->rcvd_count_G--;
      break;
    }
    default :
      printf("Unhandeled reverse message type %d\n", in_msg->type);
  }

  // don't forget to undo all rng calls
  tw_rand_reverse_unif(lp->rng);
  tw_rand_reverse_unif(lp->rng);
}
コード例 #2
0
void Airport_RC_EventHandler(Airport_State *SV, tw_bf *CV, Msg_Data *M,
			tw_lp *lp) {
  
  switch(M->event_type) {

  case ARRIVAL: 
    SV->InTheAir--;
        
    if(CV->c1){
      SV->RunwayFree = 1;
      tw_rand_reverse_unif(lp->id);
    }    
    break;
    
  case LAND: 
    SV->InTheAir++;
    SV->OnTheGround--;
    SV->NumLanded--;
    tw_rand_reverse_unif(lp->id);
    
    if(CV->c1)
      tw_rand_reverse_unif(lp->id);
    else
      SV->RunwayFree = 0;

    break;


  case DEPARTURE:  
    SV->OnTheGround++;
    tw_rand_reverse_unif(lp->id);
    break;
  }
}
コード例 #3
0
ファイル: memory.c プロジェクト: jmjwozniak/ROSS-Models
void
mem_event_handler_rc(mem_state * s, tw_bf * bf, mem_message * m, tw_lp * lp)
{
    tw_memory	*b;

    int		 i;

    s->stats.s_rb++;
    s->stats.s_recv--;

    tw_rand_reverse_unif(lp->rng);
    tw_rand_reverse_unif(lp->rng);

    if(bf->c1 == 1)
        tw_rand_reverse_unif(lp->rng);

    // undo the membuf frees and reattach them to the RB event
    for(i = 0; i < nbufs; i++)
    {
        b = tw_memory_free_rc(lp, my_fd);
        s->stats.s_mem_free_rc++;
        tw_event_memory_get_rc(lp, b, my_fd);
        s->stats.s_mem_get_rc++;

        /*
         * unnecessary to undo the allocs ..
         * they will be reclaimed when the events are reclaimed.
         */
    }

    // sanity check
    if(i != nbufs)
        tw_error(TW_LOC, "Did not free_rc %d (%d) memory buffers!",
                 nbufs, i);
}
コード例 #4
0
ファイル: phold.c プロジェクト: nmcglohon/ROSS
void
phold_event_handler_rc(phold_state * s, tw_bf * bf, phold_message * m, tw_lp * lp)
{
	tw_rand_reverse_unif(lp->rng);
	tw_rand_reverse_unif(lp->rng);

	if(bf->c1 == 1)
		tw_rand_reverse_unif(lp->rng);
}
コード例 #5
0
ファイル: wifi.c プロジェクト: laprej/ROSS-Models
void wifi_station_arrival_rc(wifi_access_point_state * s, tw_bf * bf, wifi_message * m, tw_lp * lp)
{
  tw_rand_reverse_unif(lp->rng);
  tw_rand_reverse_unif(lp->rng);

  if( bf->c1 )
    {
      s->stations[m->station].failed_packets--;
    }
}
コード例 #6
0
ファイル: wifi.c プロジェクト: laprej/ROSS-Models
void wifi_access_point_arrival_rc(wifi_access_point_state * s, tw_bf * bf, wifi_message * m, tw_lp * lp)
{
  s->total_packets--;
  // packets coming from access point have much more power and so better snr
  tw_rand_reverse_unif(lp->rng);
  tw_rand_reverse_unif(lp->rng);

  if( bf->c1 )
    {
		s->failed_packets--;
    }


}
コード例 #7
0
ファイル: bgp-rc-router.c プロジェクト: chleemobile/rossnet
void
r_msg_open(bgp_state * state, tw_bf * bf, bgp_message * msg, tw_lp * lp)
{
	int    i;

	if (bf->c1)
	{
		for (i = 0; i < state->routes.size; i++)
		{
			tw_rand_reverse_unif(lp->id);
		}
	}

	tw_rand_reverse_unif(lp->id);
	state->stats->s_nopens--;
}
コード例 #8
0
ファイル: torus.c プロジェクト: wilseypa/ROSS
/* reverse handler code for a MPI process LP */
void mpi_event_rc_handler( mpi_process * p,
                           tw_bf * bf,
                           nodes_message * msg,
                           tw_lp * lp)
{
 switch(msg->type)
  {
     case MPI_SEND:
                {
		  if(bf->c4)
		    return;

		  if(bf->c3)
		       tw_rand_reverse_unif(lp->rng);

		    int i; 
		    for( i=0; i < num_packets; i++ )
		     {
			     tw_rand_reverse_unif(lp->rng);

			     p->available_time = msg->saved_available_time;
			     p->message_counter--;			
		     }
		    tw_rand_reverse_unif(lp->rng);
	     }
     break;

     case MPI_RECV:
		  {
			int index = floor( N_COLLECT_POINTS * ( tw_now( lp ) / g_tw_ts_end ) );
			N_finished_msgs--;
			N_finished_packets--;
			N_finished_storage[index]--;
			N_num_hops[index] -= msg->my_N_hop;

			total_time -= tw_now( lp ) - msg->travel_start_time;
			total_hops-=msg->my_N_hop;

			if(bf->c3)
			  max_latency= msg->saved_available_time;
		  }
      break;
  }
}
コード例 #9
0
ファイル: bgp-rc-router.c プロジェクト: chleemobile/rossnet
void
r_msg_keepalivetimer(bgp_state * state, tw_bf * bf, bgp_message * msg, tw_lp * lp)
{
	int		 i;

	for (i = 0; i <= state->n_interfaces; i++)
		tw_rand_reverse_unif(lp->id);

	state->stats->s_nkeepalivetimers--;
}
コード例 #10
0
ファイル: raid-controller.c プロジェクト: chleemobile/rossnet
// Reverse Event Handler
void raid_controller_eventhandler_rc( ContState* s, tw_bf* cv, MsgData* m, tw_lp* lp )
{
    int i;
    s->condition = m->rc.controller_condition;
    if( m->event_type == DISK_REPLACED || s->condition != FAILED )
    {
        s->num_rebuilds--;
        for( i = 0; i < m->rc.rng_calls; ++i )
            tw_rand_reverse_unif( lp->rng );
    }
}
コード例 #11
0
ファイル: tmr.c プロジェクト: chleemobile/rossnet
void
tmr_event_handler_rc(tmr_state * s, tw_bf * bf, tmr_message * m, tw_lp * lp)
{
	if(bf->c1)
	{
		// old timer may be NULL
		fprintf(f, "%lld: rc tmr fired at %lf\n",
			lp->gid, tw_now(lp));

		s->timer = m->old_timer;
		m->old_timer = NULL;

		return;
	}

	if(bf->c2)
	{
		if(s->timer == NULL)
		{
			s->timer = tw_timer_init(lp, m->old_time);
			m->old_time = 0.0;

			fprintf(f, "%lld: restore tmr to %lf\n", 
				lp->gid, s->timer->recv_ts);
		} else
		{
			tw_timer_reset(lp, &s->timer, m->old_time);
			m->old_time = 0.0;

			fprintf(f, "%lld: reset tmr to %lf \n",
				lp->gid, s->timer->recv_ts);
		}
	}

	tw_rand_reverse_unif(lp->rng);
	tw_rand_reverse_unif(lp->rng);

	if(bf->c3 == 1)
		tw_rand_reverse_unif(lp->rng);
}
コード例 #12
0
ファイル: tcp-router-rc.c プロジェクト: chleemobile/rossnet
void
tcp_router_forward_rc(Router_State *SV,  tw_bf *CV, Msg_Data *M, tw_lp * lp)
{  
  int nexthop_link = tcp_util_nexthop_link(lp,M->dest);
  tw_rand_reverse_unif(lp->id);

  if(CV->c1 || CV->c2)
    SV->lastsent[nexthop_link] = M->RC.rtt_time;
  else {
    /*     switch(g_routers_links[lp->id][nexthop_link].buffer_sz){
      case 12400000:
	SV->dropped_packets[0]++; 
	break;
      case 3000000:
	SV->dropped_packets[1]++; 
	break;
      case 775000:
	SV->dropped_packets[2]++;
	break;
      case 200000:
	SV->dropped_packets[3]++;
	break;
      case 60000:
	SV->dropped_packets[4]++;
	break;
      case 20000:
	SV->dropped_packets[5]++;
	break;
      case 10000:
	SV->dropped_packets[6]++;
	break;
      case 5000:
	SV->dropped_packets[7]++;
	break;

      default:
	printf("there has been error in buffer_sz %d\n",
	       g_routers_links[lp->id][nexthop_link].buffer_sz);
	exit(0);
	}*/
    SV->dropped_packets--;
  }
}
コード例 #13
0
ファイル: Intersection.c プロジェクト: laprej/ROSS-Models
void Intersection_RC_EventHandler(Intersection_State *SV, tw_bf *CV, Msg_Data *M, tw_lp *lp)
{

	enum abs_directions temp_direction;
	*(int *)CV = (int)0;

	switch(M->event_type)
	{

	case ARIVAL:

		if(M->car.x_to_go == 0 && M->car.y_to_go == 0)
		{
			SV->total_cars_finished--;
			break;
		}

		// Schedule a departure in the future
		SV->total_cars_arrived--;

		switch(M->car.current_lane)
		{
		case WEST_LEFT:
			SV->num_in_east_left--;
			break;
		case WEST_STRAIGHT:
			SV->num_in_east_straight--;
			break;
		case WEST_RIGHT:
			SV->num_in_east_right++;
			break;
		case EAST_LEFT:
			SV->num_in_west_left++;
			break;
		case EAST_STRAIGHT:
			SV->num_in_west_straight++;
			break;
		case EAST_RIGHT:
			SV->num_in_west_right++;
			break;
		case NORTH_LEFT:
			SV->num_in_south_left++;
			break;
		case NORTH_STRAIGHT:
			SV->num_in_south_straight++;
			break;
		case NORTH_RIGHT:
			SV->num_in_south_right++;
			break;
		case SOUTH_LEFT:
			SV->num_in_north_left++;
			break;
		case SOUTH_STRAIGHT:
			SV->num_in_north_straight++;
			break;
		case SOUTH_RIGHT:
			SV->num_in_north_right++;
			break;
		}

		// ts = tw_rand_exponential(lp->rng, MEAN_SERVICE);
		tw_rand_reverse_unif( lp->rng );
		break;

	case DEPARTURE:

		switch(M->car.current_lane){
		case WEST_LEFT:
			SV->num_out_west_left++;
			break;
		case WEST_STRAIGHT:
			SV->num_out_west_straight++;
			break;
		case WEST_RIGHT:
			SV->num_out_west_right++;
			break;
		case EAST_LEFT:
			SV->num_out_east_left++;
			break;
		case EAST_STRAIGHT:
			SV->num_out_east_straight++;
			break;
		case EAST_RIGHT:
			SV->num_out_east_right++;
			break;
		case NORTH_LEFT:
			SV->num_out_north_left++;
			break;
		case NORTH_STRAIGHT:
			SV->num_out_north_straight++;
			break;
		case NORTH_RIGHT:
			SV->num_out_north_right++;
			break;
		case SOUTH_LEFT:
			SV->num_out_south_left++;
			break;
		case SOUTH_STRAIGHT:
			SV->num_out_south_straight++;
			break;
		case SOUTH_RIGHT:
			SV->num_out_south_right++;
			break;
		}

		// ts = tw_rand_exponential(lp->rng, MEAN_SERVICE);
		tw_rand_reverse_unif( lp->rng );
		break;

	case DIRECTION_SELECT:


		temp_direction = M->car.current_lane;

		switch(M->car.current_lane){
		case EAST_LEFT:
			SV->num_in_east_left++;
			if(M->car.y_to_go < 0 && SV->num_out_south_straight < MAX_CARS_ON_ROAD){
				SV->num_out_south_straight --;
			}
			else if(M->car.x_to_go < 0 && SV->num_out_south_right < MAX_CARS_ON_ROAD){
				SV->num_out_south_right --;
			}
			else if(M->car.x_to_go > 0 && SV->num_out_south_left < MAX_CARS_ON_ROAD){
				SV->num_out_south_left --;
			}
			else{
				if(M->car.arrived_from == SOUTH_LEFT){
					SV->num_out_east_right--;
				}
				else if(M->car.arrived_from == EAST_STRAIGHT){
					SV->num_out_east_straight--;
				}
				else if(M->car.arrived_from == NORTH_RIGHT){
					SV->num_out_east_left--;
				}
			}
			break;
		case EAST_STRAIGHT:
			SV->num_in_east_straight++;
			if(M->car.x_to_go < 0 && SV->num_out_west_straight < MAX_CARS_ON_ROAD){
				SV->num_out_west_straight --;
			}
			else if(M->car.y_to_go < 0 && SV->num_out_west_left < MAX_CARS_ON_ROAD){
				SV->num_out_west_left --;
			}
			else if(M->car.y_to_go > 0 && SV->num_out_west_right < MAX_CARS_ON_ROAD){
				SV->num_out_west_right --;
			}
			else{
				if(M->car.arrived_from == NORTH_RIGHT){
					SV->num_out_east_left--;
				}
				else if(M->car.arrived_from == EAST_STRAIGHT){
					SV->num_out_east_straight--;
				}
				else if(M->car.arrived_from == SOUTH_LEFT){
					SV->num_out_east_right++;
				}
			}

			break;
		case EAST_RIGHT:
			SV->num_in_east_right++;
			if(M->car.y_to_go > 0 && SV->num_out_north_straight < MAX_CARS_ON_ROAD){
				SV->num_out_north_straight --;
			}
			else if(M->car.x_to_go > 0 && SV->num_out_north_right < MAX_CARS_ON_ROAD){
				SV->num_out_north_right --;
			}
			else if(M->car.x_to_go < 0 && SV->num_out_north_left < MAX_CARS_ON_ROAD){
				SV->num_out_north_left --;
			}
			else{
				if(M->car.arrived_from == SOUTH_LEFT){
					SV->num_out_east_right--;
				}
				else if(M->car.arrived_from == EAST_STRAIGHT){
					SV->num_out_east_straight--;
				}
				else if(M->car.arrived_from == NORTH_RIGHT){
					SV->num_out_east_left--;
				}
			}
			break;
		case WEST_LEFT:
			SV->num_in_west_left++;
			if(M->car.y_to_go > 0 && SV->num_out_north_straight < MAX_CARS_ON_ROAD){
				SV->num_out_north_straight --;
			}
			else if(M->car.x_to_go > 0 && SV->num_out_north_right < MAX_CARS_ON_ROAD){
				SV->num_out_north_right --;
			}
			else if(M->car.x_to_go < 0 && SV->num_out_north_left < MAX_CARS_ON_ROAD){
				SV->num_out_north_left --;
			}
			else{
				if(M->car.arrived_from == SOUTH_RIGHT){
					SV->num_out_west_left--;
				}
				else if(M->car.arrived_from == WEST_STRAIGHT){
					SV->num_out_west_straight--;
				}
				else if(M->car.arrived_from == NORTH_LEFT){
					SV->num_out_west_right--;
				}
			}
			break;
		case WEST_STRAIGHT:
			SV->num_in_west_straight++;
			if(M->car.x_to_go > 0 && SV->num_out_east_straight < MAX_CARS_ON_ROAD){
				SV->num_out_east_straight --;
			}
			else if(M->car.y_to_go > 0 && SV->num_out_east_left < MAX_CARS_ON_ROAD){
				SV->num_out_east_left --;
			}
			else if(M->car.y_to_go < 0 && SV->num_out_east_right < MAX_CARS_ON_ROAD){
				SV->num_out_east_right --;
			}
			else{
				if(M->car.arrived_from == SOUTH_RIGHT){
					SV->num_out_west_left--;
				}
				else if(M->car.arrived_from == WEST_STRAIGHT){
					SV->num_out_west_straight--;
				}
				else if(M->car.arrived_from == NORTH_LEFT){
					SV->num_out_west_right--;
				}
			}
			break;
		case WEST_RIGHT:
			SV->num_in_west_right++;
			if(M->car.y_to_go < 0 && SV->num_out_south_straight < MAX_CARS_ON_ROAD){
				SV->num_out_south_straight --;
			}
			else if(M->car.x_to_go > 0 && SV->num_out_south_left < MAX_CARS_ON_ROAD){
				SV->num_out_south_left --;
			}
			else if(M->car.x_to_go < 0 && SV->num_out_south_right < MAX_CARS_ON_ROAD){
				SV->num_out_south_right --;
			}
			else{
				if(M->car.arrived_from == SOUTH_RIGHT){
					SV->num_out_west_left--;
				}
				else if(M->car.arrived_from == WEST_STRAIGHT){
					SV->num_out_west_straight--;
				}
				else if(M->car.arrived_from == NORTH_LEFT){
					SV->num_out_west_right--;
				}
			}
			break;
		case NORTH_LEFT:
			SV->num_in_north_left++;
			if(M->car.x_to_go > 0 && SV->num_out_east_straight < MAX_CARS_ON_ROAD){
				SV->num_out_east_straight --;
			}
			else if(M->car.y_to_go > 0 && SV->num_out_east_left < MAX_CARS_ON_ROAD){
				SV->num_out_east_left --;
			}
			else if(M->car.y_to_go < 0 && SV->num_out_east_right < MAX_CARS_ON_ROAD){
				SV->num_out_east_right --;
			}
			else{
				if(M->car.arrived_from == WEST_RIGHT){
					SV->num_out_north_left--;
				}
				else if(M->car.arrived_from == NORTH_STRAIGHT){
					SV->num_out_north_straight--;
				}
				else if(M->car.arrived_from == EAST_LEFT){
					SV->num_out_north_right--;
				}
			}
			break;
		case NORTH_STRAIGHT:
			SV->num_in_north_straight++;
			if(M->car.y_to_go < 0 && SV->num_out_south_straight < MAX_CARS_ON_ROAD){
				SV->num_out_south_straight --;
			}
			else if(M->car.x_to_go > 0 && SV->num_out_south_left < MAX_CARS_ON_ROAD){
				SV->num_out_south_left --;
			}
			else if(M->car.x_to_go < 0 && SV->num_out_south_right < MAX_CARS_ON_ROAD){
				SV->num_out_south_right --;
			}
			else{
				if(M->car.arrived_from == WEST_RIGHT){
					SV->num_out_north_left--;
				}
				else if(M->car.arrived_from == NORTH_STRAIGHT){
					SV->num_out_north_straight--;
				}
				else if(M->car.arrived_from == EAST_LEFT){
					SV->num_out_north_right--;
				}
			}
			break;
		case NORTH_RIGHT:
			SV->num_in_north_right++;
			if(M->car.x_to_go < 0 && SV->num_out_west_straight < MAX_CARS_ON_ROAD){
				SV->num_out_west_straight --;
			}
			else if(M->car.y_to_go < 0 && SV->num_out_west_left < MAX_CARS_ON_ROAD){
				SV->num_out_west_left --;
			}
			else if(M->car.y_to_go > 0 && SV->num_out_west_right < MAX_CARS_ON_ROAD){
				SV->num_out_west_right --;
			}
			else{
				if(M->car.arrived_from == WEST_RIGHT){
					SV->num_out_north_left--;
				}
				else if(M->car.arrived_from == NORTH_STRAIGHT){
					SV->num_out_north_straight--;
				}
				else if(M->car.arrived_from == EAST_LEFT){
					SV->num_out_north_right--;
				}
			}
			break;
		case SOUTH_LEFT:
			SV->num_in_south_left++;
			if(M->car.x_to_go < 0 && SV->num_out_west_straight < MAX_CARS_ON_ROAD){
				SV->num_out_west_straight --;
			}
			else if(M->car.y_to_go < 0 && SV->num_out_west_left < MAX_CARS_ON_ROAD){
				SV->num_out_west_left --;
			}
			else if(M->car.y_to_go > 0 && SV->num_out_west_right < MAX_CARS_ON_ROAD){
				SV->num_out_west_right --;
			}
			else{
				if(M->car.arrived_from == WEST_LEFT){
					SV->num_out_south_right--;
				}
				else if(M->car.arrived_from == SOUTH_STRAIGHT){
					SV->num_out_south_straight--;
				}
				else if(M->car.arrived_from == EAST_RIGHT){
					SV->num_out_south_left--;
				}
			}

			break;
		case SOUTH_STRAIGHT:
			SV->num_in_south_straight++;
			if(M->car.y_to_go > 0 && SV->num_out_north_straight < MAX_CARS_ON_ROAD){
				SV->num_out_north_straight --;
			}
			else if(M->car.x_to_go < 0 && SV->num_out_north_left < MAX_CARS_ON_ROAD){
				SV->num_out_north_left --;
			}
			else if(M->car.x_to_go > 0 && SV->num_out_north_right < MAX_CARS_ON_ROAD){
				SV->num_out_north_right --;
			}
			else{
				if(M->car.arrived_from == EAST_RIGHT){
					SV->num_out_south_left--;
				}
				else if(M->car.arrived_from == SOUTH_STRAIGHT){
					SV->num_out_south_straight--;
				}
				else if(M->car.arrived_from == WEST_LEFT){
					SV->num_out_south_right--;
				}
			}
			break;
		case SOUTH_RIGHT:
			SV->num_in_south_right++;
			if(M->car.x_to_go > 0 && SV->num_out_east_straight < MAX_CARS_ON_ROAD){
				SV->num_out_east_straight --;
			}
			else if(M->car.y_to_go > 0 && SV->num_out_east_left < MAX_CARS_ON_ROAD){
				SV->num_out_east_left --;
			}
			else if(M->car.y_to_go < 0 && SV->num_out_east_right < MAX_CARS_ON_ROAD){
				SV->num_out_east_right --;
			}
			else{
				if(M->car.arrived_from == EAST_RIGHT){
					SV->num_out_south_left--;
				}
				else if(M->car.arrived_from == SOUTH_STRAIGHT){
					SV->num_out_south_straight--;
				}
				else if(M->car.arrived_from == WEST_LEFT){
					SV->num_out_south_right--;
				}
			}
			break;
		}

		// ts = tw_rand_exponential(lp->rng, MEAN_SERVICE);
		tw_rand_reverse_unif( lp->rng );
		break;
	}
}
コード例 #14
0
void nw_test_event_handler_rc(nw_state* s, tw_bf * bf, nw_message * m, tw_lp * lp)
{
        codes_workload_get_next_rc(wrkld_id, 0, (int)s->nw_id, &m->op);
        if(m->op.op_type == CODES_WK_END)
                return;

	s->total_time -= (m->op.end_time - m->op.start_time);
        switch(m->op.op_type)
        {
		case CODES_WK_SEND:
                case CODES_WK_ISEND:
		{
			s->num_sends--;
			s->send_time -= (m->op.end_time - m->op.start_time);
			num_bytes_sent -= m->op.u.send.num_bytes;
		};
		break;

		case CODES_WK_RECV:
		case CODES_WK_IRECV:
		{
			s->num_recvs--;
			s->recv_time -= (m->op.end_time - m->op.start_time);	
			num_bytes_recvd -= m->op.u.recv.num_bytes;
		}
		break;

		case CODES_WK_DELAY:
		{
			s->num_delays--;
			s->compute_time -= (m->op.end_time - m->op.start_time);
		}
		break;

		case CODES_WK_BCAST:
		case CODES_WK_ALLGATHER:
		case CODES_WK_ALLGATHERV:
		case CODES_WK_ALLTOALL:
		case CODES_WK_ALLTOALLV:
		case CODES_WK_REDUCE:
		case CODES_WK_ALLREDUCE:
		case CODES_WK_COL:
		{
			s->num_cols--;
			s->col_time -= (m->op.end_time - m->op.start_time);
		}
		break;

		case CODES_WK_WAIT:
		{
			s->num_wait--;
			s->wait_time -= (m->op.end_time - m->op.start_time);
		}
		break;

		case CODES_WK_WAITALL:
		{
			s->num_waitall--;
			s->wait_time -= (m->op.end_time - m->op.start_time);
		}
		break;

		case CODES_WK_WAITSOME:
		{
			s->num_waitsome--;
			s->wait_time -= (m->op.end_time - m->op.start_time);
		}
		break;

		case CODES_WK_WAITANY:
		{
			s->num_waitany--;
			s->wait_time -= (m->op.end_time - m->op.start_time);
		}
		break;

		default:
		{
			printf("\n Invalid op type %d", m->op.op_type);
			return;
		}
	}
	tw_rand_reverse_unif(lp->rng);		
}
コード例 #15
0
ファイル: bgp-rc-router.c プロジェクト: chleemobile/rossnet
void
r_msg_update(bgp_state * state, tw_bf * bf, bgp_message * msg, tw_lp * lp)
{
	int             i;

	if (bf->c6)
	{
		for (i = 0; i < msg->rev_num_neighbors; i++)
		{
			tw_rand_reverse_unif(lp->id);
		}
	}

	if (bf->c1)
	{							// reverse add
		tw_memory      *as_path;

		if (bf->c2)
		{
			if (bf->c3)
			{
				tw_memoryq_delete_any(&state->routes, msg->this_route);
				// state->routes.remove(msg->this_bgp_route);
				// state->routes.pop_back(); // makes it non-deterministic
				if (bf->c4)
				{
					tw_memory      *jim = tw_memory_free_rc(lp, g_bgp_fd_rtes);
					bgp_route      *rjim = tw_memory_data(jim);;
					tw_memoryq_push(&state->routes, jim);
					// state->bgp_routes.push_back(msg->erased_route);
					bzero(&rjim->as_path, sizeof(rjim->as_path));

					while (msg->rc_asp)
					{
						tw_memoryq_push(&rjim->as_path,
										tw_memory_free_rc(lp, g_bgp_fd_asp));
						msg->rc_asp--;
					}
				}
			}
		}
		while ((as_path =
				tw_memoryq_pop(&((bgp_route *) msg->this_route->data)->
							   as_path)))
			tw_event_memory_get_rc(lp, as_path, g_bgp_fd_asp);

		state->stats->s_nupdateadds--;
	} else
	{							// reverse remove
		if (bf->c5)
		{
			int             i = msg->rc_asp;
			tw_memory      *it4;
			bgp_route      *r;

			msg->this_route = tw_memory_free_rc(lp, g_bgp_fd_rtes);

			while (i)
			{
				tw_event_memory_get_rc(lp, tw_memory_free_rc(lp, g_bgp_fd_asp),
									   g_bgp_fd_asp);
				i--;
			}

			it4 = tw_memory_free_rc(lp, g_bgp_fd_rtes);
			r = tw_memory_data(it4);

			bzero(&r->as_path, sizeof(r->as_path));
			while (msg->rc_asp)
			{
				tw_memoryq_push(&r->as_path,
								tw_memory_free_rc(lp, g_bgp_fd_asp));
				msg->rc_asp--;
			}

			tw_memoryq_push(&state->routes, it4);

			// state->bgp_routes.push_back(msg->erased_bgp_route);
		}

		state->stats->s_nupdateremoves--;
	}

	tw_event_memory_get_rc(lp, msg->this_route, g_bgp_fd_rtes);

	msg->this_route = NULL;
}
コード例 #16
0
// Reverse Intersection Event Handler that is called when a Time Warp is initiated:
void traffic_light_intersection_reverse_eventhandler(
        intersection_state* SV,
        tw_bf* CV,
        message_data* M,
        tw_lp* LP) {

    tw_lpid next_intersection;
    tw_stime queue_wait_time;

    // Unknown time warp bit field:
    *(int*) CV = (int) 0;

    // Handle the events defined in the "events" enumeration, but in reverse:
    switch(M->event_type) {
            
    case LIGHT_CHANGE:
                    
        // Check if the traffic is permitted north-south (green on north and south lights):
        if (SV->traffic_direction == NORTH_SOUTH_LEFT) {

            // Traffic was permitted NORTH_SOUTH_LEFT; switch permitted traffic to EAST_WEST:
            SV->traffic_direction = EAST_WEST;

            // Update the timers on the lights
            SV->east_west_green_until = M->saved_green_until;

        }
        else if(SV->traffic_direction == NORTH_SOUTH) {
            
            // Switch permitted traffic to NORTH_SOUTH_LEFT:
            SV->traffic_direction = NORTH_SOUTH_LEFT;

            // Update the timers on the lights
            SV->north_south_left_green_until = M->saved_green_until;

        } else if (SV->traffic_direction == EAST_WEST_LEFT) {

            // Switch permitted traffic to NORTH_SOUTH:
            SV->traffic_direction = NORTH_SOUTH;

            // Update the timers on the lights
            SV->north_south_green_until = M->saved_green_until;

        } else if (SV->traffic_direction == EAST_WEST) {

            // Switch permitted traffic to EAST_WEST_LEFT:
            SV->traffic_direction = EAST_WEST_LEFT;

            // Update the timers on the lights
            SV->east_west_left_green_until = M->saved_green_until;

        }

        break;
    
    case CAR_ARRIVES:

        // Car reached its destination:
        if(M->car.y_to_go == 0 && M->car.x_to_go == 0) {
            SV->total_cars_finished--;
            g_total_time -= (M->car.end_time - M->car.start_time);
            printf("Car unfinished!\n");
            break;
        }
   
        // Increment the total number of cars in this intersection:
        SV->total_cars_arrived--;

        // follows the y path first

        // The car is too far south; have the car head up north:
        if(M->car.y_to_go > 0) {
            SV->num_cars_south--;
            M->car.y_to_go++;
        }
        else if(M->car.y_to_go < 0) {
            SV->num_cars_north--;
            M->car.y_to_go--;
        }
        else if(M->car.y_to_go == 0) {

            //TODO: figure out how to reverse has_turned
            //TODO: also, much of this might be wrong...

            if(M->car.has_turned) {

                if(M->car.x_to_go > 0) {
                    SV->num_cars_west--;
                    M->car.x_to_go++;
                }
                else if(M->car.x_to_go < 0) {
                    SV->num_cars_east--;
                    M->car.x_to_go--;
                }

            }

            else {

                if(M->car.x_to_go > 0) {

                    if(M->car.y_to_go_original > 0) {
                        SV->num_cars_south--;
                    } else {
                        SV->num_cars_north_left--;
                    }

                    M->car.x_to_go++;
                }
                else if(M->car.x_to_go < 0) {

                    if(M->car.y_to_go_original > 0) {
                        SV->num_cars_south_left--;
                    } else {
                        SV->num_cars_north--;
                    }

                    M->car.x_to_go--;
                }

            }
        }

        tw_rand_reverse_unif(LP->rng);

        break;

    }
    

} /** END FUNCTION intersection_reverse_eventhandler **/
コード例 #17
0
ファイル: torus.c プロジェクト: wilseypa/ROSS
/* reverse handler code for a node */
void node_rc_handler(nodes_state * s, tw_bf * bf, nodes_message * msg, tw_lp * lp)
{
  switch(msg->type)
    {
       case GENERATE:
		   {
		     int i;
		     for(i=0; i < num_chunks; i++)
  		        tw_rand_reverse_unif(lp->rng);	
		   }
	break;
	
	case ARRIVAL:
		   {
		     if(bf->c2)
		     {
			int i;
		        int index = floor(N_COLLECT_POINTS*(tw_now(lp)/g_tw_ts_end));
	  	        for(i = 0; i < 2 * N_dims; i++)
              	            N_queue_depth[index]-=s->buffer[i][0];
		    }
		    
 		    msg->my_N_hop--;
  		    tw_rand_reverse_unif(lp->rng);
		    tw_rand_reverse_unif(lp->rng);
		    int next_dim = msg->source_dim;
		    int next_dir = msg->source_direction;

		    s->next_credit_available_time[next_dir + ( next_dim * 2 )][0] = msg->saved_available_time;
		   }
	break;	

	case SEND:
		 {
	            tw_rand_reverse_unif(lp->rng);
		    if(bf->c3)
		     {
                        int next_dim = msg->saved_src_dim;
			int next_dir = msg->saved_src_dir;

			s->next_link_available_time[next_dir + ( next_dim * 2 )][0] = msg->saved_available_time;
			
			s->buffer[ next_dir + ( next_dim * 2 ) ][ 0 ] --;
			
                        if(bf->c1)
			  {
			    int index = floor( N_COLLECT_POINTS * ( tw_now( lp ) / g_tw_ts_end ) );
			    N_generated_storage[ index ]--;
			  }
		    }
		 }
	break;

        case WAIT:
		{
		     s->wait_count-=1;
		     int loc = s->wait_count;
		     s->waiting_list[loc].dim = -1;
		     s->waiting_list[loc].dir = -1;
		     s->waiting_list[loc].packet = NULL;
		}
        break;

       case CREDIT:
		{
		  s->buffer[ msg->source_direction + ( msg->source_dim * 2 ) ][  0 ]++;
		  if(bf->c3)
		  {
		     tw_rand_reverse_unif(lp->rng);
		     int loc = msg->wait_loc, i;
                     int max_count = s->wait_count;
		     if(s->wait_count >= WAITING_PACK_COUNT)
			printf("\n Exceeded maximum count!!! ");
		     for(i = max_count; i > loc ; i--)  
                      {
		  	  s->waiting_list[i].dim = s->waiting_list[i-1].dim;
			  s->waiting_list[i].dir = s->waiting_list[i-1].dir;
			  s->waiting_list[i].packet = s->waiting_list[i-1].packet;
                      }
		     s->waiting_list[loc].dim = msg->source_dim;
		     s->waiting_list[loc].dir = msg->source_direction;
		     s->waiting_list[loc].packet = msg;		 
		     s->wait_count = s->wait_count + 1;
		 }
              }
       break;
     }
}
コード例 #18
0
ファイル: AllToAll.c プロジェクト: chleemobile/rossnet
void
rc_event_handler(nodes_state * s, tw_bf * bf, nodes_message * msg, tw_lp * lp)
{
  int index = floor(N_COLLECT_POINTS*(tw_now(lp)/g_tw_ts_end));
  switch(msg->type)
    {
    case GENERATE:
      N_generated_storage[index]--;
      s->packet_counter--;
      tw_rand_reverse_unif(lp->rng);
      //tw_rand_reverse_unif(lp->rng);
      break;
    case ARRIVAL:
      s->next_available_time = msg->saved_available_time;
      //tw_rand_reverse_unif(lp->rng);      


      msg->my_N_hop--;
      s->N_wait_to_be_processed--;
      
      msg->queueing_times -= s->N_wait_to_be_processed;

      /*      if ( bf->c2 == 0 )
	      {
	      N_dropped--;
	      N_dropped_storage[index]--;
	      }
      else
      {
      */
      //s->next_available_time = msg->saved_available_time;
      s->node_queue_length[msg->source_direction][msg->source_dim]--;
      //s->queue_length_sum -=
      //s->node_queue_length[msg->source_direction][msg->source_dim];
      msg->my_N_queue-=s->node_queue_length[msg->source_direction][msg->source_dim];
      
      //s->next_available_time = msg->saved_available_time;
      /*      if ( bf->c6 == 0 )
	{
	  N_finished--;
	  N_finished_storage[index]--;
	  total_time -= tw_now(lp) - msg->travel_start_time;
	  total_hops -= msg->my_N_hop;
	}
      */
      
      //}
      break;
    case SEND:
      break;
    case PROCESS:
     if ( bf->c3 == 0 )
	{
	  N_finished--;
	  N_finished_storage[index]--;
	  total_time -= tw_now(lp) - msg->travel_start_time;
	  total_hops -= msg->my_N_hop;
	  total_queue_length -= msg->my_N_queue;
	  //event_queue_length -= msg->queue_length;
	  queueing_times_sum -= msg->queueing_times;
	}
      s->node_queue_length[msg->source_direction][msg->source_dim]++;
      s->N_wait_to_be_processed++;
      break;
    }
}