diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2010-12-16 22:03:04 +0000 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-12-16 14:05:13 -0800 |
commit | c9d3a81db0e795f67ae478fe2e910c7c429dff60 (patch) | |
tree | 4be69a6c27b28a13d0c672e36b5d0555541de757 /deps/v8/src/platform-solaris.cc | |
parent | 033ab7ebb6773f6831846fff1b6366adb4d798fb (diff) | |
download | node-new-c9d3a81db0e795f67ae478fe2e910c7c429dff60.tar.gz |
Patch V8 to compile on solaris
Diffstat (limited to 'deps/v8/src/platform-solaris.cc')
-rw-r--r-- | deps/v8/src/platform-solaris.cc | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/deps/v8/src/platform-solaris.cc b/deps/v8/src/platform-solaris.cc index f84e80d1f5..b302c596cf 100644 --- a/deps/v8/src/platform-solaris.cc +++ b/deps/v8/src/platform-solaris.cc @@ -45,6 +45,7 @@ #include <errno.h> #include <ieeefp.h> // finite() #include <signal.h> // sigemptyset(), etc +#include <sys/kdi_regs.h> #undef MAP_TYPE @@ -481,6 +482,16 @@ class SolarisMutex : public Mutex { int Unlock() { return pthread_mutex_unlock(&mutex_); } + virtual bool TryLock() { + int result = pthread_mutex_trylock(&mutex_); + // Return false if the lock is busy and locking failed. + if (result == EBUSY) { + return false; + } + ASSERT(result == 0); // Verify no other errors. + return true; + } + private: pthread_mutex_t mutex_; }; @@ -572,21 +583,37 @@ Semaphore* OS::CreateSemaphore(int count) { #ifdef ENABLE_LOGGING_AND_PROFILING static Sampler* active_sampler_ = NULL; +static pthread_t vm_tid_ = 0; + static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) { USE(info); if (signal != SIGPROF) return; - if (active_sampler_ == NULL) return; - - TickSample sample; - sample.pc = 0; - sample.sp = 0; - sample.fp = 0; - - // We always sample the VM state. - sample.state = VMState::current_state(); - - active_sampler_->Tick(&sample); + if (active_sampler_ == NULL || !active_sampler_->IsActive()) return; + if (vm_tid_ != pthread_self()) return; + + TickSample sample_obj; + TickSample* sample = CpuProfiler::TickSampleEvent(); + if (sample == NULL) sample = &sample_obj; + + // Extracting the sample from the context is extremely machine dependent. + ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); + mcontext_t& mcontext = ucontext->uc_mcontext; + sample->state = Top::current_vm_state(); + +#if V8_HOST_ARCH_IA32 + sample->pc = reinterpret_cast<Address>(mcontext.gregs[KDIREG_EIP]); + sample->sp = reinterpret_cast<Address>(mcontext.gregs[KDIREG_ESP]); + sample->fp = reinterpret_cast<Address>(mcontext.gregs[KDIREG_EBP]); +#elif V8_HOST_ARCH_X64 + sample->pc = reinterpret_cast<Address>(mcontext.gregs[KDIREG_RIP]); + sample->sp = reinterpret_cast<Address>(mcontext.gregs[KDIREG_RSP]); + sample->fp = reinterpret_cast<Address>(mcontext.gregs[KDIREG_RBP]); +#else + UNIMPLEMENTED(); +#endif + active_sampler_->SampleStack(sample); + active_sampler_->Tick(sample); } |