This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 95d429b7def [pick](branch-2.1) pick #41891 (#41929)
95d429b7def is described below

commit 95d429b7def31003066b54d35db8f98706129343
Author: Xinyi Zou <zouxiny...@gmail.com>
AuthorDate: Wed Oct 16 13:59:46 2024 +0800

    [pick](branch-2.1) pick #41891 (#41929)
    
    pick #41891
---
 thirdparty/download-thirdparty.sh                  |   3 +-
 .../patches/brpc-1.4.0-no-pthread_mutex-hook.patch | 419 +++++++++++++++++++++
 2 files changed, 421 insertions(+), 1 deletion(-)

diff --git a/thirdparty/download-thirdparty.sh 
b/thirdparty/download-thirdparty.sh
index 1215bacf069..758a179c0f0 100755
--- a/thirdparty/download-thirdparty.sh
+++ b/thirdparty/download-thirdparty.sh
@@ -394,7 +394,8 @@ if [[ "${BRPC_SOURCE}" == 'brpc-1.4.0' ]]; then
     cd "${TP_SOURCE_DIR}/${BRPC_SOURCE}"
     if [[ ! -f "${PATCHED_MARK}" ]]; then
         for patch_file in "${TP_PATCH_DIR}"/brpc-*; do
-            patch -p1 <"${patch_file}"
+            echo "patch ${patch_file}"
+            patch -p1 --ignore-whitespace <"${patch_file}"
         done
         touch "${PATCHED_MARK}"
     fi
