size_t len)
{
void *data = (void*) p->data;
+
+ // clear all values of pipe first.
+ p->passed_data = NULL;
+ p->already_read = 0;
+ p->len = 0;
+ p->message++;
+
if (!p->delete_me)
{
_ecore_unlock();
p->handler(data, buf, len);
_ecore_lock();
}
+
+ // free p->passed_data
+ free(buf);
}
static Eina_Bool
{
/* no data on first try through means an error */
_ecore_pipe_handler_call(p, NULL, 0);
- if (p->passed_data) free(p->passed_data);
- p->passed_data = NULL;
- p->already_read = 0;
- p->len = 0;
- p->message++;
pipe_close(p->fd_read);
p->fd_read = PIPE_FD_INVALID;
p->fd_handler = NULL;
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
_ecore_pipe_handler_call(p, NULL, 0);
- if (p->passed_data) free(p->passed_data);
- p->passed_data = NULL;
- p->already_read = 0;
- p->len = 0;
- p->message++;
pipe_close(p->fd_read);
p->fd_read = PIPE_FD_INVALID;
p->fd_handler = NULL;
if (p->len == 0)
{
_ecore_pipe_handler_call(p, NULL, 0);
- /* reset all values to 0 */
- if (p->passed_data) free(p->passed_data);
- p->passed_data = NULL;
- p->already_read = 0;
- p->len = 0;
- p->message++;
_ecore_pipe_unhandle(p);
return ECORE_CALLBACK_RENEW;
}
{
_ecore_pipe_handler_call(p, NULL, 0);
/* close the pipe */
- p->already_read = 0;
- p->len = 0;
- p->message++;
pipe_close(p->fd_read);
p->fd_read = PIPE_FD_INVALID;
p->fd_handler = NULL;
/* catch the non error case first */
/* if we read enough data to finish the message/buffer */
if (ret == (ssize_t)(p->len - p->already_read))
- {
- _ecore_pipe_handler_call(p, p->passed_data, p->len);
- free(p->passed_data);
- /* reset all values to 0 */
- p->passed_data = NULL;
- p->already_read = 0;
- p->len = 0;
- p->message++;
- }
+ _ecore_pipe_handler_call(p, p->passed_data, p->len);
else if (ret > 0)
{
/* more data left to read */
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
_ecore_pipe_handler_call(p, NULL, 0);
- if (p->passed_data) free(p->passed_data);
- p->passed_data = NULL;
- p->already_read = 0;
- p->len = 0;
- p->message++;
pipe_close(p->fd_read);
p->fd_read = PIPE_FD_INVALID;
p->fd_handler = NULL;