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