示例#1
0
static int
send_begin(tw_pe *me)
{
  int changed = 0;

  while (posted_sends.cur < send_buffer)
    {
      tw_event *e = tw_eventq_peek(&outq);
      tw_node	*dest_node = NULL;

      unsigned id = posted_sends.cur;

#if ROSS_MEMORY
      tw_event *tmp_prev = NULL;

      tw_lp *tmp_lp = NULL;

      tw_memory *memory = NULL;
      tw_memory *m = NULL;

      char *buffer = NULL;

      size_t mem_size = 0;

      unsigned position = 0;
#endif

      if (!e)
	break;

      if(e == me->abort_event)
	tw_error(TW_LOC, "Sending abort event!");

      dest_node = tw_net_onnode((*e->src_lp->type->map)
				((tw_lpid) e->dest_lp));

      //if(!e->state.cancel_q)
	//e->event_id = (tw_eventid) ++me->seq_num;

      e->send_pe = (tw_peid) g_tw_mynode;
      e->send_lp = e->src_lp->gid;

#if ROSS_MEMORY
      // pack pointers
      tmp_prev = e->prev;
      tmp_lp = e->src_lp;

      // delete when working
      e->src_lp = NULL;

      memory = NULL;
      if(e->memory)
	{
	  memory = e->memory;
	  e->memory = (tw_memory *) tw_memory_getsize(me, memory->fd);
	  e->prev = (tw_event *) memory->fd;
	  mem_size = (size_t) e->memory;
	}

      buffer = posted_sends.buffers[id];
      memcpy(&buffer[position], e, g_tw_event_msg_sz);
      position += g_tw_event_msg_sz;

      // restore pointers
      e->prev = tmp_prev;
      e->src_lp = tmp_lp;

      m = NULL;
      while(memory)
	{
	  m = memory->next;

	  if(m)
	    {
	      memory->next = (tw_memory *)
		tw_memory_getsize(me, m->fd);
	      memory->fd = m->fd;
	    }

	  if(position + mem_size > TW_MEMORY_BUFFER_SIZE)
	    tw_error(TW_LOC, "Out of buffer space!");

	  memcpy(&buffer[position], memory, mem_size);
	  position += mem_size;

	  memory->nrefs--;
	  tw_memory_unshift(e->src_lp, memory, memory->fd);

	  if(NULL != (memory = m))
	    mem_size = tw_memory_getsize(me, memory->fd);
	}

      e->memory = NULL;

      if (MPI_Isend(buffer,
		    EVENT_SIZE(e),
		    MPI_BYTE,
		    *dest_node,
		    EVENT_TAG,
		    MPI_COMM_ROSS,
		    &posted_sends.req_list[id]) != MPI_SUCCESS) {
	return changed;
      }
#else
      if (MPI_Isend(e,
		    (int)EVENT_SIZE(e),
		    MPI_BYTE,
		    (int)*dest_node,
		    EVENT_TAG,
		    MPI_COMM_ROSS,
		    &posted_sends.req_list[id]) != MPI_SUCCESS) {
	return changed;
      }
#endif

      tw_eventq_pop(&outq);
      e->state.owner = e->state.cancel_q
	? TW_net_acancel
	: TW_net_asend;

      posted_sends.event_list[id] = e;
      posted_sends.cur++;
      me->s_nwhite_sent++;

      changed = 1;
    }
  return changed;
}
示例#2
0
int
tw_socket_send_event(tw_event * event, tw_peid dest_peid)
{
	tw_net_node	*node;
	tw_kp		*kp;
	tw_lp		*src_lp;
	//tw_lp		*dest_lp;

#ifdef ROSS_MEMORY_LIB
	tw_memory	*memory;
	tw_memory	*m;
#endif

	tw_event	*temp_prev;

	int             rv;
	int		send_fd;
	size_t		mem_size;

	mem_size = 0;

	/*
	 * Save the lp pointers into temp vars and set lp pointers to lp->ids 
	 */
	src_lp = event->src_lp;
	//dest_lp = event->dest_lp;
	temp_prev = event->prev;

	kp = src_lp->kp;

	event->src_lp = (tw_lp *) src_lp->gid;

	// dest_lp contains LP global id
	//event->dest_lp = (tw_lp *) dest_lp->id;

	/*
	 * Store the sizeof the next memory buffer and the recv'r must figure
	 * that a memory buffer of that size is following the event.. then
	 * each successive memory buffer will also have the sizeof a 
	 * following mem buffer until all are sent (memory->prev = 0)
	 */
#ifdef ROSS_MEMORY_LIB
	memory = NULL;
	if(event->memory)
	{
		memory = event->memory;

		event->memory = (tw_memory *) 
			tw_memory_getsize(kp, (tw_fd) memory->prev);
		event->prev = (tw_event *) memory->prev;
		mem_size = (size_t) event->memory;
	}
#endif

	node = g_tw_net_node[src_lp->pe->id];
	send_fd = node->servers[dest_peid];
	rv = tw_socket_send(send_fd, (char *) event, sizeof(tw_event) + g_tw_msg_sz, 100);

	if (rv != sizeof(tw_event) + g_tw_msg_sz)
		tw_error(TW_LOC, "Did not send full event! (%d of %d)",
				 rv, sizeof(tw_event) + g_tw_msg_sz);

	/*
	 * Send the event's memory buffers
	 */
#ifdef ROSS_MEMORY_LIB
	m = NULL;
	while(memory)
	{
		m = memory->next;

		if(m)
		{
			memory->next = (tw_memory *) 
				tw_memory_getsize(kp, (tw_fd) m->prev);
			memory->prev = (tw_memory *) m->prev;
		}

		rv = tw_socket_send(send_fd, (char *) memory, mem_size, 100);

#if VERIFY_SOCKET_TCP
printf("%d: sending mem buf of size %d on ev %f \n", src_lp->id, mem_size, event->recv_ts);
#endif

		if(rv != mem_size)
			tw_error(TW_LOC,
				"Did not send full memory buffer! (%d of %d)",
				rv, mem_size);

		/* We will not need these mme bufs any longer on this side */
		tw_memory_unshift(src_lp, memory, (tw_fd) memory->prev);

		memory = m;

		if(memory)
			mem_size = tw_memory_getsize(src_lp, (tw_fd) memory->prev);
	}
#endif

	/*
	 * Restore the event's lp pointers
	 */
	event->src_lp = src_lp;
	//event->dest_lp = dest_lp;
	event->prev = temp_prev;

#ifdef ROSS_MEMORY_LIB
	event->memory = NULL;
#endif

#if VERIFY_SOCKET_TCP
	if (event->state.cancel_q)
		printf
			("SEND CANCEL: dest %d %d: ts=%f sn=%d src %d %d\n",
			 event->dest_lp->pe->id,
			 event->dest_lp->id, event->recv_ts,
			 event->seq_num,
			 event->src_lp->pe->id,
			 event->src_lp->id);
	else
		printf
			("SEND NORMAL: dest %d %d: ts=%f sn=%d src %d %d\n",
			 event->dest_lp->pe->id,
			 event->dest_lp->id, event->recv_ts,
			 event->seq_num,
			 event->src_lp->pe->id,
			 event->src_lp->id);
#endif

	return rv;
}