Changeset 3767:9bfa5f13666f in roaraudio
- Timestamp:
- 05/04/10 18:57:58 (14 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/libroar/vio_select.h
r3653 r3767 39 39 #include "libroar.h" 40 40 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)) 45 53 46 54 struct roar_vio_select_internal { … … 51 59 struct roar_vio_select { 52 60 struct roar_vio_calls * vio; 61 int fh; 53 62 int eventsq; 54 63 int eventsa; 64 union { 65 int si; 66 void * vp; 67 } ud; 55 68 struct roar_vio_select_internal internal; 56 69 }; … … 60 73 }; 61 74 75 struct roar_vio_selecttv { 76 int64_t sec; 77 int32_t nsec; 78 }; 79 80 ssize_t roar_vio_select(struct roar_vio_select * vios, size_t len, struct roar_vio_selecttv * rtv, struct roar_vio_selectctl * ctl); 81 62 82 #endif 63 83 -
libroar/vio_select.c
r3517 r3767 36 36 #include "libroar.h" 37 37 38 ssize_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 38 168 //ll
Note: See TracChangeset
for help on using the changeset viewer.