| Index: src/platform-solaris.cc
|
| ===================================================================
|
| --- src/platform-solaris.cc (revision 6800)
|
| +++ src/platform-solaris.cc (working copy)
|
| @@ -45,6 +45,7 @@
|
| #include <errno.h>
|
| #include <ieeefp.h> // finite()
|
| #include <signal.h> // sigemptyset(), etc
|
| +#include <sys/kdi_regs.h>
|
|
|
|
|
| #undef MAP_TYPE
|
| @@ -225,6 +226,7 @@
|
| : file_(file), memory_(memory), size_(size) { }
|
| virtual ~PosixMemoryMappedFile();
|
| virtual void* memory() { return memory_; }
|
| + virtual int size() { return size_; }
|
| private:
|
| FILE* file_;
|
| void* memory_;
|
| @@ -232,6 +234,19 @@
|
| };
|
|
|
|
|
| +OS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name) {
|
| + FILE* file = fopen(name, "w+");
|
| + if (file == NULL) return NULL;
|
| +
|
| + fseek(file, 0, SEEK_END);
|
| + int size = ftell(file);
|
| +
|
| + void* memory =
|
| + mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fileno(file), 0);
|
| + return new PosixMemoryMappedFile(file, memory, size);
|
| +}
|
| +
|
| +
|
| OS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, int size,
|
| void* initial) {
|
| FILE* file = fopen(name, "w+");
|
| @@ -493,6 +508,16 @@
|
|
|
| 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_;
|
| };
|
| @@ -584,21 +609,37 @@
|
| #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;
|
| + if (active_sampler_ == NULL || !active_sampler_->IsActive()) return;
|
| + if (vm_tid_ != pthread_self()) return;
|
|
|
| - TickSample sample;
|
| - sample.pc = 0;
|
| - sample.sp = 0;
|
| - sample.fp = 0;
|
| + TickSample sample_obj;
|
| + TickSample* sample = CpuProfiler::TickSampleEvent();
|
| + if (sample == NULL) sample = &sample_obj;
|
|
|
| - // We always sample the VM state.
|
| - sample.state = VMState::current_state();
|
| + // 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();
|
|
|
| - active_sampler_->Tick(&sample);
|
| +#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);
|
| }
|
|
|
|
|
|
|