Changeset 3767:9bfa5f13666f in roaraudio


Ignore:
Timestamp:
05/04/10 18:57:58 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added select like feature for VIOs

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio_select.h

    r3653 r3767  
    3939#include "libroar.h" 
    4040 
    41 #define ROAR_VIO_SELECT_NONE        0x00 
    42 #define ROAR_VIO_SELECT_READ        0x01 
    43 #define ROAR_VIO_SELECT_WRITE       0x02 
    44 #define ROAR_VIO_SELECT_EXCEPT      0x04 
     41#define ROAR_VIO_SELECT_NONE          0x00 
     42#define ROAR_VIO_SELECT_READ          0x01 
     43#define ROAR_VIO_SELECT_WRITE         0x02 
     44#define ROAR_VIO_SELECT_EXCEPT        0x04 
     45 
     46#define ROAR_VIO_SELECT_ACTION_NONE   0x00 
     47#define ROAR_VIO_SELECT_ACTION_SELECT 0x01 
     48#define ROAR_VIO_SELECT_ACTION_POLL   0x02 
     49#define ROAR_VIO_SELECT_ACTION_VIOS   0x04 /* VIO Select */ 
     50 
     51#define ROAR_VIO_SELECT_SETVIO(d,v,q) ((d)->vio = (v)); ((d)->fh = -1); ((d)->eventsq = (q)) 
     52#define ROAR_VIO_SELECT_SETSYSIO(d,f,q) ((d)->vio = NULL); ((d)->fh = (f)); ((d)->eventsq = (q)) 
    4553 
    4654struct roar_vio_select_internal { 
     
    5159struct roar_vio_select { 
    5260 struct roar_vio_calls * vio; 
     61 int fh; 
    5362 int eventsq; 
    5463 int eventsa; 
     64 union { 
     65  int    si; 
     66  void * vp; 
     67 } ud; 
    5568 struct roar_vio_select_internal internal; 
    5669}; 
     
    6073}; 
    6174 
     75struct roar_vio_selecttv { 
     76 int64_t sec; 
     77 int32_t nsec; 
     78}; 
     79 
     80ssize_t roar_vio_select(struct roar_vio_select * vios, size_t len, struct roar_vio_selecttv * rtv, struct roar_vio_selectctl * ctl); 
     81 
    6282#endif 
    6383 
  • libroar/vio_select.c

    r3517 r3767  
    3636#include "libroar.h" 
    3737 
     38ssize_t roar_vio_select(struct roar_vio_select * vios, size_t len, struct roar_vio_selecttv * rtv, struct roar_vio_selectctl * ctl) { 
     39 struct timeval tv; 
     40 size_t i; 
     41 int max_fh = -1; 
     42 int ret; 
     43 fd_set rfds, wfds, efds; 
     44 
     45 ROAR_DBG("roar_vio_select(vios=%p, len=%llu, rtv=%p, ctl=%p) = ?", vios, (long long unsigned int)len, rtv, ctl); 
     46 
     47 if ( len == 0 ) { 
     48  ROAR_DBG("roar_vio_select(vios=%p, len=%llu, rtv=%p, ctl=%p) = 0", vios, (long long unsigned int)len, rtv, ctl); 
     49  return 0; 
     50 } 
     51 
     52 if ( vios == NULL ) { 
     53  ROAR_DBG("roar_vio_select(vios=%p, len=%llu, rtv=%p, ctl=%p) = -1", vios, (long long unsigned int)len, rtv, ctl); 
     54  return -1; 
     55 } 
     56 
     57 // pepaer interl structs: 
     58 for (i = 0; i < len; i++) { 
     59  if ( vios[i].fh == -1 ) { 
     60   vios[i].internal.action = ROAR_VIO_SELECT_ACTION_NONE; 
     61 
     62   if ( vios[i].eventsq & ROAR_VIO_SELECT_READ ) { 
     63    if ( roar_vio_ctl(vios[i].vio, ROAR_VIO_CTL_GET_SELECT_READ_FH, &(vios[i].internal.fh[0])) == -1 ) { 
     64     vios[i].internal.action |= ROAR_VIO_SELECT_ACTION_VIOS; 
     65     vios[i].internal.fh[0]   = -1; 
     66    } else { 
     67     vios[i].internal.action |= ROAR_VIO_SELECT_ACTION_SELECT; 
     68    } 
     69   } 
     70 
     71   if ( vios[i].eventsq & ROAR_VIO_SELECT_WRITE ) { 
     72    if ( roar_vio_ctl(vios[i].vio, ROAR_VIO_CTL_GET_SELECT_WRITE_FH, &(vios[i].internal.fh[1])) == -1 ) { 
     73     vios[i].internal.action |= ROAR_VIO_SELECT_ACTION_VIOS; 
     74     vios[i].internal.fh[1]   = -1; 
     75    } else { 
     76     vios[i].internal.action |= ROAR_VIO_SELECT_ACTION_SELECT; 
     77    } 
     78   } 
     79 
     80   if ( vios[i].eventsq & ROAR_VIO_SELECT_EXCEPT ) { 
     81    if ( roar_vio_ctl(vios[i].vio, ROAR_VIO_CTL_GET_SELECT_FH, &(vios[i].internal.fh[2])) == -1 ) { 
     82     vios[i].internal.action |= ROAR_VIO_SELECT_ACTION_VIOS; 
     83     vios[i].internal.fh[2]   = -1; 
     84    } else { 
     85     vios[i].internal.action |= ROAR_VIO_SELECT_ACTION_SELECT; 
     86    } 
     87   } 
     88  } else { 
     89   vios[i].internal.action = ROAR_VIO_SELECT_ACTION_SELECT; 
     90   vios[i].internal.fh[0]  = vios[i].fh; 
     91   vios[i].internal.fh[1]  = vios[i].fh; 
     92   vios[i].internal.fh[2]  = vios[i].fh; 
     93  } 
     94 } 
     95 
     96 // check: 
     97 for (i = 0; i < len; i++) { 
     98  if ( !( vios[i].internal.action == 0 || vios[i].internal.action == ROAR_VIO_SELECT_ACTION_SELECT ) ) { 
     99   // we currently do not support non-select selects. 
     100   // TODO: Fix this. 
     101   ROAR_DBG("roar_vio_select(vios=%p, len=%llu, rtv=%p, ctl=%p) = -1", vios, (long long unsigned int)len, rtv, ctl); 
     102   return -1; 
     103  } 
     104 } 
     105 
     106 // prepaer fdsets: 
     107 FD_ZERO(&rfds); 
     108 FD_ZERO(&wfds); 
     109 FD_ZERO(&efds); 
     110 
     111 for (i = 0; i < len; i++) { 
     112  if ( vios[i].eventsq & ROAR_VIO_SELECT_READ ) { 
     113   FD_SET(vios[i].internal.fh[0], &rfds); 
     114   if ( vios[i].internal.fh[0] > max_fh ) 
     115    max_fh = vios[i].internal.fh[0]; 
     116  } 
     117 
     118  if ( vios[i].eventsq & ROAR_VIO_SELECT_WRITE ) { 
     119   FD_SET(vios[i].internal.fh[1], &wfds); 
     120   if ( vios[i].internal.fh[1] > max_fh ) 
     121    max_fh = vios[i].internal.fh[1]; 
     122  } 
     123 
     124  if ( vios[i].eventsq & ROAR_VIO_SELECT_EXCEPT ) { 
     125   FD_SET(vios[i].internal.fh[2], &efds); 
     126   if ( vios[i].internal.fh[2] > max_fh ) 
     127    max_fh = vios[i].internal.fh[2]; 
     128  } 
     129 } 
     130 
     131 // the the select: 
     132  if ( rtv == NULL ) { 
     133   tv.tv_sec  = 1024; 
     134   tv.tv_usec = 0; 
     135  } else { 
     136   tv.tv_sec  = rtv->sec; 
     137   tv.tv_usec = rtv->nsec / 1000; 
     138  } 
     139 
     140 ret = select(max_fh + 1, &rfds, &wfds, &efds, &tv); 
     141 
     142 // ret == -1 -> Error 
     143 // ret ==  0 -> No data 
     144 if ( ret < 1 ) 
     145  return ret; 
     146 
     147 // set eventsa: 
     148 for (i = 0; i < len; i++) { 
     149  vios[i].eventsa = ROAR_VIO_SELECT_NONE; 
     150 
     151  if ( vios[i].eventsq & ROAR_VIO_SELECT_READ ) 
     152   if ( FD_ISSET(vios[i].internal.fh[0], &rfds) ) 
     153    vios[i].eventsa |= ROAR_VIO_SELECT_READ; 
     154 
     155  if ( vios[i].eventsq & ROAR_VIO_SELECT_WRITE ) 
     156   if ( FD_ISSET(vios[i].internal.fh[1], &wfds) ) 
     157    vios[i].eventsa |= ROAR_VIO_SELECT_WRITE; 
     158 
     159  if ( vios[i].eventsq & ROAR_VIO_SELECT_EXCEPT ) 
     160   if ( FD_ISSET(vios[i].internal.fh[2], &efds) ) 
     161    vios[i].eventsa |= ROAR_VIO_SELECT_EXCEPT; 
     162 } 
     163 
     164 ROAR_DBG("roar_vio_select(vios=%p, len=%llu, rtv=%p, ctl=%p) = %lli", vios, (long long unsigned int)len, rtv, ctl, (long long int)ret); 
     165 return ret; 
     166} 
     167 
    38168//ll 
Note: See TracChangeset for help on using the changeset viewer.