mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.9 KiB
104 lines
2.9 KiB
14 years ago
|
From 2a40926a1e1c8d385afefc1fe5255e21cc1a8f1e Mon Sep 17 00:00:00 2001
|
||
|
From: Ryan Dahl <ry@tinyclouds.org>
|
||
|
Date: Thu, 16 Dec 2010 22:20:44 +0000
|
||
|
Subject: [PATCH] Fix Solaris build
|
||
|
|
||
|
---
|
||
|
src/platform-solaris.cc | 49 ++++++++++++++++++++++++++++++++++++----------
|
||
|
src/v8utils.h | 1 +
|
||
|
2 files changed, 39 insertions(+), 11 deletions(-)
|
||
|
|
||
|
diff --git a/src/platform-solaris.cc b/src/platform-solaris.cc
|
||
|
index f84e80d..b302c59 100644
|
||
|
--- a/src/platform-solaris.cc
|
||
|
+++ b/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);
|
||
|
}
|
||
|
|
||
|
|
||
|
diff --git a/src/v8utils.h b/src/v8utils.h
|
||
|
index f6ed520..59b3898 100644
|
||
|
--- a/src/v8utils.h
|
||
|
+++ b/src/v8utils.h
|
||
|
@@ -29,6 +29,7 @@
|
||
|
#define V8_V8UTILS_H_
|
||
|
|
||
|
#include "utils.h"
|
||
|
+#include <stdarg.h>
|
||
|
|
||
|
namespace v8 {
|
||
|
namespace internal {
|
||
|
--
|
||
|
1.6.3.3
|
||
|
|