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]; }