Exemplo n.º 1
0
int send(const char* filename)
{
	int flagid = 0;
	int master_sender = is_sender(&flagid);
	if (!master_sender)
		exit(EXIT_SUCCESS);

	int shmemid = 0;
	void* smbuf = get_memptr( FILE_NAME_SHMEM_ATTACH,
				  BUF_SIZE + sizeof(long),
				  &shmemid);
	CHECK(smbuf != (void*)-1, "Failed to get shared memory pointer");
	long* nbytes_to_save = smbuf + BUF_SIZE;
	*nbytes_to_save = 0;

	CHECK(smbuf != (void*)-1, "Failed to get memory pointer");

	int semid = get_sems(  FILE_NAME_SHMEM_ATTACH, 5);
	CHECK(semid != -1, "Failed to get semaphors id");

	int cond = snd_protect_connection(semid);
	CHECK(cond == 0, "Failed to set up protected connection");

	int fileid = open(filename, O_RDONLY);
	CHECK(fileid != -1, "Failed to open file to send");

	struct sembuf rcv_activate[2] = {
		{RCV_MUTEX,   1, 0},
		{RCV_CONNECT, 1, 0}
		};
	cond = semop(semid, rcv_activate, 2);
	CHECK(cond != -1, "Failed to connect to receiver");

	struct sembuf mutexes[3] = {
		{SND_MUTEX,  1, 0},
		{RCV_MUTEX, -1, 0},
		{SND_MUTEX,  0, 0}
	};
	int nbytes = 0;
	while ((nbytes = read(fileid, smbuf, BUF_SIZE)) > 0)
	{
		*nbytes_to_save = nbytes;
		OUT("# Sending\n");
		cond = semop(semid, &mutexes[0], 1);
		cond = semop(semid, &mutexes[1], 1);
		cond = semop(semid, &mutexes[2], 1);
		CHECK(cond == 0, "# Failed to set semaphors");
		OUT("# Package sent\n");
	}

	OUT("# Finishing...\n");
	*nbytes_to_save = -1;
	cond = semop(semid, &mutexes[0], 1);
	cond = semop(semid, &mutexes[1], 1);
	cond = semop(semid, &mutexes[2], 1);
	OUT("# Finished!\n");

	cond = snd_clean(semid, fileid, shmemid, flagid);
	exit(EXIT_SUCCESS);
}
void* Chip_to_Chip_Direct_to_Hypervisor_Zero_Copy_Endpoint::data_buf_for(int i) {
  return &(all_data_bufs)[(2 * i + (is_sender() ? 1 : 0)) *  data_buf_size];
}