Changeset 1271:7ff82047e706 in roaraudio
- Timestamp:
- 02/27/09 16:28:44 (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vio_cmd.c
r1269 r1271 99 99 struct roar_vio_cmd_state * state = (struct roar_vio_cmd_state *)vio->inst; 100 100 101 if ( state->writer.opened ) { 102 if ( state->writer.out != -1 ) { 103 close(state->writer.out); 104 state->writer.out = -1; 105 } 106 } 107 108 roar_vio_cmd_sync(vio); 109 101 110 if ( state->reader.opened ) 102 111 roar_vio_cmd_wait(&(state->reader)); … … 210 219 char * tp = NULL; 211 220 size_t tlen = 0; 221 int nonblock = state->options & ROAR_VIO_CMD_OPTS_NONBLOCK; 222 int in, out; 212 223 213 224 ROAR_DBG("roar_vio_cmd_read(*) = ?"); … … 224 235 } 225 236 237 in = state->reader.in; 238 out = state->reader.out; 239 226 240 while (done < count) { 227 if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK) {241 if ( nonblock ) { 228 242 tv.tv_sec = 0; 229 243 tv.tv_usec = 1; … … 236 250 FD_ZERO(wfhs); 237 251 238 FD_SET( state->reader.in, rfhs);239 240 if ( state->reader.out != -1 ) {241 FD_SET( state->reader.out, wfhs);252 FD_SET(in, rfhs); 253 254 if ( out != -1 ) { 255 FD_SET(out, wfhs); 242 256 } 243 257 244 258 #ifdef DEBUG 245 if ( FD_ISSET( state->reader.in, rfhs) ) {259 if ( FD_ISSET(in, rfhs) ) { 246 260 ROAR_DBG("roar_vio_cmd_read(*): reader set in fh group"); 247 261 } 248 262 #endif 249 263 250 max_fh = state->reader.in > state->reader.out ? state->reader.in : state->reader.out;264 max_fh = in > out ? in : out; 251 265 ROAR_DBG("roar_vio_cmd_read(*): max_fh=%i", max_fh); 252 266 … … 255 269 256 270 ROAR_DBG("roar_vio_cmd_read(*): select(*) = %i", ret); 257 ROAR_DBG("roar_vio_cmd_read(*): reader=%i, writer=%i", state->reader.in, state->reader.out);271 ROAR_DBG("roar_vio_cmd_read(*): reader=%i, writer=%i", in, out); 258 272 259 273 if ( ret > 0 ) { 260 if ( FD_ISSET( state->reader.in, rfhs) ) {274 if ( FD_ISSET(in, rfhs) ) { 261 275 ROAR_DBG("roar_vio_cmd_read(*): event on reader"); 262 276 263 if ( (ret = read( state->reader.in, buf+done, count-done)) == -1 )277 if ( (ret = read(in, buf+done, count-done)) == -1 ) 264 278 break; 265 279 … … 270 284 } 271 285 272 if ( state->reader.out != -1 && FD_ISSET(state->reader.out, wfhs) ) {286 if ( out != -1 && FD_ISSET(out, wfhs) ) { 273 287 ROAR_DBG("roar_vio_cmd_read(*): event on writer"); 274 288 … … 281 295 282 296 if ( tlen ) { 283 if ( (ret = write( state->reader.out, tp, tlen)) > 0 ) {297 if ( (ret = write(out, tp, tlen)) > 0 ) { 284 298 tlen -= ret; 285 299 tp += ret; 286 300 } 287 301 } else { 288 close( state->reader.out);289 state->reader.out = -1;302 close(out); 303 state->reader.out = out = -1; 290 304 } 291 305 } 292 306 } 293 307 294 if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK)308 if ( nonblock ) 295 309 break; 296 310 } … … 306 320 ssize_t roar_vio_cmd_write (struct roar_vio_calls * vio, void *buf, size_t count) { 307 321 struct roar_vio_cmd_state * state = (struct roar_vio_cmd_state *)vio->inst; 322 fd_set rfhs[1], wfhs[1]; 323 struct timeval tv; 324 size_t done = 0; 325 int max_fh; 326 int ret; 327 char tbuf[ROAR_VIO_CMD_BUFSIZE]; 328 int nonblock = state->options & ROAR_VIO_CMD_OPTS_NONBLOCK; 329 int in, out; 308 330 309 331 if ( !state->writer.opened ) { … … 318 340 } 319 341 342 in = state->writer.in; 343 out = state->writer.out; 344 345 if ( buf == NULL ) { // we are requested to sync 346 if ( in != -1 ) { 347 ret = 1; 348 done = 0; 349 while (ret > 0) { 350 tv.tv_sec = 0; 351 tv.tv_usec = done ? 1 : 500000; // half a sec 352 353 done++; 354 355 FD_ZERO(rfhs); 356 FD_SET(in, rfhs); 357 358 if ( select(in+1, rfhs, NULL, NULL, &tv) < 1 ) 359 break; 360 361 ret = read(in, tbuf, ROAR_VIO_CMD_BUFSIZE); 362 363 if ( roar_vio_write(state->next, tbuf, ret) != ret ) 364 return -1; 365 } 366 } 367 368 return 0; 369 } 370 371 while (done < count) { 372 if ( nonblock ) { 373 tv.tv_sec = 0; 374 tv.tv_usec = 1; 375 } else { 376 tv.tv_sec = 3600; 377 tv.tv_usec = 0; 378 } 379 380 FD_ZERO(rfhs); 381 FD_ZERO(wfhs); 382 383 FD_SET(out, wfhs); 384 385 if ( in != -1 ) { 386 FD_SET(in, rfhs); 387 } 388 389 max_fh = in > out ? in : out; 390 391 if ( (ret = select(max_fh + 1, rfhs, wfhs, NULL, &tv)) == -1 ) 392 return -1; 393 394 if ( ret > 0 ) { 395 if ( FD_ISSET(out, wfhs) ) { 396 397 if ( (ret = write(out, buf+done, count-done)) == -1 ) 398 break; 399 400 if ( ret == 0 ) 401 break; 402 403 done += ret; 404 } 405 if ( in != -1 && FD_ISSET(in, wfhs) ) { 406 if ( (ret = read(in, tbuf, ROAR_VIO_CMD_BUFSIZE)) == -1 ) { /* error case: can not read on reader -> EOF */ 407 close(in); 408 state->writer.in = in = -1; 409 break; 410 } 411 412 if ( roar_vio_write(state->next, tbuf, ret) != ret ) 413 return -1; 414 } 415 } 416 417 if ( nonblock ) 418 break; 419 } 320 420 321 421 return -1;
Note: See TracChangeset
for help on using the changeset viewer.