Yes.

On Fri, Jul 4, 2014 at 6:34 PM, Claudio Bisegni <[email protected]> wrote:

> thank for answer, so if i have mean,
> i can call free on on_connect(uv_connect_t *connection, int status) for
> the connection parameter and call onlcose only for the real socket..
> right?
>
> Il giorno mercoledì 2 luglio 2014 11:47:02 UTC+2, Fedor Indutny ha scritto:
>>
>> Hello!
>>
>> You don't need to `uv_close()` any request, just release the memory in
>> their callbacks.
>> This applies to `uv_write_t`, `uv_connect_t` and everything that doesn't
>> inherit from handle.
>>
>> `uv_close()` is closing underlying socket, so please call it only when
>> you are done with the socket and
>> do not want to receive or send anything on it.
>>
>> Cheers,
>> Fedor.
>>
>>
>> On Wed, Jul 2, 2014 at 1:40 PM, Claudio Bisegni <[email protected]>
>> wrote:
>>
>>> Hi i have some problem to well understand the libuv functionality on
>>> when deallocate the handler and stream.
>>>
>>> i have a cpp class that have a one uv_tcp_t instance for the client.
>>> When i need to send data to one server i do the following step:
>>>
>>> i use a struct RequestInfo * ri to keep the reference to the
>>> tcp_connection for close it.
>>>
>>> 1) allocate the connection with ri->tcp_connection = (uv_connect_t*)
>>> malloc(sizeof(uv_connect_t));
>>> 2) call the uv_tcp_connect(ri->tcp_connection, &client, (const struct
>>> sockaddr*)&req_addr, TCPUVClient::on_connect); where the 'client' is
>>> the unique instance of uv_tcp_t;
>>> 3) below my on connect:
>>>
>>> void TCPUVClient::on_connect(uv_connect_t *connection, int status) {
>>>
>>> RequestInfo *ri = static_cast<RequestInfo*>(connection->data);
>>>
>>> if (status) {
>>>
>>> TCPUVClientLERR << "error on_connect" << status;
>>>
>>> uv_close((uv_handle_t*)connection,TCPUVClient::on_close);
>>>
>>> DEALLOCATE_REQUEST_INFO(ri)
>>>
>>> return;
>>>
>>> }
>>>
>>>
>>>  //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());
>>>
>>>  //connect data to stream handler
>>>
>>> connection->handle->data = connection->data;
>>>
>>>  uv_write_t request;
>>>
>>> uv_write(&request, connection->handle, &buf, 1,
>>> TCPUVClient::on_write_end);
>>>
>>> }
>>>
>>>
>>> 4) after the data is sent i need to read the ack answer with:
>>>
>>> void TCPUVClient::on_ack_read(uv_stream_t *stream, ssize_t nread, const
>>> uv_buf_t* buf) {
>>>
>>> //delete the forward info class
>>>
>>> RequestInfo *ri = static_cast<RequestInfo*>(stream->data);
>>>
>>> stream->data = NULL;
>>>
>>>  if (nread>0) {
>>>
>>> auto_ptr<chaos::common::data::CDataWrapper> ack_result(new
>>> chaos::common::data::CDataWrapper(buf->base));
>>>
>>> LDBG_ << "TCPUVClient::on_ack_read message result------------------------
>>> ------";
>>>
>>> LDBG_ << ack_result->getJSONString();
>>>
>>> LDBG_ << "TCPUVClient::on_ack_read message result------------------------
>>> ------";
>>>
>>> //uv_close((uv_handle_t*) server, TCPUVClient::on_close);
>>>
>>> return;
>>>
>>> }
>>>
>>> uv_close((uv_handle_t*)stream, TCPUVClient::on_close);
>>>
>>> free(buf->base);
>>>
>>> DEALLOCATE_REQUEST_INFO(ri)
>>>
>>> }
>>>
>>>
>>> void TCPUVClient::on_write_end(uv_write_t *req, int status) {
>>>
>>> RequestInfo *ri = static_cast<RequestInfo*>(req->data);
>>>
>>> if (status) {
>>>
>>> TCPUVClientLERR << "error on_write_end ->" << status;
>>>
>>> uv_close((uv_handle_t*)ri->tcp_connection,TCPUVClient::on_close);
>>>
>>> DEALLOCATE_REQUEST_INFO(ri)
>>>
>>> return;
>>>
>>> }
>>>
>>>  uv_read_start(req->handle, TCPUVClient::alloc_buffer,
>>> TCPUVClient::on_ack_read);
>>>
>>> }
>>>
>>>
>>> my question is when i need to call uv_close for:
>>>
>>> *uv_write_t *req* contained in on_write_end
>>>
>>> *uv_stream_t *stream* contained in on_ack_read
>>>
>>> *uv_connect_t** *connection* contained in on_connection
>>>
>>>
>>> the client work but i don't now if i forgot to free memory.
>>>
>>>
>>> thanks in advanced for all group. And there is a good example on how
>>> work well with libuv?
>>>
>>> --
>>> 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.
>

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