! @brief Process event objects and decide when to send to event sink.
        
        This method handles the logic to associate a timestamp event with the prior other
        event. A list of pending events is built up until either a timestamp or overflow event
        is generated, at which point all pending events are flushed to the event sink. If a
        timestamp is seen, the timestamp of all pending events is set prior to flushing.

def _send_event(self, event):
        """! @brief Process event objects and decide when to send to event sink.
        
        This method handles the logic to associate a timestamp event with the prior other
        event. A list of pending events is built up until either a timestamp or overflow event
        is generated, at which point all pending events are flushed to the event sink. If a
        timestamp is seen, the timestamp of all pending events is set prior to flushing.
        """
        flush = False
        
        # Handle merging data trace events.
        if self._merge_data_trace_events(event):
            return
        
        if isinstance(event, events.TraceTimestamp):
            for ev in self._pending_events:
                ev.timestamp = event.timestamp
            flush = True
        else:
            self._pending_events.append(event)
            if isinstance(event, events.TraceOverflow):
                flush = True
        
        if flush:
            self._flush_events()