Commit 800738a4 by Adeel

Importer: Moves mutex in context.

parent 292e1ba5
#include <mutex>
#include <nan.h> #include <nan.h>
#include "sass_context_wrapper.h" #include "sass_context_wrapper.h"
...@@ -13,27 +12,22 @@ char* CreateString(Local<Value> value) { ...@@ -13,27 +12,22 @@ char* CreateString(Local<Value> value) {
return str; return str;
} }
static std::mutex importer_mutex;
void dispatched_async_uv_callback(uv_async_t *req){ void dispatched_async_uv_callback(uv_async_t *req){
std::unique_lock<std::mutex> v8_lock(importer_mutex);
v8_lock.lock();
//importer_mutex.lock();
NanScope(); NanScope();
sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(req->data);
TryCatch try_catch; TryCatch try_catch;
import_bag* bag = static_cast<import_bag*>(req->data);
Handle<Value> argv[] = { Handle<Value> argv[] = {
NanNew<String>(bag->file) NanNew<String>(ctx_w->file)
}; };
Local<Value> returned_value = NanNew<Value>(((NanCallback*)bag->cookie)->Call(1, argv)); Local<Value> returned_value = NanNew<Value>(ctx_w->importer_callback->Call(1, argv));
if (returned_value->IsArray()) { if (returned_value->IsArray()) {
Handle<Array> array = Handle<Array>::Cast(returned_value); Handle<Array> array = Handle<Array>::Cast(returned_value);
bag->incs = sass_make_import_list(array->Length()); ctx_w->imports = sass_make_import_list(array->Length());
for (size_t i = 0; i < array->Length(); ++i) { for (size_t i = 0; i < array->Length(); ++i) {
Local<Value> value = array->Get(i); Local<Value> value = array->Get(i);
...@@ -45,24 +39,25 @@ void dispatched_async_uv_callback(uv_async_t *req){ ...@@ -45,24 +39,25 @@ void dispatched_async_uv_callback(uv_async_t *req){
char* path = CreateString(object->Get(String::New("file"))); char* path = CreateString(object->Get(String::New("file")));
char* contents = CreateString(object->Get(String::New("contents"))); char* contents = CreateString(object->Get(String::New("contents")));
bag->incs[i] = sass_make_import_entry(path, (!contents || contents[0] == '\0') ? 0 : strdup(contents), 0); ctx_w->imports[i] = sass_make_import_entry(path, (!contents || contents[0] == '\0') ? 0 : strdup(contents), 0);
} }
} }
else if (returned_value->IsObject()) { else if (returned_value->IsObject()) {
bag->incs = sass_make_import_list(1); ctx_w->imports = sass_make_import_list(1);
Local<Object> object = Local<Object>::Cast(returned_value); Local<Object> object = Local<Object>::Cast(returned_value);
char* path = CreateString(object->Get(String::New("file"))); char* path = CreateString(object->Get(String::New("file")));
char* contents = CreateString(object->Get(String::New("contents"))); char* contents = CreateString(object->Get(String::New("contents")));
bag->incs[0] = sass_make_import_entry(path, (!contents || contents[0] == '\0') ? 0 : strdup(contents), 0); ctx_w->imports[0] = sass_make_import_entry(path, (!contents || contents[0] == '\0') ? 0 : strdup(contents), 0);
} }
else { else {
bag->incs = sass_make_import_list(1); ctx_w->imports = sass_make_import_list(1);
bag->incs[0] = sass_make_import_entry(bag->file, 0, 0); ctx_w->imports[0] = sass_make_import_entry(ctx_w->file, 0, 0);
} }
v8_lock.unlock(); //uv_mutex_unlock(ctx_w->mutex);
//importer_mutex.unlock(); ctx_w->importer_mutex->unlock();
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); node::FatalException(try_catch);
} }
...@@ -70,26 +65,24 @@ void dispatched_async_uv_callback(uv_async_t *req){ ...@@ -70,26 +65,24 @@ void dispatched_async_uv_callback(uv_async_t *req){
struct Sass_Import** sass_importer(const char* file, void* cookie) struct Sass_Import** sass_importer(const char* file, void* cookie)
{ {
std::try_lock(importer_mutex); sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(cookie);
import_bag* bag = (import_bag*)calloc(1, sizeof(import_bag));
bag->cookie = cookie;
bag->file = file;
uv_async_t async;
uv_async_init(uv_default_loop(), &async, (uv_async_cb)dispatched_async_uv_callback);
async.data = (void*)bag;
uv_async_send(&async);
// Dispatch immediately uv_mutex_t t;
//uv_run(async.loop, UV_RUN_DEFAULT); ctx_w->importer_mutex->lock();
//uv_mutex_lock(ctx_w->mutex);
Sass_Import** import = bag->incs; // Enter critical section
ctx_w->file = file;
ctx_w->async.data = (void*)&ctx_w;
uv_async_send(&ctx_w->async);
free(bag); // Reassurances
//uv_mutex_lock(ctx_w->mutex);
//uv_mutex_unlock(ctx_w->mutex);
ctx_w->importer_mutex->lock();
ctx_w->importer_mutex->unlock();
return import; return ctx_w->imports;
} }
void ExtractOptions(Local<Object> options, void* cptr, sass_context_wrapper* ctx_w, bool isFile) { void ExtractOptions(Local<Object> options, void* cptr, sass_context_wrapper* ctx_w, bool isFile) {
...@@ -124,7 +117,8 @@ void ExtractOptions(Local<Object> options, void* cptr, sass_context_wrapper* ctx ...@@ -124,7 +117,8 @@ void ExtractOptions(Local<Object> options, void* cptr, sass_context_wrapper* ctx
ctx_w->importer_callback = new NanCallback(importer_callback); ctx_w->importer_callback = new NanCallback(importer_callback);
if (!importer_callback->IsUndefined()){ if (!importer_callback->IsUndefined()){
sass_option_set_importer(sass_options, sass_make_importer(sass_importer, ctx_w->importer_callback)); uv_async_init(uv_default_loop(), &ctx_w->async, (uv_async_cb)dispatched_async_uv_callback);
sass_option_set_importer(sass_options, sass_make_importer(sass_importer, ctx_w));
} }
} }
......
...@@ -22,7 +22,10 @@ extern "C" { ...@@ -22,7 +22,10 @@ extern "C" {
} }
sass_context_wrapper* sass_make_context_wrapper() { sass_context_wrapper* sass_make_context_wrapper() {
return (sass_context_wrapper*) calloc(1, sizeof(sass_context_wrapper)); // (sass_context_wrapper*) calloc(1, sizeof(sass_context_wrapper));
auto ctx_w = (sass_context_wrapper*) calloc(1, sizeof(sass_context_wrapper));
ctx_w->importer_mutex = new std::recursive_mutex();
return ctx_w;
} }
void sass_free_context_wrapper(sass_context_wrapper* ctx_w) { void sass_free_context_wrapper(sass_context_wrapper* ctx_w) {
......
#include <mutex>
#include <nan.h> #include <nan.h>
#include "libsass/sass_context.h" #include "libsass/sass_context.h"
...@@ -16,17 +17,17 @@ struct sass_context_wrapper { ...@@ -16,17 +17,17 @@ struct sass_context_wrapper {
Sass_File_Context* fctx; Sass_File_Context* fctx;
Persistent<Object> stats; Persistent<Object> stats;
uv_work_t request; uv_work_t request;
std::recursive_mutex* importer_mutex;
//uv_mutex_t* mutex;
uv_async_t async;
const char* file;
void* cookie;
Sass_Import** imports;
NanCallback* success_callback; NanCallback* success_callback;
NanCallback* error_callback; NanCallback* error_callback;
NanCallback* importer_callback; NanCallback* importer_callback;
}; };
struct import_bag {
const char* file;
void* cookie;
Sass_Import** incs;
};
struct sass_context_wrapper* sass_make_context_wrapper(void); struct sass_context_wrapper* sass_make_context_wrapper(void);
void sass_free_context_wrapper(struct sass_context_wrapper* ctx_w); void sass_free_context_wrapper(struct sass_context_wrapper* ctx_w);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment