def _child_readline_poll(self):
		'child.stdout.readline() that also reacts to signals.'
		# One shitty ipc instead of another... good job!
		line = None
		while True:
			if '\n' in self.line_buff: line, self.line_buff = self.line_buff.split('\n', 1)
			if line is not None: return line
			try: evs = self.poller.poll(self.poll_timeout) or list()
			except IOError as err:
				if err.errno != errno.EINTR: raise
				return ''
			except __HOLE__: # ^C in console, probably because UI hangs
				raise PAMixerIPCError('Poll call interrupted')
			if not evs:
				log.debug( 'Parent poll timeout event,'
					' likely a race condition bug (timeout: %.1fs)', self.poll_timeout )
				line = ''
			for fd, ev in evs:
				if fd == self.wakeup_fd.fileno():
					try: self.wakeup_fd.read(1)
					except IOError as err:
						if err.errno != errno.EAGAIN: raise
						log.debug('Got EAGAIN from'
							' wakeup_fd returned by poll(), this should not happen')
					if line is None: line = '' # make sure to break the loop here
				else:
					if not ev & select.EPOLLIN: raise IOError('Poll returned error event: {}'.format(ev))
					try: chunk = self._child.stdout.read(2**20)
					except IOError as err:
						if err.errno != errno.EAGAIN: raise
						continue
					self.line_buff += chunk
dataset/ETHPy150Open mk-fg/pulseaudio-mixer-cli/pa-mixer-mk2.py/PAMixerDBusBridge._child_readline_poll