forked from nodejs/node-v0.x-archive
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
103 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,6 @@ build | |
tags | ||
.lock-wscript | ||
*.pyc | ||
*.patch | ||
doc/api.xml | ||
tools/nodejs.pc | ||
test/fixtures/hello.txt | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
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 | ||
|