revert 66063 + related commits: my dreams of zero-copy ecore-con transfers were shattered by the inconsistency of linux socket operations. way to go kernel developers.

SVN revision: 66078
This commit is contained in:
Mike Blumenkrantz 2011-12-10 07:34:45 +00:00
parent 5eeae75b21
commit 083d3466a1
5 changed files with 17 additions and 109 deletions

View File

@ -390,7 +390,3 @@
* Allow SSL certificates to be loaded for STARTTLS
* Added functions to set/get the hostname used for SSL certificate verification
* ecore_con_ssl_server_cafile_add() now accepts directories
2011-12-09 Mike Blumenkrantz
* Created optimized reading mechanism for remote server connections

View File

@ -1415,7 +1415,6 @@ AC_ARG_ENABLE([ipv6],
if test "x${have_ecore_con}" = "xyes" ; then
AC_CHECK_HEADERS([sys/ioctl.h winsock2.h])
# Verify IPV6 availability in headers
if test "x${want_ipv6}" != "xno" ; then
AC_CHECK_TYPES([struct ipv6_mreq],

View File

@ -38,14 +38,6 @@
# include <Evil.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
#endif
#ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
#endif
#include "Ecore.h"
#include "ecore_private.h"
#include "Ecore_Con.h"
@ -1012,11 +1004,7 @@ ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num,
Ecore_Con_Event_Server_Data *e;
e = ecore_con_event_server_data_alloc();
if (!e)
{
if (!duplicate) free(buf);
return;
}
EINA_SAFETY_ON_NULL_RETURN(e);
svr->event_count = eina_list_append(svr->event_count, e);
_ecore_con_server_timer_update(svr);
@ -1890,14 +1878,9 @@ error:
static void
_ecore_con_cl_read(Ecore_Con_Server *svr)
{
int num2 = 0, num = 0;
#ifdef FIONREAD
double lr;
unsigned char *buf = NULL;
#else
unsigned char buf[READBUFSIZ];
#endif
int num = 0;
Eina_Bool lost_server = EINA_TRUE;
unsigned char buf[READBUFSIZ];
DBG("svr=%p", svr);
@ -1912,50 +1895,23 @@ _ecore_con_cl_read(Ecore_Con_Server *svr)
lost_server = EINA_FALSE;
_ecore_con_server_timer_update(svr);
}
#ifdef FIONREAD
# ifdef _WIN32
if (ioctlsocket(svr->fd, FIONREAD, &num)) goto error;
# else
errno = 0;
if (ioctl(svr->fd, FIONREAD, &num)) goto error;
# endif
if (!num)
{
int flags;
/* FIXME: this shouldn't happen */
ERR("EEK! read of 0 bytes! your app has broken ecore-con!");
flags = ECORE_FD_WRITE * ecore_main_fd_handler_active_get(svr->fd_handler, ECORE_FD_WRITE);
ecore_main_fd_handler_active_set(svr->fd_handler, flags);
return;
}
lr = ecore_time_get();
if ((num < 100) && (lr - svr->last_read < 0.01)) num2 = READBUFSIZ / 8;
else if (num > READBUFSIZ) num2 = READBUFSIZ;
if (num2)
{
DBG("%d bytes available for read from ioctl(), trying size (%d) to avoid congestion", num, num2);
num = num2;
}
else
DBG("%d bytes available for read", num);
svr->last_read = lr;
buf = malloc(num);
if (!buf) goto error;
#else
num = sizeof(buf);
(void)num2;
#endif
if (svr->ecs_state || !(svr->type & ECORE_CON_SSL))
{
num = read(svr->fd, buf, num);
errno = 0;
num = read(svr->fd, buf, sizeof(buf));
/* 0 is not a valid return value for a tcp socket */
if ((num < 0) || (errno && (errno != EAGAIN))) goto error;
if ((num > 0) || ((num < 0) && (errno == EAGAIN)))
lost_server = EINA_FALSE;
else if (num < 0)
ecore_con_event_server_error(svr, strerror(errno));
}
else
{
num = ecore_con_ssl_server_read(svr, buf, num);
num = ecore_con_ssl_server_read(svr, buf, sizeof(buf));
/* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
if (num < 0) goto error;
if (num >= 0)
lost_server = EINA_FALSE;
}
if ((!svr->delete_me) && (num > 0))
@ -1963,31 +1919,11 @@ _ecore_con_cl_read(Ecore_Con_Server *svr)
if (svr->ecs_state)
ecore_con_socks_read(svr, buf, num);
else
ecore_con_event_server_data(svr, buf, num,
#ifdef FIONREAD
EINA_FALSE
#else
EINA_TRUE
#endif
);
ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
}
return;
error:
{
char *err;
#ifdef _WIN32
err = evil_format_message(WSAGetLastError());
_ecore_con_event_server_error(svr, err, EINA_FALSE);
#else
err = strerror(errno);
ecore_con_event_server_error(svr, err);
#endif
}
#ifdef FIONREAD
free(buf);
#endif
_ecore_con_server_kill(svr);
if (lost_server)
_ecore_con_server_kill(svr);
}
static Eina_Bool

View File

@ -150,7 +150,6 @@ struct _Ecore_Con_Server
const char *proxyip;
int proxyport;
/* endsocks */
/* SSL */
const char *verify_name;
#if USE_GNUTLS
gnutls_session_t session;
@ -166,9 +165,7 @@ struct _Ecore_Con_Server
SSL *ssl;
int ssl_err;
#endif
/* ENDSSL */
double start_time;
double last_read;
Ecore_Timer *until_deletion;
double disconnect_time;
double client_disconnect_time;

View File

@ -103,25 +103,11 @@ ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num)
DBG("SOCKS: %d bytes", num);
if (num < 8)
{
#ifdef FIONREAD
if (!svr->ecs_recvbuf)
svr->ecs_recvbuf = eina_binbuf_manage_new_length(buf, num);
else
eina_binbuf_append_length(svr->ecs_recvbuf, buf, num);
if (!svr->ecs_recvbuf) goto error;
#else
if (!svr->ecs_recvbuf) svr->ecs_recvbuf = eina_binbuf_new();
if (!svr->ecs_recvbuf) goto error;
eina_binbuf_append_length(svr->ecs_recvbuf, buf, num);
#endif
/* the slowest connection on earth */
if (eina_binbuf_length_get(svr->ecs_recvbuf) != 8)
{
#ifdef FIONREAD
free(buf);
#endif
return;
}
if (eina_binbuf_length_get(svr->ecs_recvbuf) != 8) return;
data = eina_binbuf_string_get(svr->ecs_recvbuf);
}
else if (num > 8) goto error;
@ -163,9 +149,6 @@ ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num)
svr->ecs_state = ECORE_CON_SOCKS_STATE_DONE;
INF("PROXY CONNECTED");
if (svr->ecs_recvbuf) eina_binbuf_free(svr->ecs_recvbuf);
#ifdef FIONREAD
else free(buf);
#endif
svr->ecs_recvbuf = NULL;
svr->ecs_buf_offset = svr->ecs_addrlen = 0;
memset(svr->ecs_addr, 0, sizeof(svr->ecs_addr));
@ -176,9 +159,6 @@ ecore_con_socks_read(Ecore_Con_Server *svr, unsigned char *buf, int num)
}
return;
error:
#ifdef FIONREAD
free(buf);
#endif
_ecore_con_server_kill(svr);
}