Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3.5 Changeset: r91686:33527bb8058e Date: 2017-07-04 22:00 +0100 http://bitbucket.org/pypy/pypy/changeset/33527bb8058e/
Log: hg merge default diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py --- a/rpython/rlib/rvmprof/cintf.py +++ b/rpython/rlib/rvmprof/cintf.py @@ -58,6 +58,7 @@ SHARED.join('compat.c'), SHARED.join('machine.c'), SHARED.join('vmp_stack.c'), + SHARED.join('vmprof_main.c'), # symbol table already in separate_module_files ] + separate_module_files, post_include_bits=[], diff --git a/rpython/rlib/rvmprof/src/shared/vmprof_main.c b/rpython/rlib/rvmprof/src/shared/vmprof_main.c new file mode 100644 --- /dev/null +++ b/rpython/rlib/rvmprof/src/shared/vmprof_main.c @@ -0,0 +1,30 @@ +#ifdef VMPROF_UNIX + +#include <unistd.h> +/* value: LSB bit is 1 if signals must be ignored; all other bits + are a counter for how many threads are currently in a signal handler */ +static long volatile signal_handler_value = 1; + +void vmprof_ignore_signals(int ignored) +{ + if (!ignored) { + __sync_fetch_and_and(&signal_handler_value, ~1L); + } else { + /* set the last bit, and wait until concurrently-running signal + handlers finish */ + while (__sync_or_and_fetch(&signal_handler_value, 1L) != 1L) { + usleep(1); + } + } +} + +long vmprof_enter_signal(void) +{ + return __sync_fetch_and_add(&signal_handler_value, 2L); +} + +long vmprof_exit_signal(void) +{ + return __sync_sub_and_fetch(&signal_handler_value, 2L); +} +#endif diff --git a/rpython/rlib/rvmprof/src/shared/vmprof_main.h b/rpython/rlib/rvmprof/src/shared/vmprof_main.h --- a/rpython/rlib/rvmprof/src/shared/vmprof_main.h +++ b/rpython/rlib/rvmprof/src/shared/vmprof_main.h @@ -60,25 +60,9 @@ /************************************************************/ -/* value: last bit is 1 if signals must be ignored; all other bits - are a counter for how many threads are currently in a signal handler */ -static long volatile signal_handler_value = 1; - -RPY_EXTERN -void vmprof_ignore_signals(int ignored) -{ - if (!ignored) { - __sync_fetch_and_and(&signal_handler_value, ~1L); - } - else { - /* set the last bit, and wait until concurrently-running signal - handlers finish */ - while (__sync_or_and_fetch(&signal_handler_value, 1L) != 1L) { - usleep(1); - } - } -} - +RPY_EXTERN void vmprof_ignore_signals(int ignored); +RPY_EXTERN long vmprof_enter_signal(void); +RPY_EXTERN long vmprof_exit_signal(void); /* ************************************************************* * functions to write a profile file compatible with gperftools @@ -276,7 +260,7 @@ __sync_lock_release(&spinlock); #endif - long val = __sync_fetch_and_add(&signal_handler_value, 2L); + long val = vmprof_enter_signal(); if ((val & 1) == 0) { int saved_errno = errno; @@ -307,7 +291,7 @@ errno = saved_errno; } - __sync_sub_and_fetch(&signal_handler_value, 2L); + vmprof_exit_signal(); } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit