void Sync(ArgStruct *p) { int bogus; /* Parent */ if (p->tr) { pipe_send(pipe_to_child, &bogus, sizeof(bogus)); pipe_recv(pipe_to_parent, &bogus, sizeof(bogus)); } /* Child */ else { pipe_recv(pipe_to_child, &bogus, sizeof(bogus)); pipe_send(pipe_to_parent, &bogus, sizeof(bogus)); } }
static int process_cmd_pipe(rh_aout_api_itf self) { struct sles_api_instance * api_instance = (struct sles_api_instance *)self; struct io_command_struct cmd; for(;;) { int e = pipe_recv(self, &cmd); if(e < 0) return -1; if(e == 0) return 0; switch(cmd.command) { case EXIT_COMMAND: api_instance->thread = 0; break; case STOP_COMMAND: e = stop(self, cmd.asmp_itf); break; case PLAY_COMMAND: e = play(self, cmd.asmp_itf); break; case LOOP_COMMAND: e = loop(self, cmd.asmp_itf); break; case SYNC_COMMAND: e = recv_sync_cmd(self, cmd.asmp_itf); break; case CONSUMED_BUFFER: e = recv_consumed_buffer_cmd(self, cmd.asmp_itf); break; default: break; } // free reference created for the command pipe. if( cmd.asmp_itf ) (*cmd.asmp_itf)->close(&cmd.asmp_itf); // if(cmd.command == EXIT_COMMAND) pthread_exit(NULL); if(e != 0) return -1; } return 0; }
void RecvRepeat(ArgStruct *p, int *rpt) { /* Only child calls RecvRepeat */ pipe_recv(pipe_to_child, rpt, sizeof(*rpt)); }
void RecvTime(ArgStruct *p, double *t) { /* Only parent calls RecvTime */ pipe_recv(pipe_to_parent, t, sizeof(*t)); }
/* Receive data from a socket, possibly including Mach ports. */ error_t S_socket_recv (struct sock_user *user, mach_port_t *addr, mach_msg_type_name_t *addr_type, int in_flags, char **data, size_t *data_len, mach_port_t **ports, mach_msg_type_name_t *ports_type, size_t *num_ports, char **control, size_t *control_len, int *out_flags, size_t amount) { error_t err; unsigned flags; struct pipe *pipe; void *source_addr = NULL; if (!user) return EOPNOTSUPP; if (in_flags & MSG_OOB) /* BSD local sockets don't support OOB data. */ return EINVAL; /* XXX */ /* Fill in the pipe FLAGS from any corresponding ones in IN_FLAGS. */ flags = in_flags & MSG_PEEK; err = sock_acquire_read_pipe (user->sock, &pipe); if (err == EPIPE) /* EOF */ { *data_len = 0; if (num_ports) *num_ports = 0; if (control_len) *control_len = 0; } else if (!err) { err = pipe_recv (pipe, user->sock->flags & PFLOCAL_SOCK_NONBLOCK, &flags, &source_addr, data, data_len, amount, control, control_len, ports, num_ports); pipe_release_reader (pipe); } if (!err) /* Setup mach ports for return. */ { *addr_type = MACH_MSG_TYPE_MAKE_SEND; *ports_type = MACH_MSG_TYPE_MOVE_SEND; if (source_addr) { *addr = ports_get_right (source_addr); ports_port_deref (source_addr); /* since get_right has one too. */ } else *addr = MACH_PORT_NULL; } *out_flags = 0; return err; }