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] 
> <javascript:>> 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] <javascript:>.
>> To post to this group, send email to [email protected] <javascript:>
>> .
>> 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