Changeset 1257:0822da400485 in roaraudio


Ignore:
Timestamp:
02/27/09 02:58:17 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

wrote a reader for vio cmd, fixed a bug forking at open even with ROAR_VIO_CMD_OPTS_ON_DEMAND

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio_cmd.h

    r1256 r1257  
    4141#define ROAR_VIO_CMD_OPTS_NONBLOCK  0x01 
    4242#define ROAR_VIO_CMD_OPTS_ON_DEMAND 0x02 
     43 
     44#define ROAR_VIO_CMD_BUFSIZE        1024 
    4345 
    4446struct roar_vio_cmd_child { 
  • libroar/vio_cmd.c

    r1256 r1257  
    7878 calls->inst = (void*) state; 
    7979 
    80  if ( reader != NULL ) 
    81   if ( roar_vio_cmd_fork(&(state->reader)) == -1 ) 
    82    return roar_vio_cmd_close(calls); 
    83  
    84  if ( writer != NULL ) 
    85   if ( roar_vio_cmd_fork(&(state->writer)) == -1 ) 
    86    return roar_vio_cmd_close(calls); 
     80 if ( !(options & ROAR_VIO_CMD_OPTS_ON_DEMAND) ) { 
     81  if ( reader != NULL ) 
     82   if ( roar_vio_cmd_fork(&(state->reader)) == -1 ) 
     83    return roar_vio_cmd_close(calls); 
     84 
     85  if ( writer != NULL ) 
     86   if ( roar_vio_cmd_fork(&(state->writer)) == -1 ) 
     87    return roar_vio_cmd_close(calls); 
     88 } 
    8789 
    8890 return 0; 
     
    195197ssize_t roar_vio_cmd_read    (struct roar_vio_calls * vio, void *buf, size_t count) { 
    196198 struct roar_vio_cmd_state * state = (struct roar_vio_cmd_state *)vio->inst; 
     199 fd_set rfhs[1], wfhs[1]; 
     200 struct timeval tv; 
     201 size_t done = 0; 
     202 int max_fh; 
     203 int ret; 
     204 char   tbuf[ROAR_VIO_CMD_BUFSIZE]; 
     205 char * tp   = NULL; 
     206 size_t tlen = 0; 
    197207 
    198208 if ( !state->reader.opened ) { 
     
    207217 } 
    208218 
    209  return -1; 
     219 while (done < count) { 
     220  if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK ) { 
     221   tv.tv_sec  =    0; 
     222   tv.tv_usec =    1; 
     223  } else { 
     224   tv.tv_sec  = 3600; 
     225   tv.tv_usec =    0; 
     226  } 
     227 
     228  FD_ZERO(rfhs); 
     229  FD_ZERO(wfhs); 
     230 
     231  FD_SET(state->reader.in,  rfhs); 
     232  FD_SET(state->reader.out, wfhs); 
     233 
     234  max_fh = state->reader.in > state->reader.out ? state->reader.in : state->reader.out; 
     235 
     236  if ( (ret = select(max_fh + 1, rfhs, wfhs, rfhs, &tv)) == -1 ) 
     237   return -1; 
     238 
     239  if ( ret > 0 ) { 
     240   if ( FD_ISSET(state->reader.in, rfhs) ) { 
     241    if ( (ret = read(state->reader.in, buf+done, count-done)) == -1 ) 
     242     break; 
     243 
     244    if ( ret == 0 ) 
     245     break; 
     246 
     247    done += ret; 
     248   } 
     249 
     250   if ( FD_ISSET(state->reader.out, wfhs) ) { 
     251    if ( !tlen ) { 
     252     tp = tbuf; 
     253     if ( (tlen = roar_vio_read(state->next, tp, ROAR_VIO_CMD_BUFSIZE)) == -1 ) 
     254      tlen = 0; 
     255    } 
     256 
     257    if ( tlen ) { 
     258     if ( (ret = write(state->reader.out, tp, tlen)) > 0 ) { 
     259      tlen -= ret; 
     260      tp   += ret; 
     261     } 
     262    } 
     263   } 
     264  } 
     265 
     266  if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK ) 
     267   break; 
     268 } 
     269 
     270 if ( tlen ) { /* we have some data to write to the child... */ 
     271  // TODO: try to write it out... 
     272  return -1; 
     273 } 
     274 
     275 return done; 
    210276} 
    211277 
     
    235301 if ( state == ROAR_SOCKET_BLOCK ) 
    236302  self->options -= ROAR_VIO_CMD_OPTS_NONBLOCK; 
     303 
     304 roar_vio_nonblock(self->next, state); // this should help, but may not nessessery. 
    237305 
    238306 return 0; 
Note: See TracChangeset for help on using the changeset viewer.