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.