Skip to content

Commit

Permalink
fixed zero-copy issues (that weren't working properly) leading to crash
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremybarnes committed Mar 22, 2011
1 parent 2a964ce commit 4b7cca8
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions binding.cc
Expand Up @@ -518,13 +518,19 @@ class Socket::IncomingMessage {
}

inline Local<Value> GetBuffer() {
#if 0
Handle<Object> buf
= Buffer::New(v8::String::New((char*)zmq_msg_data(*msgref_), zmq_msg_size(*msgref_)));
return buf;
#else
if (buf_.IsEmpty()) {
Buffer* buf_obj = Buffer::New(
(char*)zmq_msg_data(*msgref_), zmq_msg_size(*msgref_),
FreeCallback, msgref_);
buf_ = Persistent<Object>::New(buf_obj->handle_);
}
return Local<Value>::New(buf_);
#endif
}

private:
Expand Down Expand Up @@ -671,9 +677,27 @@ Handle<Value> Socket::Send(const Arguments &args) {

GET_SOCKET(args);

#if 0 // zero-copy version, but doesn't properly pin buffer and so has GC issues
OutgoingMessage msg(args[0]->ToObject());
if (zmq_send(socket->socket_, msg, flags) < 0)
return ThrowException(ExceptionFromError());

#else // copying version that has no GC issues
zmq_msg_t msg;
Local<Object> buf = args[0]->ToObject();
size_t len = Buffer::Length(buf);
int res = zmq_msg_init_size(&msg, len);
if (res != 0)
return ThrowException(ExceptionFromError());

char * cp = (char *)zmq_msg_data(&msg);
const char * dat = Buffer::Data(buf);
std::copy(dat, dat + len, cp);

if (zmq_send(socket->socket_, &msg, flags) < 0)
return ThrowException(ExceptionFromError());
#endif // zero copy / copying version

return Undefined();
}

Expand Down

0 comments on commit 4b7cca8

Please sign in to comment.