def _child_readline(self, wait_for_cid=None, one_signal=False, init_line=False):
		ts0 = mono_time()
		while True:
			if wait_for_cid and wait_for_cid in self.child_calls:
				# XXX: check for errors indicating that dbus is gone here?
				line_ts, line = self.child_calls.pop(wait_for_cid)
				if random.random() < self.child_calls_cleanup[0]:
					ts_deadline = mono_time() - self.child_calls_cleanup[1]
					for k, (line_ts, line) in self.child_calls.items():
						if line_ts < ts_deadline: self.child_calls.pop(k, None)
				return line

			try:
				line = self._child_readline_poll().strip()
				if not line: # likely a break on signal, shouldn't be too often
					if mono_time() - ts0 > self.proxy_call_timeout:
						raise PAMixerIPCError('Call timeout: {:.2f}s'.format(self.proxy_call_timeout))
					continue
			except PAMixerIPCError as err:
				raise PAMixerIPCError(
					'IPC error while waiting for event {!r} (line_buff: {!r}): {}'\
					.format(dict(wait_for_cid=wait_for_cid, one_signal=one_signal), self.line_buff, err) )

			if init_line:
				assert line.strip() == 'ready', repr(line)
				break
			self.line_debug.append(('rpc-parent(raw) << %r', line))
			if self.log_pipes: log.debug(*self.line_debug[-1])
			try: line = json.loads(line)
			except __HOLE__ as err: # json module error doesn't provide the actual data
				raise ValueError('Failed to parse line ({}): {!r}', err, line)
			if line['t'] == 'signal':
				self.child_sigs.append(line)
				if one_signal: break
			elif line['t'] in ['call_result', 'call_error']:
				self.child_calls[line['cid']] = mono_time(), line
dataset/ETHPy150Open mk-fg/pulseaudio-mixer-cli/pa-mixer-mk2.py/PAMixerDBusBridge._child_readline