Thank you Fedor!.  I was able to resolve it after cleaning up the code, it 
is working fine now.

On Friday, June 6, 2014 10:39:24 AM UTC-4, Fedor Indutny wrote:
>
> Hm... may I ask you to attach some reduced test case that would be easier 
> to compile and run?
>
> It'd be better if you'd send is an attachment or a gist.
>
>
> On Fri, Jun 6, 2014 at 10:32 AM, Fedor Indutny <[email protected] 
> <javascript:>> wrote:
>
>> Hm... I'll look into it, but allocating `uv_write_t` on-stack is 
>> definitely a bad idea. You should
>> probably try to embed it or allocate it on heap.
>>
>> However, `uv_try_write` isn't using it, so the error should be somewhere 
>> else...
>>
>>
>> On Fri, Jun 6, 2014 at 10:10 AM, Jason W <[email protected] 
>> <javascript:>> wrote:
>>
>>> Thanks Fedor.
>>>
>>> Sorry not sure how to properly get that in xcode, but here is the line 
>>> that xcode shows when EXC_BAD_ACCESS occurs. 
>>>
>>>       w->cb(loop, w, revents);
>>>
>>> The thread stack is like the following
>>>
>>> Thread 1
>>>
>>>  Queue: com.apple.main-thread
>>>
>>>  0_mh_execute_header
>>>
>>>  1 uv_io_poll
>>>
>>>  2 uv_run
>>>
>>>  3 main
>>> Below is my 'minimal' code and the line that causes the problem is 
>>> uv_try_write within the broadcastMsg function.  If I comment that out, no 
>>> problem.  Thank you again.
>>>
>>> static QUEUE* q;
>>>
>>> static QUEUE queue;
>>> typedef struct
>>> {
>>>     uv_tcp_t handle;
>>>     uv_shutdown_t shutdown_req;
>>>     QUEUE node;
>>>     
>>> } client;
>>>
>>> void on_write(uv_write_t* req, int status)
>>> {
>>>     if (status) {
>>> //        uv_err_t err = uv_last_error(loop);
>>>         fprintf(stderr, "uv_write error:\n");
>>>     return;
>>>     }
>>>     wroteCounter++;
>>>   printf("wrote %d .\n", wroteCounter);
>>> }
>>>
>>> static void broadcastMsg(char *phoneNumber) {
>>>     q = QUEUE_HEAD(&queue);
>>>     
>>>     
>>>     QUEUE_FOREACH(q, &queue) {
>>>         client* user;
>>>         user = QUEUE_DATA(q, client, node);
>>>                         
>>>         uv_stream_t* theStrPoint = (uv_stream_t*) &(user->handle);
>>>         char myBuf[12];
>>>
>>>         uv_buf_t buf = { .base = strcat(myBuf, "\n"), .len = 
>>> strlen(myBuf) + 1 };
>>>         int nbufs = 1;                
>>>
>>>         int byteWritten = uv_try_write(theStrPoint,
>>>                      &buf,
>>>                      nbufs);
>>>         
>>> //        uv_stream_t* stream = (uv_stream_t*) &user->handle;
>>> //        uv_buf_t buffer[] = {
>>> //            {.base = "hello", .len = 5},
>>> //            {.base = "world\n", .len = 6}
>>> //        };
>>> //        
>>> //        uv_write_t request;
>>> //uv_write(&request, stream, &buf, nbufs, on_write);
>>>
>>>     }
>>> }
>>>
>>>
>>> static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* 
>>> buf) {
>>>     client* conn;
>>>     int r;
>>>     
>>>     if (nread >= 0) {
>>> ...
>>>         return;
>>>     }
>>>     
>>>     
>>>     ASSERT(nread == UV_EOF);
>>>     conn = container_of(stream, client, handle);
>>>                 
>>>     r = uv_shutdown(&conn->shutdown_req, stream, shutdown_cb);
>>>     ASSERT(r == 0);
>>> }
>>>
>>> static void on_connection(uv_stream_t* stream, int status) {
>>>     int r;
>>>     
>>>     ASSERT(status == 0);
>>>     ASSERT(stream == (uv_stream_t*)&tcp_server);
>>>
>>>  
>>>     client *client = malloc(sizeof(*client));
>>>     
>>>     
>>>     r = uv_tcp_init(stream->loop, &client->handle);
>>>     
>>>     uv_tcp_keepalive(&client->handle, 1, 5);
>>>
>>>     
>>>     r = uv_accept(stream, (uv_stream_t*)&client->handle);    
>>>
>>>     QUEUE_INIT(&client->node);
>>>     
>>>     QUEUE_INSERT_TAIL(&queue, &client->node);    
>>>     
>>>     r = uv_read_start((uv_stream_t*)&client->handle, alloc_cb, read_cb);
>>>      ASSERT(r == 0);        
>>> }
>>>
>>>
>>> static void alloc_cb(uv_handle_t* handle,
>>>                      size_t suggested_size,
>>>                      uv_buf_t* buf) {
>>>     //static char slab[65536];
>>>     static char slab[512];
>>>     buf->base = slab;
>>>     buf->len = sizeof(slab);    
>>> }
>>>
>>> void alloc_fs_cb(uv_handle_t* handle,
>>>                      size_t suggested_size,
>>>                      uv_buf_t* buf) {
>>>     static char slab[65536];
>>>     buf->base = slab;
>>>     buf->len = sizeof(slab);    
>>> }
>>>
>>>
>>> void read_stdin(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) 
>>> {
>>>     if (nread >= 0) {
>>>         broadcastMsg("test");  
>>>         return;
>>>         
>>>     }
>>>     
>>>     
>>>     ASSERT(nread == UV_EOF);    
>>>     ...
>>> }
>>>
>>> void setupus()
>>> {
>>>     
>>>
>>>     uv_fs_t file_req;
>>>     uv_pipe_t file_pipe;
>>>     
>>>     int fd = uv_fs_open(loop, &file_req, "path-to-usb", O_RDONLY, 0, 
>>> NULL);
>>>     
>>>     uv_pipe_init(loop, &file_pipe, 0);
>>>     uv_pipe_open(&file_pipe, fd);
>>>     
>>>     
>>>     uv_read_start((uv_stream_t*)&file_pipe, alloc_fs_cb, read_stdin);
>>> }
>>>
>>> int main(void) {
>>>     struct sockaddr_in addr;
>>>     int r;
>>>     
>>>     QUEUE_INIT(&queue);        
>>>     
>>>     loop = uv_default_loop();
>>>     r = uv_ip4_addr(SERVER_ADDR, SERVER_PORT, &addr);
>>>     
>>>     r = uv_tcp_init(loop, &tcp_server);
>>>     uv_tcp_keepalive(&tcp_server, 1, 5);
>>>     
>>>     r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
>>>     
>>>     r = uv_listen((uv_stream_t*)&tcp_server, 128, on_connection);
>>>       
>>>
>>>     setupus();
>>>         
>>>     r = uv_run(loop, UV_RUN_DEFAULT);
>>>         
>>>     return 0;
>>> }
>>>
>>>
>>> On Thursday, June 5, 2014 11:50:40 PM UTC-4, Fedor Indutny wrote:
>>>
>>>> Hello Jason,
>>>>
>>>> I'm afraid it is quite hard to say, what exactly is happening here 
>>>> without taking a look at the surrounding code.
>>>>
>>>> Could you please try to obtain a stack trace of the EXC_BAD_ACCESS that 
>>>> you are getting?
>>>>
>>>> Generally, one loop should be enough for all purposes!
>>>>
>>>> Cheers,
>>>> Fedor.
>>>>
>>>>
>>>> On Thu, Jun 5, 2014 at 11:11 PM, Jason W <[email protected]> wrote:
>>>>
>>>>> Hello, I develop a small program that has the following two things.
>>>>>
>>>>> 1. tcp server that and uses a queue to queue up client connections
>>>>>
>>>>> 2. make use of pipe to read events from usb
>>>>>
>>>>>
>>>>> Once an event is triggered by usb, the idea is to notify all the tcp 
>>>>> clients in the queue.  The connected tcp clients can receive the 
>>>>> message being published by the server with the following code on the 
>>>>> server side BUT my on_write function just keep getting called like 
>>>>> inifite loop.
>>>>>
>>>>>
>>>>> uv_write(&request, stream, &buf, nbufs, on_write);
>>>>>
>>>>>
>>>>> However if I change the above code w/ the following, I will get error 
>>>>> Thread 1:EXC_BAD_ACCESS (code=EX_i386_GPFLT)
>>>>>
>>>>>   
>>>>>
>>>>>         int byteWritten = uv_try_write(theStrPoint, &buf, nbufs);
>>>>>
>>>>>
>>>>>
>>>>> I only use the default loop and wonder whether I should create another 
>>>>> loop for the above 2 pipe thing?  
>>>>>
>>>>> My env is Mac using xcode and libuv version 0.11.25, could that also 
>>>>> be the unstable thing?  Thank you.
>>>>>  
>>>>> -- 
>>>>> 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.
>>>>>
>>>>
>>>>
>>
>

-- 
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