| 316 | return occurrence |
| 317 | |
| 318 | def _recorder_worker(self): |
| 319 | while True: |
| 320 | occ = self._record_queue.get() |
| 321 | if occ is None: |
| 322 | self._record_queue.task_done() |
| 323 | break |
| 324 | |
| 325 | self._accepting_new.wait() |
| 326 | with self._recorded_new: |
| 327 | occ.timeline = self |
| 328 | occ.timestamp = timestamp.current() |
| 329 | occ.index = next(self._index_iter) |
| 330 | |
| 331 | if self._last is None: |
| 332 | self._beginning = occ |
| 333 | self._last = occ |
| 334 | else: |
| 335 | assert self._last.timestamp <= occ.timestamp |
| 336 | occ.previous = self._last |
| 337 | self._last._next = occ |
| 338 | self._last = occ |
| 339 | |
| 340 | self._recorded_new.notify_all() |
| 341 | self._record_queue.task_done() |
| 342 | |
| 343 | for exp, callback in tuple(self._listeners): |
| 344 | if exp == occ: |
| 345 | callback(occ) |
| 346 | |
| 347 | def mark(self, id, block=True): |
| 348 | occ = Occurrence("mark", id) |