docs: def DeviceReadThread(hid_device):
    """Binds a device to the thread's run loop, then starts the run loop.
  
    Args:
      hid_device: The MacOsHidDevice object
  
    The HID manager requires a run loop to handle Report reads. This thread
    function serves that purpose.
    """
  
    # Schedule device events with run loop
    hid_device.run_loop_ref = cf.CFRunLoopGetCurrent()
    if not hid_device.run_loop_ref:
      logger.error('Failed to get current run loop')
      return
  
    iokit.IOHIDDeviceScheduleWithRunLoop(hid_device.device_handle,
                                         hid_device.run_loop_ref,
                                         K_CF_RUNLOOP_DEFAULT_MODE)
  
    # Run the run loop
    run_loop_run_result = K_CF_RUN_LOOP_RUN_TIMED_OUT
    while (run_loop_run_result == K_CF_RUN_LOOP_RUN_TIMED_OUT or
           run_loop_run_result == K_CF_RUN_LOOP_RUN_HANDLED_SOURCE):
      run_loop_run_result = cf.CFRunLoopRunInMode(
          K_CF_RUNLOOP_DEFAULT_MODE,
          1000,  # Timeout in seconds
          False)  # Return after source handled
  
    # log any unexpected run loop exit
    if run_loop_run_result != K_CF_RUN_LOOP_RUN_STOPPED:
      logger.error('Unexpected run loop exit code: %d', run_loop_run_result)
  
    # Unschedule from run loop
    iokit.IOHIDDeviceUnscheduleFromRunLoop(hid_device.device_handle,
                                           hid_device.run_loop_ref,
                                           K_CF_RUNLOOP_DEFAULT_MODE)