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.
