Hi, First of all I don't think you should use uv_async in this way since, according to the doc:
* uv_async_send wakes up the event loop and calls the async handle's callback. * There is no guarantee that every uv_async_send call leads to exactly one * invocation of the callback; the only guarantee is that the callback function * is called at least once after the call to async_send. So, assuming that your bufferCallback is called very often (since you are receiving a video stream) you will loose lot of data (data that will never be freed() BTW, so you also get a leak). As a suggestion, use a UnixSocket for communicate data between threads. I use socketpair() and then each thread uses uv_pipe_open() with its corresponding fd, so I get an already connected pipe for sending and receiving. 2014-05-14 21:37 GMT+02:00 Gabriel Llamas <[email protected]>: > I'm developping a node.js native module and I need to emit buffers with > binary data (uint8_t) from C code. The thread architecture is shown above. > In my code I basically have this callback, this is the start point from > where I start receiving binary buffers: > > void bufferCallback (uint8_t* data, uint32_t length){ > //Cannot interact with V8 in this thread, so the data buffer must be sent > //to the main thread > } > > The buffers contain video/image data, that is, they come from a camera (the > raspberry pi camera). My objective is to forward these buffers to the > javascript layer (yes, I know, this could suppose a performance impact). > Therefore I need to do 2 things: send the arrays to the worker thread using > uv_async_send() and then convert the uint8_t array to a javascript Buffer > object. This works but the data that I receive after the uv_async_send() > call is corrupted. There's something between the "worker thread" and the > "pthread" that doesn't work as I expect. > > For example, if I save the data in a file, the video/image is not corrupted: > > void bufferCallback (uint8_t* buffer, uint32_t length){ > //Cannot interact with V8 in this thread, so the data buffer must be sent > //to the main thread > > if (pwrite (fd, buffer, length, 0) == -1){ > printf ("ERROR: pwrite\n"); > } > } > > This is the code needed for inter-thread communication. For now, let's > ignore the V8 code needed for converting and sending the buffer to the > javascript layer. > > struct CHUNK { > uint8_t* buffer; > uint32_t length; > }; > > void bufferCallback (uint8_t* buffer, uint32_t length){ > //Cannot interact with V8 in this thread, so the data buffer must be sent > //to the main thread > > CHUNK* chunk = (CHUNK*)malloc (sizeof (CHUNK)); > > //If it's an async communication then I need to memcpy the data in a new > buffer, > //otherwise it could be freed before it is received in the worker thread, > right? > uint8_t* dupBuffer = (uint8_t*)malloc (sizeof (uint8_t)*length); > memcpy (dupBuffer, buffer, length); > > chunk->buffer = dupBuffer; > chunk->length = length; > > async.data = (void*)chunk; > uv_async_send (&async); > } > > void bufferCallbackSafe (uv_async_t* handle, int status){ > CHUNK* chunk = (CHUNK*)handle->data; > > if (pwrite (fd, chunk->buffer, chunk->length, 0) == -1){ > printf ("ERROR: pwrite\n"); > } > > free (chunk->buffer); > free (chunk); > } > > As you can see, instead of saving the data chunks from the pthread, I'm > saving them from the worker thread after I receive them asynchronously with > uv_async_send. Well, the data that's stored in the file is corrupted, I see > weird artifacts, so there's something about the async communication that I > don't understand. > > Any hints? > > Thanks > > -- > You received this message because you are subscribed to the Google Groups > "libuv" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/libuv. > For more options, visit https://groups.google.com/d/optout. -- Iñaki Baz Castillo <[email protected]> -- You received this message because you are subscribed to the Google Groups "libuv" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/libuv. For more options, visit https://groups.google.com/d/optout.
