Skip to content

Commit

Permalink
Add solaris patch file
Browse files Browse the repository at this point in the history
  • Loading branch information
ry committed Dec 16, 2010
1 parent c9d3a81 commit 02aae22
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 1 deletion.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ build
tags
.lock-wscript
*.pyc
*.patch
doc/api.xml
tools/nodejs.pc
test/fixtures/hello.txt
Expand Down
103 changes: 103 additions & 0 deletions deps/v8/0003-Fix-Solaris-build.patch
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

0 comments on commit 02aae22

Please sign in to comment.