diff --git a/thirdparty/patches/brpc-1.4.0-no-pthread_mutex-hook.patch 
b/thirdparty/patches/brpc-1.4.0-no-pthread_mutex-hook.patch
new file mode 100644
index 00000000000..d44884a5fb3
--- /dev/null
+++ b/thirdparty/patches/brpc-1.4.0-no-pthread_mutex-hook.patch
@@ -0,0 +1,419 @@
+diff --git a/src/brpc/builtin/hotspots_service.cpp 
b/src/brpc/builtin/hotspots_service.cpp
+index c7577320..a5575b39 100644
+--- a/src/brpc/builtin/hotspots_service.cpp
++++ b/src/brpc/builtin/hotspots_service.cpp
+@@ -760,8 +760,7 @@ static void DoProfiling(ProfilingType type,
+         ProfilerStop();
+     } else if (type == PROFILING_CONTENTION) {
+         if (!bthread::ContentionProfilerStart(prof_name)) {
+-            os << "Another profiler (not via /hotspots/contention) is 
running, "
+-                "try again later" << (use_html ? "</body></html>" : "\n");
++            os << "Contention profiler has been disabled by doris\n";
+             os.move_to(resp);
+             
cntl->http_response().set_status_code(HTTP_STATUS_SERVICE_UNAVAILABLE);
+             return NotifyWaiters(type, cntl, view);
+@@ -855,6 +854,12 @@ static void StartProfiling(ProfilingType type,
+         enabled = IsHeapProfilerEnabled();
+     }
+     const char* const type_str = ProfilingType2String(type);
++    if (type == PROFILING_CONTENTION) {
++        os << "Error: " << type_str << " profiler is disabled by doris.\n";
++        os.move_to(cntl->response_attachment());
++        
cntl->http_response().set_status_code(HTTP_STATUS_SERVICE_UNAVAILABLE);
++        return;
++    }
+
+ #if defined(OS_MACOSX)
+     if (!has_GOOGLE_PPROF_BINARY_PATH()) {
+diff --git a/src/brpc/builtin/pprof_service.cpp 
b/src/brpc/builtin/pprof_service.cpp
+index eba71377..48fa5560 100644
+--- a/src/brpc/builtin/pprof_service.cpp
++++ b/src/brpc/builtin/pprof_service.cpp
+@@ -188,7 +188,7 @@ void PProfService::contention(
+         return;
+     }
+     if (!bthread::ContentionProfilerStart(prof_name)) {
+-        cntl->SetFailed(EAGAIN, "Another profiler is running, try again 
later");
++        cntl->SetFailed(EAGAIN, "Contention profiler has been disabled by 
doris");
+         return;
+     }
+     if (bthread_usleep(sleep_sec * 1000000L) != 0) {
+diff --git a/src/bthread/mutex.cpp b/src/bthread/mutex.cpp
+index 3d38ef93..aad189bc 100644
+--- a/src/bthread/mutex.cpp
++++ b/src/bthread/mutex.cpp
+@@ -305,6 +305,8 @@ static int64_t get_nconflicthash(void*) {
+
+ // Start profiling contention.
+ bool ContentionProfilerStart(const char* filename) {
++    LOG(ERROR) << "Contention profiler is disabled by doris.";
++    return false;
+     if (filename == NULL) {
+         LOG(ERROR) << "Parameter [filename] is NULL";
+         return false;
+@@ -364,77 +366,79 @@ make_contention_site_invalid(bthread_contention_site_t* 
cs) {
+     cs->sampling_range = 0;
+ }
+
+-// Replace pthread_mutex_lock and pthread_mutex_unlock:
+-// First call to sys_pthread_mutex_lock sets sys_pthread_mutex_lock to the
+-// real function so that next calls go to the real function directly. This
+-// technique avoids calling pthread_once each time.
+-typedef int (*MutexOp)(pthread_mutex_t*);
+-int first_sys_pthread_mutex_lock(pthread_mutex_t* mutex);
+-int first_sys_pthread_mutex_unlock(pthread_mutex_t* mutex);
+-static MutexOp sys_pthread_mutex_lock = first_sys_pthread_mutex_lock;
+-static MutexOp sys_pthread_mutex_unlock = first_sys_pthread_mutex_unlock;
+-static pthread_once_t init_sys_mutex_lock_once = PTHREAD_ONCE_INIT;
+-
+-// dlsym may call malloc to allocate space for dlerror and causes contention
+-// profiler to deadlock at boostraping when the program is linked with
+-// libunwind. The deadlock bt:
+-//   #0  0x00007effddc99b80 in __nanosleep_nocancel () at 
../sysdeps/unix/syscall-template.S:81
+-//   #1  0x00000000004b4df7 in butil::internal::SpinLockDelay(int volatile*, 
int, int) ()
+-//   #2  0x00000000004b4d57 in SpinLock::SlowLock() ()
+-//   #3  0x00000000004b4a63 in tcmalloc::ThreadCache::InitModule() ()
+-//   #4  0x00000000004aa2b5 in tcmalloc::ThreadCache::GetCache() ()
+-//   #5  0x000000000040c6c5 in (anonymous 
namespace)::do_malloc_no_errno(unsigned long) [clone.part.16] ()
+-//   #6  0x00000000006fc125 in tc_calloc ()
+-//   #7  0x00007effdd245690 in _dlerror_run 
(operate=operate@entry=0x7effdd245130 <dlsym_doit>, 
args=args@entry=0x7fff483dedf0) at dlerror.c:141
+-//   #8  0x00007effdd245198 in __dlsym (handle=<optimized out>, 
name=<optimized out>) at dlsym.c:70
+-//   #9  0x0000000000666517 in bthread::init_sys_mutex_lock () at 
bthread/mutex.cpp:358
+-//   #10 0x00007effddc97a90 in pthread_once () at 
../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S:103
+-//   #11 0x000000000066649f in bthread::first_sys_pthread_mutex_lock 
(mutex=0xbaf880 <_ULx86_64_lock>) at bthread/mutex.cpp:366
+-//   #12 0x00000000006678bc in pthread_mutex_lock_impl (mutex=0xbaf880 
<_ULx86_64_lock>) at bthread/mutex.cpp:489
+-//   #13 pthread_mutex_lock (__mutex=__mutex@entry=0xbaf880 <_ULx86_64_lock>) 
at bthread/mutex.cpp:751
+-//   #14 0x00000000004c6ea1 in _ULx86_64_init () at x86_64/Gglobal.c:83
+-//   #15 0x00000000004c44fb in _ULx86_64_init_local (cursor=0x7fff483df340, 
uc=0x7fff483def90) at x86_64/Ginit_local.c:47
+-//   #16 0x00000000004b5012 in GetStackTrace(void**, int, int) ()
+-//   #17 0x00000000004b2095 in tcmalloc::PageHeap::GrowHeap(unsigned long) ()
+-//   #18 0x00000000004b23a3 in tcmalloc::PageHeap::New(unsigned long) ()
+-//   #19 0x00000000004ad457 in tcmalloc::CentralFreeList::Populate() ()
+-//   #20 0x00000000004ad628 in 
tcmalloc::CentralFreeList::FetchFromSpansSafe() ()
+-//   #21 0x00000000004ad6a3 in tcmalloc::CentralFreeList::RemoveRange(void**, 
void**, int) ()
+-//   #22 0x00000000004b3ed3 in 
tcmalloc::ThreadCache::FetchFromCentralCache(unsigned long, unsigned long) ()
+-//   #23 0x00000000006fbb9a in tc_malloc ()
+-// Call _dl_sym which is a private function in glibc to workaround the malloc
+-// causing deadlock temporarily. This fix is hardly portable.
+-
+-static void init_sys_mutex_lock() {
+-#if defined(OS_LINUX)
+-    // TODO: may need dlvsym when GLIBC has multiple versions of a same 
symbol.
+-    // 
http://blog.fesnel.com/blog/2009/08/25/preloading-with-multiple-symbol-versions
+-    if (_dl_sym) {
+-        sys_pthread_mutex_lock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_lock", (void*)init_sys_mutex_lock);
+-        sys_pthread_mutex_unlock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_unlock", (void*)init_sys_mutex_lock);
+-    } else {
+-        // _dl_sym may be undefined reference in some system, fallback to 
dlsym
+-        sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_lock");
+-        sys_pthread_mutex_unlock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_unlock");
+-    }
+-#elif defined(OS_MACOSX)
+-    // TODO: look workaround for dlsym on mac
+-    sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_lock");
+-    sys_pthread_mutex_unlock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_unlock");
+-#endif
+-}
+-
+-// Make sure pthread functions are ready before main().
+-const int ALLOW_UNUSED dummy = pthread_once(&init_sys_mutex_lock_once, 
init_sys_mutex_lock);
+-
+-int first_sys_pthread_mutex_lock(pthread_mutex_t* mutex) {
+-    pthread_once(&init_sys_mutex_lock_once, init_sys_mutex_lock);
+-    return sys_pthread_mutex_lock(mutex);
+-}
+-int first_sys_pthread_mutex_unlock(pthread_mutex_t* mutex) {
+-    pthread_once(&init_sys_mutex_lock_once, init_sys_mutex_lock);
+-    return sys_pthread_mutex_unlock(mutex);
+-}
++// #ifndef NO_PTHREAD_MUTEX_HOOK
++// // Replace pthread_mutex_lock and pthread_mutex_unlock:
++// // First call to sys_pthread_mutex_lock sets sys_pthread_mutex_lock to the
++// // real function so that next calls go to the real function directly. This
++// // technique avoids calling pthread_once each time.
++// typedef int (*MutexOp)(pthread_mutex_t*);
++// int first_sys_pthread_mutex_lock(pthread_mutex_t* mutex);
++// int first_sys_pthread_mutex_unlock(pthread_mutex_t* mutex);
++// static MutexOp sys_pthread_mutex_lock = first_sys_pthread_mutex_lock;
++// static MutexOp sys_pthread_mutex_unlock = first_sys_pthread_mutex_unlock;
++// static pthread_once_t init_sys_mutex_lock_once = PTHREAD_ONCE_INIT;
++
++// // dlsym may call malloc to allocate space for dlerror and causes 
contention
++// // profiler to deadlock at boostraping when the program is linked with
++// // libunwind. The deadlock bt:
++// //   #0  0x00007effddc99b80 in __nanosleep_nocancel () at 
../sysdeps/unix/syscall-template.S:81
++// //   #1  0x00000000004b4df7 in butil::internal::SpinLockDelay(int 
volatile*, int, int) ()
++// //   #2  0x00000000004b4d57 in SpinLock::SlowLock() ()
++// //   #3  0x00000000004b4a63 in tcmalloc::ThreadCache::InitModule() ()
++// //   #4  0x00000000004aa2b5 in tcmalloc::ThreadCache::GetCache() ()
++// //   #5  0x000000000040c6c5 in (anonymous 
namespace)::do_malloc_no_errno(unsigned long) [clone.part.16] ()
++// //   #6  0x00000000006fc125 in tc_calloc ()
++// //   #7  0x00007effdd245690 in _dlerror_run 
(operate=operate@entry=0x7effdd245130 <dlsym_doit>, 
args=args@entry=0x7fff483dedf0) at dlerror.c:141
++// //   #8  0x00007effdd245198 in __dlsym (handle=<optimized out>, 
name=<optimized out>) at dlsym.c:70
++// //   #9  0x0000000000666517 in bthread::init_sys_mutex_lock () at 
bthread/mutex.cpp:358
++// //   #10 0x00007effddc97a90 in pthread_once () at 
../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S:103
++// //   #11 0x000000000066649f in bthread::first_sys_pthread_mutex_lock 
(mutex=0xbaf880 <_ULx86_64_lock>) at bthread/mutex.cpp:366
++// //   #12 0x00000000006678bc in pthread_mutex_lock_impl (mutex=0xbaf880 
<_ULx86_64_lock>) at bthread/mutex.cpp:489
++// //   #13 pthread_mutex_lock (__mutex=__mutex@entry=0xbaf880 
<_ULx86_64_lock>) at bthread/mutex.cpp:751
++// //   #14 0x00000000004c6ea1 in _ULx86_64_init () at x86_64/Gglobal.c:83
++// //   #15 0x00000000004c44fb in _ULx86_64_init_local 
(cursor=0x7fff483df340, uc=0x7fff483def90) at x86_64/Ginit_local.c:47
++// //   #16 0x00000000004b5012 in GetStackTrace(void**, int, int) ()
++// //   #17 0x00000000004b2095 in tcmalloc::PageHeap::GrowHeap(unsigned long) 
()
++// //   #18 0x00000000004b23a3 in tcmalloc::PageHeap::New(unsigned long) ()
++// //   #19 0x00000000004ad457 in tcmalloc::CentralFreeList::Populate() ()
++// //   #20 0x00000000004ad628 in 
tcmalloc::CentralFreeList::FetchFromSpansSafe() ()
++// //   #21 0x00000000004ad6a3 in 
tcmalloc::CentralFreeList::RemoveRange(void**, void**, int) ()
++// //   #22 0x00000000004b3ed3 in 
tcmalloc::ThreadCache::FetchFromCentralCache(unsigned long, unsigned long) ()
++// //   #23 0x00000000006fbb9a in tc_malloc ()
++// // Call _dl_sym which is a private function in glibc to workaround the 
malloc
++// // causing deadlock temporarily. This fix is hardly portable.
++
++// static void init_sys_mutex_lock() {
++// #if defined(OS_LINUX)
++//     // TODO: may need dlvsym when GLIBC has multiple versions of a same 
symbol.
++//     // 
http://blog.fesnel.com/blog/2009/08/25/preloading-with-multiple-symbol-versions
++//     if (_dl_sym) {
++//         sys_pthread_mutex_lock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_lock", (void*)init_sys_mutex_lock);
++//         sys_pthread_mutex_unlock = (MutexOp)_dl_sym(RTLD_NEXT, 
"pthread_mutex_unlock", (void*)init_sys_mutex_lock);
++//     } else {
++//         // _dl_sym may be undefined reference in some system, fallback to 
dlsym
++//         sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_lock");
++//         sys_pthread_mutex_unlock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_unlock");
++//     }
++// #elif defined(OS_MACOSX)
++//     // TODO: look workaround for dlsym on mac
++//     sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_lock");
++//     sys_pthread_mutex_unlock = (MutexOp)dlsym(RTLD_NEXT, 
"pthread_mutex_unlock");
++// #endif
++// }
++
++// // Make sure pthread functions are ready before main().
++// const int ALLOW_UNUSED dummy = pthread_once(&init_sys_mutex_lock_once, 
init_sys_mutex_lock);
++
++// int first_sys_pthread_mutex_lock(pthread_mutex_t* mutex) {
++//     pthread_once(&init_sys_mutex_lock_once, init_sys_mutex_lock);
++//     return sys_pthread_mutex_lock(mutex);
++// }
++// int first_sys_pthread_mutex_unlock(pthread_mutex_t* mutex) {
++//     pthread_once(&init_sys_mutex_lock_once, init_sys_mutex_lock);
++//     return sys_pthread_mutex_unlock(mutex);
++// }
++// #endif
+
+ inline uint64_t hash_mutex_ptr(const pthread_mutex_t* m) {
+     return butil::fmix64((uint64_t)m);
+@@ -524,99 +528,101 @@ void submit_contention(const bthread_contention_site_t& 
csite, int64_t now_ns) {
+     tls_inside_lock = false;
+ }
+
+-BUTIL_FORCE_INLINE int pthread_mutex_lock_impl(pthread_mutex_t* mutex) {
+-    // Don't change behavior of lock when profiler is off.
+-    if (!g_cp ||
+-        // collecting code including backtrace() and submit() may call
+-        // pthread_mutex_lock and cause deadlock. Don't sample.
+-        tls_inside_lock) {
+-        return sys_pthread_mutex_lock(mutex);
+-    }
+-    // Don't slow down non-contended locks.
+-    int rc = pthread_mutex_trylock(mutex);
+-    if (rc != EBUSY) {
+-        return rc;
+-    }
+-    // Ask bvar::Collector if this (contended) locking should be sampled
+-    const size_t sampling_range = bvar::is_collectable(&g_cp_sl);
+-
+-    bthread_contention_site_t* csite = NULL;
+-#ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
+-    TLSPthreadContentionSites& fast_alt = tls_csites;
+-    if (fast_alt.cp_version != g_cp_version) {
+-        fast_alt.cp_version = g_cp_version;
+-        fast_alt.count = 0;
+-    }
+-    if (fast_alt.count < TLS_MAX_COUNT) {
+-        MutexAndContentionSite& entry = fast_alt.list[fast_alt.count++];
+-        entry.mutex = mutex;
+-        csite = &entry.csite;
+-        if (!sampling_range) {
+-            make_contention_site_invalid(&entry.csite);
+-            return sys_pthread_mutex_lock(mutex);
+-        }
+-    }
+-#endif
+-    if (!sampling_range) {  // don't sample
+-        return sys_pthread_mutex_lock(mutex);
+-    }
+-    // Lock and monitor the waiting time.
+-    const int64_t start_ns = butil::cpuwide_time_ns();
+-    rc = sys_pthread_mutex_lock(mutex);
+-    if (!rc) { // Inside lock
+-        if (!csite) {
+-            csite = add_pthread_contention_site(mutex);
+-            if (csite == NULL) {
+-                return rc;
+-            }
+-        }
+-        csite->duration_ns = butil::cpuwide_time_ns() - start_ns;
+-        csite->sampling_range = sampling_range;
+-    } // else rare
+-    return rc;
+-}
+-
+-BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(pthread_mutex_t* mutex) {
+-    // Don't change behavior of unlock when profiler is off.
+-    if (!g_cp || tls_inside_lock) {
+-        // This branch brings an issue that an entry created by
+-        // add_pthread_contention_site may not be cleared. Thus we add a
+-        // 16-bit rolling version in the entry to find out such entry.
+-        return sys_pthread_mutex_unlock(mutex);
+-    }
+-    int64_t unlock_start_ns = 0;
+-    bool miss_in_tls = true;
+-    bthread_contention_site_t saved_csite = {0,0};
+-#ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
+-    TLSPthreadContentionSites& fast_alt = tls_csites;
+-    for (int i = fast_alt.count - 1; i >= 0; --i) {
+-        if (fast_alt.list[i].mutex == mutex) {
+-            if (is_contention_site_valid(fast_alt.list[i].csite)) {
+-                saved_csite = fast_alt.list[i].csite;
+-                unlock_start_ns = butil::cpuwide_time_ns();
+-            }
+-            fast_alt.list[i] = fast_alt.list[--fast_alt.count];
+-            miss_in_tls = false;
+-            break;
+-        }
+-    }
+-#endif
+-    // Check the map to see if the lock is sampled. Notice that we're still
+-    // inside critical section.
+-    if (miss_in_tls) {
+-        if (remove_pthread_contention_site(mutex, &saved_csite)) {
+-            unlock_start_ns = butil::cpuwide_time_ns();
+-        }
+-    }
+-    const int rc = sys_pthread_mutex_unlock(mutex);
+-    // [Outside lock]
+-    if (unlock_start_ns) {
+-        const int64_t unlock_end_ns = butil::cpuwide_time_ns();
+-        saved_csite.duration_ns += unlock_end_ns - unlock_start_ns;
+-        submit_contention(saved_csite, unlock_end_ns);
+-    }
+-    return rc;
+-}
++// #ifndef NO_PTHREAD_MUTEX_HOOK
++// BUTIL_FORCE_INLINE int pthread_mutex_lock_impl(pthread_mutex_t* mutex) {
++//     // Don't change behavior of lock when profiler is off.
++//     if (!g_cp ||
++//         // collecting code including backtrace() and submit() may call
++//         // pthread_mutex_lock and cause deadlock. Don't sample.
++//         tls_inside_lock) {
++//         return sys_pthread_mutex_lock(mutex);
++//     }
++//     // Don't slow down non-contended locks.
++//     int rc = pthread_mutex_trylock(mutex);
++//     if (rc != EBUSY) {
++//         return rc;
++//     }
++//     // Ask bvar::Collector if this (contended) locking should be sampled
++//     const size_t sampling_range = bvar::is_collectable(&g_cp_sl);
++
++//     bthread_contention_site_t* csite = NULL;
++// #ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
++//     TLSPthreadContentionSites& fast_alt = tls_csites;
++//     if (fast_alt.cp_version != g_cp_version) {
++//         fast_alt.cp_version = g_cp_version;
++//         fast_alt.count = 0;
++//     }
++//     if (fast_alt.count < TLS_MAX_COUNT) {
++//         MutexAndContentionSite& entry = fast_alt.list[fast_alt.count++];
++//         entry.mutex = mutex;
++//         csite = &entry.csite;
++//         if (!sampling_range) {
++//             make_contention_site_invalid(&entry.csite);
++//             return sys_pthread_mutex_lock(mutex);
++//         }
++//     }
++// #endif
++//     if (!sampling_range) {  // don't sample
++//         return sys_pthread_mutex_lock(mutex);
++//     }
++//     // Lock and monitor the waiting time.
++//     const int64_t start_ns = butil::cpuwide_time_ns();
++//     rc = sys_pthread_mutex_lock(mutex);
++//     if (!rc) { // Inside lock
++//         if (!csite) {
++//             csite = add_pthread_contention_site(mutex);
++//             if (csite == NULL) {
++//                 return rc;
++//             }
++//         }
++//         csite->duration_ns = butil::cpuwide_time_ns() - start_ns;
++//         csite->sampling_range = sampling_range;
++//     } // else rare
++//     return rc;
++// }
++
++// BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(pthread_mutex_t* mutex) {
++//     // Don't change behavior of unlock when profiler is off.
++//     if (!g_cp || tls_inside_lock) {
++//         // This branch brings an issue that an entry created by
++//         // add_pthread_contention_site may not be cleared. Thus we add a
++//         // 16-bit rolling version in the entry to find out such entry.
++//         return sys_pthread_mutex_unlock(mutex);
++//     }
++//     int64_t unlock_start_ns = 0;
++//     bool miss_in_tls = true;
++//     bthread_contention_site_t saved_csite = {0,0};
++// #ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
++//     TLSPthreadContentionSites& fast_alt = tls_csites;
++//     for (int i = fast_alt.count - 1; i >= 0; --i) {
++//         if (fast_alt.list[i].mutex == mutex) {
++//             if (is_contention_site_valid(fast_alt.list[i].csite)) {
++//                 saved_csite = fast_alt.list[i].csite;
++//                 unlock_start_ns = butil::cpuwide_time_ns();
++//             }
++//             fast_alt.list[i] = fast_alt.list[--fast_alt.count];
++//             miss_in_tls = false;
++//             break;
++//         }
++//     }
++// #endif
++//     // Check the map to see if the lock is sampled. Notice that we're still
++//     // inside critical section.
++//     if (miss_in_tls) {
++//         if (remove_pthread_contention_site(mutex, &saved_csite)) {
++//             unlock_start_ns = butil::cpuwide_time_ns();
++//         }
++//     }
++//     const int rc = sys_pthread_mutex_unlock(mutex);
++//     // [Outside lock]
++//     if (unlock_start_ns) {
++//         const int64_t unlock_end_ns = butil::cpuwide_time_ns();
++//         saved_csite.duration_ns += unlock_end_ns - unlock_start_ns;
++//         submit_contention(saved_csite, unlock_end_ns);
++//     }
++//     return rc;
++// }
++// #endif
+
+ // Implement bthread_mutex_t related functions
+ struct MutexInternal {
+@@ -815,11 +821,13 @@ int bthread_mutex_unlock(bthread_mutex_t* m) {
+     return 0;
+ }
+
+-int pthread_mutex_lock (pthread_mutex_t *__mutex) {
+-    return bthread::pthread_mutex_lock_impl(__mutex);
+-}
+-int pthread_mutex_unlock (pthread_mutex_t *__mutex) {
+-    return bthread::pthread_mutex_unlock_impl(__mutex);
+-}
++// #ifndef NO_PTHREAD_MUTEX_HOOK
++// int pthread_mutex_lock (pthread_mutex_t *__mutex) {
++//     return bthread::pthread_mutex_lock_impl(__mutex);
++// }
++// int pthread_mutex_unlock (pthread_mutex_t *__mutex) {
++//     return bthread::pthread_mutex_unlock_impl(__mutex);
++// }
++// #endif
+
+ }  // extern "C"


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to