Revision: 8502
Author: [email protected]
Date: Thu Jun 30 22:50:14 2011
Log: Fixes the build for the shell on illumos and Solaris.
-D__C99FEATURES__ was added to mirror how the build is done on the normal
platform. The changes in the platform code are a follow up to a prior
review and has the Solaris implementation be more similar to the Linux
version as opposed to the FreeBSD.
Contributed by Robert Mustacchi <[email protected]>
TEST=Note the test suite uncovered a bug in libm where pow(3M) was not
doing the right thing on edge cases. The only test failures are related to
this bug.
Review URL: http://codereview.chromium.org/7282034
http://code.google.com/p/v8/source/detail?r=8502
Modified:
/branches/bleeding_edge/AUTHORS
/branches/bleeding_edge/SConstruct
/branches/bleeding_edge/src/platform-solaris.cc
=======================================
--- /branches/bleeding_edge/AUTHORS Tue Jun 28 01:54:09 2011
+++ /branches/bleeding_edge/AUTHORS Thu Jun 30 22:50:14 2011
@@ -36,6 +36,7 @@
Peter Varga <[email protected]>
Rafal Krypa <[email protected]>
Rene Rebe <[email protected]>
+Robert Mustacchi <[email protected]>
Rodolph Perfetta <[email protected]>
Ryan Dahl <[email protected]>
Sanjoy Das <[email protected]>
=======================================
--- /branches/bleeding_edge/SConstruct Thu Jun 30 04:53:54 2011
+++ /branches/bleeding_edge/SConstruct Thu Jun 30 22:50:14 2011
@@ -475,6 +475,9 @@
'LIBS': ['execinfo', 'pthread']
},
'os:solaris': {
+ # On Solaris, to get isinf, INFINITY, fpclassify and other macros one
+ # needs to define __C99FEATURES__.
+ 'CPPDEFINES': ['__C99FEATURES__'],
'LIBPATH' : ['/usr/local/lib'],
'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
'LINKFLAGS': ['-mt']
=======================================
--- /branches/bleeding_edge/src/platform-solaris.cc Thu Jun 30 00:24:49 2011
+++ /branches/bleeding_edge/src/platform-solaris.cc Thu Jun 30 22:50:14 2011
@@ -595,17 +595,6 @@
return pthread_self();
}
-class Sampler::PlatformData : public Malloced {
- public:
- PlatformData() : vm_tid_(GetThreadID()) {}
-
- pthread_t vm_tid() const { return vm_tid_; }
-
- private:
- pthread_t vm_tid_;
-};
-
-
static void ProfilerSignalHandler(int signal, siginfo_t* info, void*
context) {
USE(info);
if (signal != SIGPROF) return;
@@ -639,6 +628,17 @@
sampler->Tick(sample);
}
+class Sampler::PlatformData : public Malloced {
+ public:
+ PlatformData() : vm_tid_(GetThreadID()) {}
+
+ pthread_t vm_tid() const { return vm_tid_; }
+
+ private:
+ pthread_t vm_tid_;
+};
+
+
class SignalSender : public Thread {
public:
enum SleepInterval {
@@ -649,20 +649,29 @@
explicit SignalSender(int interval)
: Thread("SignalSender"),
interval_(interval) {}
+
+ static void InstallSignalHandler() {
+ struct sigaction sa;
+ sa.sa_sigaction = ProfilerSignalHandler;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_RESTART | SA_SIGINFO;
+ signal_handler_installed_ =
+ (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0);
+ }
+
+ static void RestoreSignalHandler() {
+ if (signal_handler_installed_) {
+ sigaction(SIGPROF, &old_signal_handler_, 0);
+ signal_handler_installed_ = false;
+ }
+ }
static void AddActiveSampler(Sampler* sampler) {
ScopedLock lock(mutex_);
SamplerRegistry::AddActiveSampler(sampler);
if (instance_ == NULL) {
- // Install a signal handler.
- struct sigaction sa;
- sa.sa_sigaction = ProfilerSignalHandler;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_RESTART | SA_SIGINFO;
- signal_handler_installed_ =
- (sigaction(SIGPROF, &sa, &old_signal_handler_) == 0);
-
- // Start a thread that sends SIGPROF signal to VM threads.
+ // Start a thread that will send SIGPROF signal to VM threads,
+ // when CPU profiling will be enabled.
instance_ = new SignalSender(sampler->interval());
instance_->Start();
} else {
@@ -678,12 +687,7 @@
instance_->Join();
delete instance_;
instance_ = NULL;
-
- // Restore the old signal handler.
- if (signal_handler_installed_) {
- sigaction(SIGPROF, &old_signal_handler_, 0);
- signal_handler_installed_ = false;
- }
+ RestoreSignalHandler();
}
}
@@ -695,6 +699,12 @@
bool cpu_profiling_enabled =
(state == SamplerRegistry::HAS_CPU_PROFILING_SAMPLERS);
bool runtime_profiler_enabled = RuntimeProfiler::IsEnabled();
+ if (cpu_profiling_enabled && !signal_handler_installed_) {
+ InstallSignalHandler();
+ } else if (!cpu_profiling_enabled && signal_handler_installed_) {
+ RestoreSignalHandler();
+ }
+
// When CPU profiling is enabled both JavaScript and C++ code is
// profiled. We must not suspend.
if (!cpu_profiling_enabled) {
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev