Skip to content

Instantly share code, notes, and snippets.

@opensourcegeek
Last active August 29, 2015 14:24
Show Gist options
  • Save opensourcegeek/2bcca83e8a17bc0a3c64 to your computer and use it in GitHub Desktop.
Save opensourcegeek/2bcca83e8a17bc0a3c64 to your computer and use it in GitHub Desktop.
Slight modification of https://github.com/nikhilm/uvbook/blob/master/code/progress/main.c which uses uv_thread_create with nan
#include <nan.h>
#include <random>
#include <uv.h>
uv_loop_t *loop;
uv_async_t async;
using namespace v8;
struct Callbacks {
NanCallback *onDeviceAddedCallback;
NanCallback *onDeviceRemovedCallback;
};
struct RequestBaton {
double percentage;
NanCallback *onDeviceAdded;
NanCallback *onDeviceRemoved;
};
void fake_download(void *arg) {
//NanCallback *callback = (NanCallback*)arg;
Callbacks *cbs = (Callbacks *)arg;
//int size = req.size;
int size = 10240;
// init result baton
int downloaded = 0;
double percentage;
while (downloaded < size) {
percentage = downloaded*100.0 / size;
RequestBaton rb = {
percentage,
cbs->onDeviceAddedCallback,
cbs->onDeviceRemovedCallback
};
//req->percentage = percentage;
async.data = (void *)&rb;
uv_async_send(&async);
Sleep(1000);
downloaded += (200 + rand()) % 1000; // can only download max 1000bytes/sec,
// but at least a 200;
}
// clearing from heap
free(cbs);
}
void print_progress(uv_async_t *handle) {
NanScope();
//NanCallback *callback = (NanCallback *)handle->data;
RequestBaton *rb = (struct RequestBaton *) handle->data;
//fprintf(stderr, "Downloaded %.2f%%\n", percentage);
Handle<Value> argv[] = {
NanNew<Number>(rb->percentage)
};
rb->onDeviceAdded->Call(1, argv);
}
NAN_METHOD(DeviceDiscoverer) {
uv_thread_t download_id;
NanScope();
Local<Function> fn1 = args[0].As<Function>();
Local<Function> fn2 = args[1].As<Function>();
NanCallback *deviceAddedCallback = new NanCallback(fn1);
NanCallback *deviceRemovedCallback = new NanCallback(fn2);
/*Handle<Value> argv[] = {
NanNew<Number>(24.11)
};*/
//callback->Call(1, argv);
loop = uv_default_loop();
Callbacks *cb = (Callbacks *) malloc(sizeof(Callbacks));
cb->onDeviceAddedCallback = deviceAddedCallback;
cb->onDeviceRemovedCallback = deviceRemovedCallback;
uv_async_init(loop, &async, print_progress);
uv_thread_create(&download_id, fake_download, (void *)cb);
NanReturnUndefined();
}
NAN_METHOD(SayHello) {
NanScope();
NanReturnValue(NanNew<String>
("No hello -- Booyakasha"));
}
void Init(Handle<Object> exports) {
exports->Set(NanNew<String>("hello"),
NanNew<FunctionTemplate>(SayHello)->GetFunction());
exports->Set(NanNew<String>("DeviceDiscoverer"),
NanNew<FunctionTemplate>(DeviceDiscoverer)->GetFunction());
}
NODE_MODULE(simple, Init);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment