def child_run(self):
		from dbus.mainloop.glib import DBusGMainLoop
		from gi.repository import GLib
		import dbus

		def excepthook(t, v, tb, hook=sys.excepthook):
			time.sleep(0.2) # to dump parent/child tracebacks non-interleaved
			return hook(t, v, tb)
		sys.excepthook = excepthook

		self._dbus, self._glib = dbus, GLib

		# Disable stdin/stdout buffering
		self.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
		self.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0)

		self.stdout.write('ready\n') # wait for main process to get ready, signal readiness
		log.debug('DBus signal handler subprocess started')

		DBusGMainLoop(set_as_default=True)
		self.loop, self.loop_exc = GLib.MainLoop(), None

		self.bus = self._get_bus() # XXX: bus gone handling
		self.core = self.bus.get_object(object_path='/org/pulseaudio/core1')

		rpc_buffer = deque()
		flags = fcntl.fcntl(self.stdin, fcntl.F_GETFL)
		fcntl.fcntl(self.stdin, fcntl.F_SETFL, flags | os.O_NONBLOCK)
		self._glib.io_add_watch( self.stdin,
			self._glib.PRIORITY_DEFAULT,
			self._glib.IO_IN | self._glib.IO_ERR | self._glib.IO_HUP,
			ft.partial(self._rpc_call, rpc_buffer) )

		signals = ['NewSink', 'SinkRemoved', 'NewPlaybackStream', 'PlaybackStreamRemoved']
		if self.handle_proplist_updates: signals.append('Stream.PropertyListUpdated')
		for sig_name in signals:
			sig_name_last = sig_name.rsplit('.')[-1]
			self.bus.add_signal_receiver(
				ft.partial(self._relay_signal, sig_name=sig_name_last),
				sig_name_last, path_keyword='src_obj_path' )
			self.core.ListenForSignal(dbus_join('pulse', [sig_name]), self._dbus.Array(signature='o'))
		self._glib.unix_signal_add(self._glib.PRIORITY_HIGH, signal.SIGTERM, self.loop.quit)
		try: self.loop.run()
		except __HOLE__: pass
		# XXX: wrapper loop here, in case of *clean* loop.quit() yet dbus not being dead
		if self.loop_exc: raise self.loop_exc[0], self.loop_exc[1], self.loop_exc[2]
dataset/ETHPy150Open mk-fg/pulseaudio-mixer-cli/pa-mixer-mk2.py/PAMixerDBusBridge.child_run