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

Reply via email to