run parse_logs asynchronously. gitignore. misc.
This commit is contained in:
parent
42dfdeb0ed
commit
498f23d0be
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,5 +1,8 @@
|
|||||||
|
node_modules/
|
||||||
node_modules/*
|
node_modules/*
|
||||||
|
out/
|
||||||
out/*
|
out/*
|
||||||
|
build/
|
||||||
build/*
|
build/*
|
||||||
.lock-wscript
|
.lock-wscript
|
||||||
Makefile.gyp
|
Makefile.gyp
|
||||||
|
|||||||
@ -33,8 +33,8 @@
|
|||||||
# leveldb:
|
# leveldb:
|
||||||
'-L<!(echo "$HOME")/bitcoin/src/leveldb/libleveldb.a',
|
'-L<!(echo "$HOME")/bitcoin/src/leveldb/libleveldb.a',
|
||||||
# bitcoind:
|
# bitcoind:
|
||||||
# '-L<!(echo "$HOME")/bitcoin/src/bitcoind',
|
'-L<!(echo "$HOME")/bitcoin/src/bitcoind',
|
||||||
'-L/usr/bin/bitcoind',
|
# '-L/usr/bin/bitcoind',
|
||||||
]
|
]
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include "nan.h"
|
#include "nan.h"
|
||||||
|
|
||||||
|
#include "bitcoindjs.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bitcoin headers
|
* Bitcoin headers
|
||||||
*/
|
*/
|
||||||
@ -75,7 +77,8 @@
|
|||||||
extern void (ThreadImport)(std::vector<boost::filesystem::path>);
|
extern void (ThreadImport)(std::vector<boost::filesystem::path>);
|
||||||
extern void (DetectShutdownThread)(boost::thread_group*);
|
extern void (DetectShutdownThread)(boost::thread_group*);
|
||||||
extern void (StartNode)(boost::thread_group&);
|
extern void (StartNode)(boost::thread_group&);
|
||||||
//extern int nScriptCheckThreads;
|
extern void (ThreadScriptCheck)();
|
||||||
|
extern int nScriptCheckThreads;
|
||||||
// extern const int DEFAULT_SCRIPTCHECK_THREADS; // static!!
|
// extern const int DEFAULT_SCRIPTCHECK_THREADS; // static!!
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
extern std::string strWalletFile;
|
extern std::string strWalletFile;
|
||||||
@ -111,6 +114,12 @@ start_node(void);
|
|||||||
static unsigned int
|
static unsigned int
|
||||||
parse_logs(char **);
|
parse_logs(char **);
|
||||||
|
|
||||||
|
static void
|
||||||
|
async_parse_logs(uv_work_t *req);
|
||||||
|
|
||||||
|
static void
|
||||||
|
async_parse_logs_after(uv_work_t *req);
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
init(Handle<Object>);
|
init(Handle<Object>);
|
||||||
|
|
||||||
@ -140,9 +149,23 @@ NAN_METHOD(StartBitcoind) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Run on a separate thead:
|
// Run on a separate thead:
|
||||||
int log_fd = parse_logs(NULL);
|
// char *log_str;
|
||||||
|
// int log_fd = parse_logs(&log_str);
|
||||||
// handle->Set(NanNew<String>("log"), NanNew<Number>(log_fd));
|
// handle->Set(NanNew<String>("log"), NanNew<Number>(log_fd));
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: Init pipe/dup2 earlier so we set the
|
||||||
|
// FD on the object, updating log string dynamically.
|
||||||
|
// uv_work_t *req = new uv_work_t();
|
||||||
|
// async_data* data = new async_data();
|
||||||
|
// data->err = false;
|
||||||
|
// data->callback = Persistent<Function>::New(callback);
|
||||||
|
// req->data = data;
|
||||||
|
// int status_ = uv_queue_work(uv_default_loop(),
|
||||||
|
// req, async_parse_logs, (uv_after_work_cb)async_parse_logs_after);
|
||||||
|
// assert(status_ == 0);
|
||||||
|
|
||||||
|
|
||||||
Local<Function> callback = Local<Function>::Cast(args[0]);
|
Local<Function> callback = Local<Function>::Cast(args[0]);
|
||||||
|
|
||||||
async_data* data = new async_data();
|
async_data* data = new async_data();
|
||||||
@ -219,9 +242,6 @@ async_after(uv_work_t *req) {
|
|||||||
* A reimplementation of AppInit2 minus
|
* A reimplementation of AppInit2 minus
|
||||||
* the logging and argument parsing.
|
* the logging and argument parsing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const int _nScriptCheckThreads = 0;
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
start_node(void) {
|
start_node(void) {
|
||||||
boost::thread_group threadGroup;
|
boost::thread_group threadGroup;
|
||||||
@ -229,7 +249,7 @@ start_node(void) {
|
|||||||
detectShutdownThread = new boost::thread(
|
detectShutdownThread = new boost::thread(
|
||||||
boost::bind(&DetectShutdownThread, &threadGroup));
|
boost::bind(&DetectShutdownThread, &threadGroup));
|
||||||
|
|
||||||
for (int i = 0; i < _nScriptCheckThreads - 1; i++) {
|
for (int i = 0; i < nScriptCheckThreads - 1; i++) {
|
||||||
threadGroup.create_thread(&ThreadScriptCheck);
|
threadGroup.create_thread(&ThreadScriptCheck);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +292,7 @@ const char bitcoind_char[256] = {
|
|||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
parse_logs(char **log_str) {
|
parse_logs(char **log_str) {
|
||||||
#ifndef PARSE_LOGS_ENABLED
|
#if PARSE_LOGS_ENABLED
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -281,6 +301,7 @@ parse_logs(char **log_str) {
|
|||||||
unsigned int read_fd = pfd[0];
|
unsigned int read_fd = pfd[0];
|
||||||
unsigned int write_fd = pfd[1];
|
unsigned int write_fd = pfd[1];
|
||||||
dup2(write_fd, STDOUT_FILENO);
|
dup2(write_fd, STDOUT_FILENO);
|
||||||
|
dup2(write_fd, STDERR_FILENO);
|
||||||
|
|
||||||
int log_pipe[2];
|
int log_pipe[2];
|
||||||
pipe(log_pipe);
|
pipe(log_pipe);
|
||||||
@ -291,7 +312,7 @@ parse_logs(char **log_str) {
|
|||||||
ssize_t r = 0;
|
ssize_t r = 0;
|
||||||
size_t rcount = 80 * sizeof(char);
|
size_t rcount = 80 * sizeof(char);
|
||||||
char *buf = (char *)malloc(rcount);
|
char *buf = (char *)malloc(rcount);
|
||||||
char cur[9];
|
char cur[10];
|
||||||
unsigned int cp = 0;
|
unsigned int cp = 0;
|
||||||
unsigned int reallocs = 0;
|
unsigned int reallocs = 0;
|
||||||
|
|
||||||
@ -330,6 +351,7 @@ parse_logs(char **log_str) {
|
|||||||
read_fd = pfd[0];
|
read_fd = pfd[0];
|
||||||
write_fd = pfd[1];
|
write_fd = pfd[1];
|
||||||
dup2(write_fd, STDOUT_FILENO);
|
dup2(write_fd, STDOUT_FILENO);
|
||||||
|
dup2(write_fd, STDERR_FILENO);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
} else if (cp == sizeof cur) {
|
} else if (cp == sizeof cur) {
|
||||||
@ -371,6 +393,40 @@ parse_logs(char **log_str) {
|
|||||||
return read_log;
|
return read_log;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
async_parse_logs(uv_work_t *req) {
|
||||||
|
async_data* data = static_cast<async_data*>(req->data);
|
||||||
|
parse_logs(NULL);
|
||||||
|
data->err = true;
|
||||||
|
data->result = (char *)strdup("failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
async_parse_logs_after(uv_work_t *req) {
|
||||||
|
NanScope();
|
||||||
|
async_data* data = static_cast<async_data*>(req->data);
|
||||||
|
|
||||||
|
if (data->err) {
|
||||||
|
Local<Value> err = Exception::Error(String::New(data->err_msg.c_str()));
|
||||||
|
const unsigned argc = 1;
|
||||||
|
Local<Value> argv[1] = { err };
|
||||||
|
TryCatch try_catch;
|
||||||
|
data->callback->Call(Context::GetCurrent()->Global(), argc, argv);
|
||||||
|
if (try_catch.HasCaught()) {
|
||||||
|
node::FatalException(try_catch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data->callback.Dispose();
|
||||||
|
|
||||||
|
if (data->result != NULL) {
|
||||||
|
free(data->result);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete data;
|
||||||
|
delete req;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Init
|
* Init
|
||||||
*/
|
*/
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user