Edit

kc3-lang/angle/src/common/tls.h

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2020-09-20 21:59:24
    Hash : cb286073
    Message : Use c++ thread_local for current thread. This solves a race condition using the global context. Sadly we can't use an unprotected variable safely because it can be written/read from multiple threads doing MakeCurrent. Has about a 2 ns regression when tested in Linux/Release per call. "null" benchmark test went from 27 -> 29 ns/iteration. Fixes a TSAN warning that popped up in angle_end2end_tests. Test: DrawCallPerfBenchmark.Run/vulkan_null Test: EGLContextASANTest.DestroyContextInUse/ES3_Vulkan Bug: b/168744561 Change-Id: Ic56f3faae81c1087b942a3cfc0e011b9ab439e0f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2419641 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/common/tls.h
  • //
    // Copyright 2014 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // tls.h: Simple cross-platform interface for thread local storage.
    
    #ifndef COMMON_TLS_H_
    #define COMMON_TLS_H_
    
    #include "common/angleutils.h"
    #include "common/platform.h"
    
    namespace gl
    {
    class Context;
    }
    
    #ifdef ANGLE_PLATFORM_WINDOWS
    
    // TLS does not exist for Windows Store and needs to be emulated
    #    ifdef ANGLE_ENABLE_WINDOWS_UWP
    #        ifndef TLS_OUT_OF_INDEXES
    #            define TLS_OUT_OF_INDEXES static_cast<DWORD>(0xFFFFFFFF)
    #        endif
    #        ifndef CREATE_SUSPENDED
    #            define CREATE_SUSPENDED 0x00000004
    #        endif
    #    endif
    typedef DWORD TLSIndex;
    #    define TLS_INVALID_INDEX (TLS_OUT_OF_INDEXES)
    #elif defined(ANGLE_PLATFORM_POSIX)
    #    include <errno.h>
    #    include <pthread.h>
    #    include <semaphore.h>
    typedef pthread_key_t TLSIndex;
    #    define TLS_INVALID_INDEX (static_cast<TLSIndex>(-1))
    #else
    #    error Unsupported platform.
    #endif
    
    // TODO(kbr): for POSIX platforms this will have to be changed to take
    // in a destructor function pointer, to allow the thread-local storage
    // to be properly deallocated upon thread exit.
    TLSIndex CreateTLSIndex();
    bool DestroyTLSIndex(TLSIndex index);
    
    bool SetTLSValue(TLSIndex index, void *value);
    void *GetTLSValue(TLSIndex index);
    
    #endif  // COMMON_TLS_H_