From: Andre Noll Date: Tue, 11 Jun 2013 18:41:49 +0000 (+0200) Subject: Merge branch 't/stdin_stdout_fixes' X-Git-Tag: v0.4.13~31 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=d46a0767b58654f15f16406cf99296287bd0d534;hp=--cc Merge branch 't/stdin_stdout_fixes' Was cooking for almost a month. b99b4a stdin/stdout: Restore fd flags on shutdown. Conflicts: stdin.c stdout.c --- d46a0767b58654f15f16406cf99296287bd0d534 diff --cc NEWS index a93fb2e3,f323df1d..07481964 --- a/NEWS +++ b/NEWS @@@ -2,12 -2,6 +2,14 @@@ 0.?.? (to be announced) "spectral gravity" ------------------------------------------ + - UTF8 support for para_gui and the mp3 audio format handler. + - Scheduler improvements and fixes. + - The obsolete gettimeofday() function has been replaced + by clock_gettime() on systems which support it. + - Speed and usability improvements for para_gui. ++ - para_client now restores the fd flags of stdin and stdout ++ on shutdown + ----------------------------------------- 0.4.12 (2012-12-20) "volatile relativity" ----------------------------------------- diff --cc stdin.c index b25a0ba0,08bc1f9a..20b9250e --- a/stdin.c +++ b/stdin.c @@@ -65,10 -67,16 +65,16 @@@ static int stdin_post_select(struct sch if (ret < 0) goto err; if (ret == 0) - return; + return 0; sz = btr_pool_get_buffer(sit->btrp, &buf); if (sz == 0) - return; + return 0; + if (sit->must_set_nonblock_flag) { + ret = mark_fd_nonblocking(STDIN_FILENO); + if (ret < 0) + goto err; + sit->must_set_nonblock_flag = false; + } /* * Do not use the maximal size to avoid having only a single buffer * reference for the whole pool. This is bad because if that single @@@ -79,11 -87,13 +85,13 @@@ if (n > 0) btr_add_output_pool(sit->btrp, n, sit->btrn); if (ret >= 0) - return; + return 0; err: btr_remove_node(&sit->btrn); + /* Revert to blocking mode if necessary. */ + fcntl(STDIN_FILENO, F_SETFL, sit->fd_flags); //btr_pool_free(sit->btrp); - t->error = ret; + return ret; } /** diff --cc stdout.c index abf3d06f,0cf4876d..cf33bf6d --- a/stdout.c +++ b/stdout.c @@@ -58,10 -60,16 +58,16 @@@ static int stdout_post_select(struct sc if (ret < 0) goto out; if (ret == 0) - return; + return 0; if (!FD_ISSET(STDOUT_FILENO, &s->wfds)) - return; + return 0; + if (sot->must_set_nonblock_flag) { + ret = mark_fd_nonblocking(STDOUT_FILENO); + if (ret < 0) + goto out; + sot->must_set_nonblock_flag = false; + } for (;;) { sz = btr_next_buffer(btrn, &buf); if (sz == 0) @@@ -72,9 -80,12 +78,12 @@@ btr_consume(btrn, ret); } out: - if (ret < 0) + if (ret < 0) { btr_remove_node(&sot->btrn); + /* Revert to blocking mode if necessary. */ + fcntl(STDOUT_FILENO, F_SETFL, sot->fd_flags); + } - t->error = ret; + return ret; } /** * Initialize a stdout task structure with default values.