57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
|
|
#ifndef HAKMEM_POOL_TLS_BIND_H
|
||
|
|
#define HAKMEM_POOL_TLS_BIND_H
|
||
|
|
|
||
|
|
#include <stdint.h>
|
||
|
|
#include <sys/types.h>
|
||
|
|
#include <sys/syscall.h>
|
||
|
|
#include <unistd.h>
|
||
|
|
|
||
|
|
/**
|
||
|
|
* POOL_TLS_BIND_BOX - TID Cache for Fast Same-Thread Detection
|
||
|
|
*
|
||
|
|
* Box Theory:
|
||
|
|
* - Boundary: Thread initialization - cache TID in TLS once
|
||
|
|
* - Internal: Hot path uses TID comparison (no gettid syscall)
|
||
|
|
* - Fallback: gettid_cached() on first access
|
||
|
|
*
|
||
|
|
* Performance:
|
||
|
|
* - Eliminates repeated gettid() calls from hot path
|
||
|
|
* - Simple TID comparison (1 comparison vs registry lookup)
|
||
|
|
* - Expected: Reduce cache misses and syscall overhead
|
||
|
|
*/
|
||
|
|
|
||
|
|
// TLS binding for fast TID caching
|
||
|
|
typedef struct PoolTLSBind {
|
||
|
|
pid_t tid; // My thread ID (cached, 0 = uninitialized)
|
||
|
|
} PoolTLSBind;
|
||
|
|
|
||
|
|
// TLS cache (per-thread, automatically zero-initialized)
|
||
|
|
extern __thread PoolTLSBind g_pool_tls_bind;
|
||
|
|
|
||
|
|
// Inline helper: gettid with caching
|
||
|
|
static inline pid_t gettid_cached(void) {
|
||
|
|
static __thread pid_t cached_tid = 0;
|
||
|
|
if (__builtin_expect(cached_tid == 0, 0)) {
|
||
|
|
cached_tid = (pid_t)syscall(SYS_gettid);
|
||
|
|
}
|
||
|
|
return cached_tid;
|
||
|
|
}
|
||
|
|
|
||
|
|
// API
|
||
|
|
|
||
|
|
// Get my thread ID (cached in TLS)
|
||
|
|
static inline pid_t pool_get_my_tid(void) {
|
||
|
|
if (__builtin_expect(g_pool_tls_bind.tid == 0, 0)) {
|
||
|
|
g_pool_tls_bind.tid = gettid_cached();
|
||
|
|
}
|
||
|
|
return g_pool_tls_bind.tid;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Fast same-thread check (TID comparison only)
|
||
|
|
// Returns 1 if owner_tid matches my TID, 0 otherwise
|
||
|
|
static inline int pool_tls_is_mine_tid(pid_t owner_tid) {
|
||
|
|
return owner_tid == pool_get_my_tid();
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif // HAKMEM_POOL_TLS_BIND_H
|