Skip to content
  • Eric Engestrom's avatar
    egl/display: make platform detection thread-safe · c2ed6935
    Eric Engestrom authored and Andres Gomez's avatar Andres Gomez committed
    Imagine there are 2 threads that both call _eglGetNativePlatform()
    simultaneously:
    - thread 1 completes the first "if (native_platform ==
      _EGL_INVALID_PLATFORM)" check and is preempted to do something else
    - thread 2 executes the whole function, does "native_platform =
      _EGL_NATIVE_PLATFORM" and just before returning it's preempted
    - thread 1 wakes up and calls _eglGetNativePlatformFromEnv() which
      returns _EGL_INVALID_PLATFORM because no env vars are set, updates
      native_platform and then gets preempted again
    - thread 2 wakes up and returns wrong _EGL_INVALID_PLATFORM
    
    Solve this by doing the detection in a local var and only overwriting
    the global one at the end, if no other thread has updated it since.
    
    This means the platform detected in the thread might not be the platform
    returned by the function, but this is a different issue that will need
    to be discussed when this becomes possible.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101252
    
    
    Signed-off-by: Eric Engestrom's avatarEric Engestrom <eric@engestrom.ch>
    Reviewed-by: default avatarGrazvydas Ignotas <notasas@gmail.com>
    Acked-by: default avatarEmil Velikov <emil.l.velikov@gmail.com>
    (cherry picked from commit 311c0916)
    c2ed6935