Exemple #1
0
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));
    }
}
Exemple #2
0
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;
}
Exemple #3
0
void RecvRepeat(ArgStruct *p, int *rpt)
{
    /* Only child calls RecvRepeat */
    pipe_recv(pipe_to_child, rpt, sizeof(*rpt));
}
Exemple #4
0
void RecvTime(ArgStruct *p, double *t)
{
    /* Only parent calls RecvTime */
    pipe_recv(pipe_to_parent, t, sizeof(*t));
}
Exemple #5
0
/* 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;
}