On 20.02.2018 22:34, Raman Shishniou wrote: > On 02/20/2018 11:04 PM, Georg Chini wrote: >> On 20.02.2018 19:49, Raman Shishniou wrote: >>> On 02/20/2018 07:02 PM, Georg Chini wrote: >>>> On 20.02.2018 16:38, Raman Shyshniou wrote: >>>>> Currently the pipe-source will remain running even if no >>>>> writer is connected and therefore no data is produced. >>>>> This patch adds the autosuspend=<bool> option to prevent this. >>>>> Source will stay suspended if no writer is connected. >>>>> This option is enabled by default. >>>>> --- >>>>> src/modules/module-pipe-source.c | 279 +++++++++++++++++++++++++++++---------- >>>>> 1 file changed, 212 insertions(+), 67 deletions(-) >>>>> >>> I think I need post a simple pseudo code of new thread loop because it >>> was completely rewritten. There are too many changes in one patch. >>> It can be difficult to see the whole picture of new main loop. >> Well, I applied the patch and looked at the result. I still don't like the approach. >> >> I would propose this: >> >> auto_suspended = false; >> revents = 0 >> events = POLLIN >> >> for (;;) { >> >> /* This is the part that is run when the source is opened >> * or auto suspended >> if (SOURCE_IS_OPENED(source) || auto_suspended) { >> >> /* Check if we wake up from user suspend */ >> if (corkfd >= 0 && !auto_suspended) { >> len = 0 >> close pipe for writing >> } >> >> /* We received POLLIN or POLLHUP or both */ >> if (revents) { >> >> /* Read data from pipe */ >> len = read data >> >> /* Got data, post it */ >> if (len > 0) { >> if (auto_suspend) { >> send unsuspend message >> auto_suspend = false >> } >> post data > We cannot post data here because source still suspended. Sending resume message is not enough > to immediately resume the source. We need to wait several poll runs until it will be resumed. > (source->thread_info.state changed in this thread, i.e. during poll run). But we will see > POLLIN and/or POLLHUP each run if we don't remove pipe fd from polling. Why do we have to wait? The source will be unsuspended on the next rtpollrun. I do not see why we cannot already push data. Or does something get lost?