touched up code for warp 4

This commit is contained in:
2012-12-18 08:12:15 +00:00
parent 14648534b3
commit 1595a9a4f3
27 changed files with 772 additions and 514 deletions

View File

@ -30,12 +30,17 @@
# include <types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <tcpustd.h>
# include <sys/ioctl.h>
# include <nerrno.h>
# if defined(TCPV40HDRS)
# define USE_SELECT
# define BSD_SELECT
# include <sys/select.h>
# else
# include <unistd.h>
# endif
# define INCL_DOSERRORS
# include <os2.h>
# pragma library("tcpip32.lib")
#elif defined(__DOS__)
# include <errno.h>
@ -64,15 +69,7 @@ struct qse_mux_t
qse_mux_errnum_t errnum;
qse_mux_evtfun_t evtfun;
#if defined(__OS2__)
int* fdarr;
int size;
struct
{
qse_mux_evt_t** ptr;
int ubound;
} me;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
fd_set rset;
fd_set wset;
fd_set tmprset;
@ -98,6 +95,14 @@ struct qse_mux_t
qse_mux_evt_t** ptr;
int ubound;
} me;
#elif defined(__OS2__)
int* fdarr;
int size;
struct
{
qse_mux_evt_t** ptr;
int ubound;
} me;
#endif
};
@ -140,8 +145,10 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
#if defined(SOCENOMEM)
case SOCENOMEM:
return QSE_MUX_ENOMEM;
#endif
case SOCEINVAL:
return QSE_MUX_EINVAL;
@ -149,11 +156,15 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
case SOCEACCES:
return QSE_MUX_EACCES;
#if defined(SOCENOENT)
case SOCENOENT:
return QSE_MUX_ENOENT;
#endif
#if defined(SOCEEXIST)
case SOCEEXIST:
return QSE_MUX_EEXIST;
#endif
case SOCEINTR:
return QSE_MUX_EINTR;
@ -252,10 +263,7 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse
* event buffers */
if (capahint <= 0) capahint = 1;
#if defined(__OS2__)
/* nothing special to do */
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
FD_ZERO (&mux->rset);
FD_ZERO (&mux->wset);
mux->maxhnd = -1;
@ -281,6 +289,9 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse
}
#endif
#elif defined(__OS2__)
/* nothing special to do */
#else
/* TODO: */
mux->errnum = QSE_MUX_ENOIMPL;
@ -292,24 +303,8 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse
void qse_mux_fini (qse_mux_t* mux)
{
#if defined(__OS2__)
if (mux->me.ptr)
{
int i;
for (i = 0; i < mux->me.ubound; i++)
{
if (mux->me.ptr[i])
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr[i]);
}
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr);
mux->me.ubound = 0;
}
if (mux->fdarr) QSE_MMGR_FREE (mux->mmgr, mux->fdarr);
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
FD_ZERO (&mux->rset);
FD_ZERO (&mux->wset);
@ -351,6 +346,23 @@ void qse_mux_fini (qse_mux_t* mux)
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr);
mux->me.ubound = 0;
}
#elif defined(__OS2__)
if (mux->me.ptr)
{
int i;
for (i = 0; i < mux->me.ubound; i++)
{
if (mux->me.ptr[i])
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr[i]);
}
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr);
mux->me.ubound = 0;
}
if (mux->fdarr) QSE_MMGR_FREE (mux->mmgr, mux->fdarr);
#endif
}
@ -373,54 +385,7 @@ qse_mux_errnum_t qse_mux_geterrnum (qse_mux_t* mux)
int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
{
#if defined(__OS2__)
if (evt->hnd >= mux->me.ubound)
{
qse_mux_evt_t** tmp;
int* fatmp;
int ubound;
ubound = evt->hnd + 1;
ubound = ALIGN_TO (ubound, 128);
tmp = QSE_MMGR_REALLOC (mux->mmgr, mux->me.ptr, QSE_SIZEOF(*mux->me.ptr) * ubound);
if (tmp == QSE_NULL)
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
/* maintain this array double the size of the highest handle + 1 */
fatmp = QSE_MMGR_REALLOC (mux->mmgr, mux->fdarr, QSE_SIZEOF(*mux->fdarr) * (ubound * 2));
if (fatmp == QSE_NULL)
{
QSE_MMGR_FREE (mux->mmgr, tmp);
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
QSE_MEMSET (&tmp[mux->me.ubound], 0, QSE_SIZEOF(*mux->me.ptr) * (ubound - mux->me.ubound));
mux->me.ptr = tmp;
mux->me.ubound = ubound;
mux->fdarr = fatmp;
}
if (!mux->me.ptr[evt->hnd])
{
mux->me.ptr[evt->hnd] = QSE_MMGR_ALLOC (mux->mmgr, QSE_SIZEOF(*evt));
if (!mux->me.ptr[evt->hnd])
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
}
*mux->me.ptr[evt->hnd] = *evt;
mux->size++;
return 0;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
/* TODO: windows seems to return a pretty high file descriptors
* using an array to store information may not be so effcient.
@ -540,6 +505,54 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
mux->ee.len++;
return 0;
#elif defined(__OS2__)
if (evt->hnd >= mux->me.ubound)
{
qse_mux_evt_t** tmp;
int* fatmp;
int ubound;
ubound = evt->hnd + 1;
ubound = ALIGN_TO (ubound, 128);
tmp = QSE_MMGR_REALLOC (mux->mmgr, mux->me.ptr, QSE_SIZEOF(*mux->me.ptr) * ubound);
if (tmp == QSE_NULL)
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
/* maintain this array double the size of the highest handle + 1 */
fatmp = QSE_MMGR_REALLOC (mux->mmgr, mux->fdarr, QSE_SIZEOF(*mux->fdarr) * (ubound * 2));
if (fatmp == QSE_NULL)
{
QSE_MMGR_FREE (mux->mmgr, tmp);
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
QSE_MEMSET (&tmp[mux->me.ubound], 0, QSE_SIZEOF(*mux->me.ptr) * (ubound - mux->me.ubound));
mux->me.ptr = tmp;
mux->me.ubound = ubound;
mux->fdarr = fatmp;
}
if (!mux->me.ptr[evt->hnd])
{
mux->me.ptr[evt->hnd] = QSE_MMGR_ALLOC (mux->mmgr, QSE_SIZEOF(*evt));
if (!mux->me.ptr[evt->hnd])
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
}
*mux->me.ptr[evt->hnd] = *evt;
mux->size++;
return 0;
#else
/* TODO: */
mux->errnum = QSE_MUX_ENOIMPL;
@ -549,30 +562,7 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
int qse_mux_delete (qse_mux_t* mux, const qse_mux_evt_t* evt)
{
#if defined(__OS2__)
qse_mux_evt_t* mevt;
if (mux->size <= 0 || evt->hnd < 0 || evt->hnd >= mux->me.ubound)
{
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt = mux->me.ptr[evt->hnd];
if (mevt->hnd != evt->hnd)
{
/* already deleted??? */
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt->hnd = -1;
mevt->mask = 0;
mux->size--;
return 0;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
qse_mux_evt_t* mevt;
if (mux->size <= 0 || evt->hnd < 0 || evt->hnd >= mux->me.ubound)
@ -632,6 +622,30 @@ done:
mux->ee.len--;
return 0;
#elif defined(__OS2__)
qse_mux_evt_t* mevt;
if (mux->size <= 0 || evt->hnd < 0 || evt->hnd >= mux->me.ubound)
{
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt = mux->me.ptr[evt->hnd];
if (mevt->hnd != evt->hnd)
{
/* already deleted??? */
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt->hnd = -1;
mevt->mask = 0;
mux->size--;
return 0;
#else
/* TODO */
@ -642,63 +656,7 @@ done:
int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
{
#if defined(__OS2__)
qse_mux_evt_t* evt;
long tv;
int n, i, count, rcount, wcount;
tv = QSE_SEC_TO_MSEC(tmout->sec) + QSE_NSEC_TO_MSEC (tmout->nsec);
/*
* be aware that reconstructing this array every time is pretty
* inefficient.
*/
count = 0;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_IN)) mux->fdarr[count++] = evt->hnd;
}
rcount = count;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_OUT)) mux->fdarr[count++] = evt->hnd;
}
wcount = count - rcount;
n = os2_select (mux->fdarr, rcount, wcount, 0, tv);
if (n <= -1)
{
mux->errnum = syserr_to_errnum(sock_errno());
return -1;
}
if (n >= 1)
{
qse_mux_evt_t xevt;
for (i = 0; i < count; i++)
{
if (mux->fdarr[i] == -1) continue;
evt = mux->me.ptr[mux->fdarr[i]];
if (!evt || evt->hnd != mux->fdarr[i]) continue;
xevt = *evt;
/* due to the way i check 'fdarr' , it can't have
* both IN and OUT at the same time. they are
* triggered separately */
xevt.mask = (i < rcount)? QSE_MUX_IN: QSE_MUX_OUT;
mux->evtfun (mux, &xevt);
}
}
return n;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
struct timeval tv;
int n;
@ -782,6 +740,63 @@ int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
return nfds;
#elif defined(__OS2__)
qse_mux_evt_t* evt;
long tv;
int n, i, count, rcount, wcount;
tv = QSE_SEC_TO_MSEC(tmout->sec) + QSE_NSEC_TO_MSEC (tmout->nsec);
/*
* be aware that reconstructing this array every time is pretty
* inefficient.
*/
count = 0;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_IN)) mux->fdarr[count++] = evt->hnd;
}
rcount = count;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_OUT)) mux->fdarr[count++] = evt->hnd;
}
wcount = count - rcount;
n = os2_select (mux->fdarr, rcount, wcount, 0, tv);
if (n <= -1)
{
mux->errnum = syserr_to_errnum(sock_errno());
return -1;
}
if (n >= 1)
{
qse_mux_evt_t xevt;
for (i = 0; i < count; i++)
{
if (mux->fdarr[i] == -1) continue;
evt = mux->me.ptr[mux->fdarr[i]];
if (!evt || evt->hnd != mux->fdarr[i]) continue;
xevt = *evt;
/* due to the way i check 'fdarr' , it can't have
* both IN and OUT at the same time. they are
* triggered separately */
xevt.mask = (i < rcount)? QSE_MUX_IN: QSE_MUX_OUT;
mux->evtfun (mux, &xevt);
}
}
return n;
#else
/* TODO */
mux->errnum = QSE_MUX_ENOIMPL;