Hm... I'd suggest to profile it, but it is probably just a bit wrong idea to use run loop synchronously in a `processBufferElement` handler.
On Mon, Jul 7, 2014 at 12:38 AM, Iñaki Baz Castillo <[email protected]> wrote: > No idea, but you are creating a new UV loop for each request to send! > not sure if you are releasing them after used. Anyhow I cannot help > too much with that design as IMHO it makes no sense at all to create a > UV loop for each action in your program. > > 2014-07-06 22:06 GMT+02:00 Claudio Bisegni <[email protected]>: > > Hi, > > i have the same setup of last my post. I have a class that need to send > > different message to a different server. So here is a queue of message > and > > some thread that call the follow method: > > > > void TCPUVClient::processBufferElement(NetworkForwardInfo *messageInfo, > > ElementManagingPolicy& elementPolicy) throw(CException) { > > > > struct sockaddr_in req_addr; > > > > std::vector<std::string> server_desc_tokens; > > > > boost::algorithm::split(server_desc_tokens, messageInfo->destinationAddr, > > boost::algorithm::is_any_of(":"), boost::algorithm::token_compress_on); > > > > uv_ip4_addr(server_desc_tokens[0].c_str(), > > boost::lexical_cast<int>(server_desc_tokens[1]), &req_addr); > > > > > > uv_loop_t client_loop; > > > > uv_tcp_t tcp_connection; > > > > uv_loop_init(&client_loop); > > > > uv_tcp_init(&client_loop, &tcp_connection); > > > > uv_tcp_keepalive(&tcp_connection, 1, 60); > > > > > > > > //prepare the data param of handle > > > > RequestInfo * ri = (RequestInfo*)std::calloc(1, sizeof(RequestInfo)); > > > > ri->messageInfo = messageInfo; > > > > //exec thennection > > > > tcp_connection.data = static_cast<void*>(ri); > > > > //start the connection > > > > uv_connect_t *conn = (uv_connect_t*)malloc(sizeof(uv_connect_t)); > > > > uv_tcp_connect(conn, &tcp_connection, (const struct sockaddr*)&req_addr, > > TCPUVClient::on_connect); > > > > uv_run(&client_loop, UV_RUN_DEFAULT); > > > > uv_loop_close(&client_loop); > > > > } > > > > > > I'm trying the case where the server is down so the on_connect method is > > called with status in error. > > > > > > void TCPUVClient::on_connect(uv_connect_t *connection, int status) { > > > > TCPUVClientLDBG << "on_connect " << status; > > > > RequestInfo *ri = static_cast<RequestInfo*>(connection->handle->data); > > > > if (status) { > > > > TCPUVClientLERR << "error on_connect" << uv_strerror(status); > > > > switch (status) { > > > > case ECONNREFUSED: > > > > TCPUVClientLERR << "ECONNREFUSED"; > > > > break; > > > > default: > > > > break; > > > > } > > > > uv_close((uv_handle_t*)connection->handle,TCPUVClient::on_close); > > > > } else { > > > > //get the data to send > > > > ri->serializationBuffer = > ri->messageInfo->message->getBSONData(); > > > > > > > > //initialize uv buffer > > > > uv_buf_t buf = > > uv_buf_init((char*)ri->serializationBuffer->getBufferPtr(), (unsigned > > int)ri->serializationBuffer->getBufferLen()); > > > > > > > > uv_write_t *request = (uv_write_t*)malloc(sizeof(uv_write_t)); > > > > uv_write(request, connection->handle, &buf, 1, > > TCPUVClient::on_write_end); > > > > } > > > > free(connection); > > > > } > > > > > > the last callback called is on close > > > > > > void TCPUVClient::on_close(uv_handle_t* handle) { > > > > LDBG_ << "TCPUVClient::on_close"; > > > > RequestInfo *ri = static_cast<RequestInfo*>(handle->data); > > > > //free(handle); > > > > DEALLOCATE_REQUEST_INFO(ri) > > > > } > > > > > > the DEALLOCATE_REQUEST_INFO macro erase all RequestInfo memory. > > > > > > All seems to work well except that after many connection all seems to > slow > > down very fast... after on minute the process hang for some seconds then > > began to work again. > > > > > > All memory is released an no leak are found. Any hints? > > > > > > thanks in advanced > > > > claudio > > > > -- > > 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. > > > > -- > Iñaki Baz Castillo > <[email protected]> > > -- > 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.
