touched up code for warp 4
This commit is contained in:
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user