#pragma once #include #include #include #include "worker_thread.h" extern _Atomic volatile sig_atomic_t *software_interrupt_counts_deferred_sigalrm_max; extern _Atomic volatile sig_atomic_t *software_interrupt_counts_deferred_sigalrm_replay; extern _Atomic volatile sig_atomic_t *software_interrupt_counts_sigalrm_kernel; extern _Atomic volatile sig_atomic_t *software_interrupt_counts_sigalrm_thread; extern _Atomic volatile sig_atomic_t *software_interrupt_counts_sigfpe; extern _Atomic volatile sig_atomic_t *software_interrupt_counts_sigsegv; extern _Atomic volatile sig_atomic_t *software_interrupt_counts_sigusr; static inline void software_interrupt_counts_alloc() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS software_interrupt_counts_deferred_sigalrm_max = calloc(runtime_worker_threads_count, sizeof(sig_atomic_t)); software_interrupt_counts_deferred_sigalrm_replay = calloc(runtime_worker_threads_count, sizeof(sig_atomic_t)); software_interrupt_counts_sigalrm_kernel = calloc(runtime_worker_threads_count, sizeof(sig_atomic_t)); software_interrupt_counts_sigalrm_thread = calloc(runtime_worker_threads_count, sizeof(sig_atomic_t)); software_interrupt_counts_sigfpe = calloc(runtime_worker_threads_count, sizeof(sig_atomic_t)); software_interrupt_counts_sigsegv = calloc(runtime_worker_threads_count, sizeof(sig_atomic_t)); software_interrupt_counts_sigusr = calloc(runtime_worker_threads_count, sizeof(sig_atomic_t)); #endif } static inline void software_interrupt_counts_free() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS free((void *)software_interrupt_counts_deferred_sigalrm_max); free((void *)software_interrupt_counts_deferred_sigalrm_replay); free((void *)software_interrupt_counts_sigalrm_kernel); free((void *)software_interrupt_counts_sigalrm_thread); free((void *)software_interrupt_counts_sigfpe); free((void *)software_interrupt_counts_sigsegv); free((void *)software_interrupt_counts_sigusr); #endif } static inline void software_interrupt_counts_deferred_sigalrm_max_update(int deferred_sigalrm_count) { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS if (unlikely(deferred_sigalrm_count > software_interrupt_counts_deferred_sigalrm_max[worker_thread_idx])) { software_interrupt_counts_deferred_sigalrm_max[worker_thread_idx] = deferred_sigalrm_count; } #endif } static inline void software_interrupt_counts_deferred_sigalrm_replay_increment() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS atomic_fetch_add(&software_interrupt_counts_deferred_sigalrm_replay[worker_thread_idx], 1); #endif } static inline void software_interrupt_counts_sigalrm_kernel_increment() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS atomic_fetch_add(&software_interrupt_counts_sigalrm_kernel[worker_thread_idx], 1); #endif } static inline void software_interrupt_counts_sigalrm_thread_increment() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS atomic_fetch_add(&software_interrupt_counts_sigalrm_thread[worker_thread_idx], 1); #endif } static inline void software_interrupt_counts_sigfpe_increment() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS atomic_fetch_add(&software_interrupt_counts_sigfpe[worker_thread_idx], 1); #endif } static inline void software_interrupt_counts_sigsegv_increment() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS atomic_fetch_add(&software_interrupt_counts_sigsegv[worker_thread_idx], 1); #endif } static inline void software_interrupt_counts_sigusr_increment() { #ifdef LOG_SOFTWARE_INTERRUPT_COUNTS atomic_fetch_add(&software_interrupt_counts_sigusr[worker_thread_idx], 1); #endif } extern void software_interrupt_counts_log();