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.

Reply via email to