def run(self):
        """ Plan:

        * We read into a fresh instance of IO obj until marker encountered.
        * When marker is detected, we attach that IO obj to "results" array
          and signal the calling code (through threading.Event flag) that
          results are available
        * repeat until .stop() was called on the thread.
        """
        marker = ['' for l in self._stream_delimiter]  # '' is there on purpose
        tf = self._obj[0](*self._obj[1], **self._obj[2])
        while not self._stop:
            l = os.read(self._r, 1)
            marker.pop(0)
            marker.append(l)
            if marker != self._stream_delimiter:
                tf.write(unicode(l))
            else:
                # chopping off the marker first
                tf.seek(self._stream_roll_back_len, 2)
                tf.truncate()
                tf.seek(0)
                self._data_unoccupied.wait(5)  # seriously, how much time is needed to get your items off the stack?
                self._data.append(tf)
                self._data_available.set()
                tf = self._obj[0](*self._obj[1], **self._obj[2])
        os.close(self._r)
        tf.close()
        del tf