enhanced event handlings a bit
This commit is contained in:
parent
e0736bd657
commit
cccb7bee65
@ -29,8 +29,6 @@ pkginclude_HEADERS = \
|
|||||||
pkglib_LTLIBRARIES = libstio.la
|
pkglib_LTLIBRARIES = libstio.la
|
||||||
libstio_la_SOURCES = \
|
libstio_la_SOURCES = \
|
||||||
stio-prv.h \
|
stio-prv.h \
|
||||||
stio-tim.h \
|
|
||||||
stio-tmr.h \
|
|
||||||
stio.c \
|
stio.c \
|
||||||
stio-sck.c \
|
stio-sck.c \
|
||||||
stio-tcp.c \
|
stio-tcp.c \
|
||||||
|
@ -386,8 +386,6 @@ pkginclude_HEADERS = \
|
|||||||
pkglib_LTLIBRARIES = libstio.la
|
pkglib_LTLIBRARIES = libstio.la
|
||||||
libstio_la_SOURCES = \
|
libstio_la_SOURCES = \
|
||||||
stio-prv.h \
|
stio-prv.h \
|
||||||
stio-tim.h \
|
|
||||||
stio-tmr.h \
|
|
||||||
stio.c \
|
stio.c \
|
||||||
stio-sck.c \
|
stio-sck.c \
|
||||||
stio-tcp.c \
|
stio-tcp.c \
|
||||||
|
@ -176,8 +176,8 @@ int main ()
|
|||||||
memset (&sin, 0, STIO_SIZEOF(sin));
|
memset (&sin, 0, STIO_SIZEOF(sin));
|
||||||
sin.sin_family = AF_INET;
|
sin.sin_family = AF_INET;
|
||||||
sin.sin_port = htons(9999);
|
sin.sin_port = htons(9999);
|
||||||
//inet_pton (sin.sin_family, "192.168.1.1", &sin.sin_addr);
|
inet_pton (sin.sin_family, "192.168.1.1", &sin.sin_addr);
|
||||||
inet_pton (sin.sin_family, "127.0.0.1", &sin.sin_addr);
|
//inet_pton (sin.sin_family, "127.0.0.1", &sin.sin_addr);
|
||||||
|
|
||||||
memset (&tcp_conn, 0, STIO_SIZEOF(tcp_conn));
|
memset (&tcp_conn, 0, STIO_SIZEOF(tcp_conn));
|
||||||
memcpy (&tcp_conn.addr, &sin, STIO_SIZEOF(sin));
|
memcpy (&tcp_conn.addr, &sin, STIO_SIZEOF(sin));
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#define _STIO_PRV_H_
|
#define _STIO_PRV_H_
|
||||||
|
|
||||||
#include "stio.h"
|
#include "stio.h"
|
||||||
#include "stio-tim.h"
|
|
||||||
|
|
||||||
#include <sys/epoll.h>
|
#include <sys/epoll.h>
|
||||||
|
|
||||||
@ -42,6 +41,9 @@
|
|||||||
#define STIO_MEMMOVE(dst,src,count) memmove(dst,src,count)
|
#define STIO_MEMMOVE(dst,src,count) memmove(dst,src,count)
|
||||||
#define STIO_ASSERT assert
|
#define STIO_ASSERT assert
|
||||||
|
|
||||||
|
|
||||||
|
#define STIO_USE_TMRJOB_IDXPTR
|
||||||
|
|
||||||
struct stio_tmrjob_t
|
struct stio_tmrjob_t
|
||||||
{
|
{
|
||||||
void* ctx;
|
void* ctx;
|
||||||
@ -87,6 +89,68 @@ struct stio_t
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define STIO_EPOCH_YEAR (1970)
|
||||||
|
#define STIO_EPOCH_MON (1)
|
||||||
|
#define STIO_EPOCH_DAY (1)
|
||||||
|
#define STIO_EPOCH_WDAY (4)
|
||||||
|
|
||||||
|
/* windows specific epoch time */
|
||||||
|
#define STIO_EPOCH_YEAR_WIN (1601)
|
||||||
|
#define STIO_EPOCH_MON_WIN (1)
|
||||||
|
#define STIO_EPOCH_DAY_WIN (1)
|
||||||
|
|
||||||
|
#define STIO_DAYS_PER_WEEK (7)
|
||||||
|
#define STIO_MONS_PER_YEAR (12)
|
||||||
|
#define STIO_HOURS_PER_DAY (24)
|
||||||
|
#define STIO_MINS_PER_HOUR (60)
|
||||||
|
#define STIO_MINS_PER_DAY (STIO_MINS_PER_HOUR*STIO_HOURS_PER_DAY)
|
||||||
|
#define STIO_SECS_PER_MIN (60)
|
||||||
|
#define STIO_SECS_PER_HOUR (STIO_SECS_PER_MIN*STIO_MINS_PER_HOUR)
|
||||||
|
#define STIO_SECS_PER_DAY (STIO_SECS_PER_MIN*STIO_MINS_PER_DAY)
|
||||||
|
#define STIO_MSECS_PER_SEC (1000)
|
||||||
|
#define STIO_MSECS_PER_MIN (STIO_MSECS_PER_SEC*STIO_SECS_PER_MIN)
|
||||||
|
#define STIO_MSECS_PER_HOUR (STIO_MSECS_PER_SEC*STIO_SECS_PER_HOUR)
|
||||||
|
#define STIO_MSECS_PER_DAY (STIO_MSECS_PER_SEC*STIO_SECS_PER_DAY)
|
||||||
|
|
||||||
|
#define STIO_USECS_PER_MSEC (1000)
|
||||||
|
#define STIO_NSECS_PER_USEC (1000)
|
||||||
|
#define STIO_NSECS_PER_MSEC (STIO_NSECS_PER_USEC*STIO_USECS_PER_MSEC)
|
||||||
|
#define STIO_USECS_PER_SEC (STIO_USECS_PER_MSEC*STIO_MSECS_PER_SEC)
|
||||||
|
#define STIO_NSECS_PER_SEC (STIO_NSECS_PER_USEC*STIO_USECS_PER_MSEC*STIO_MSECS_PER_SEC)
|
||||||
|
|
||||||
|
#define STIO_SECNSEC_TO_MSEC(sec,nsec) \
|
||||||
|
(((stio_intptr_t)(sec) * STIO_MSECS_PER_SEC) + ((stio_intptr_t)(nsec) / STIO_NSECS_PER_MSEC))
|
||||||
|
|
||||||
|
#define STIO_SECNSEC_TO_USEC(sec,nsec) \
|
||||||
|
(((stio_intptr_t)(sec) * STIO_USECS_PER_SEC) + ((stio_intptr_t)(nsec) / STIO_NSECS_PER_USEC))
|
||||||
|
|
||||||
|
#define STIO_SEC_TO_MSEC(sec) ((sec) * STIO_MSECS_PER_SEC)
|
||||||
|
#define STIO_MSEC_TO_SEC(sec) ((sec) / STIO_MSECS_PER_SEC)
|
||||||
|
|
||||||
|
#define STIO_USEC_TO_NSEC(usec) ((usec) * STIO_NSECS_PER_USEC)
|
||||||
|
#define STIO_NSEC_TO_USEC(nsec) ((nsec) / STIO_NSECS_PER_USEC)
|
||||||
|
|
||||||
|
#define STIO_MSEC_TO_NSEC(msec) ((msec) * STIO_NSECS_PER_MSEC)
|
||||||
|
#define STIO_NSEC_TO_MSEC(nsec) ((nsec) / STIO_NSECS_PER_MSEC)
|
||||||
|
|
||||||
|
#define STIO_SEC_TO_NSEC(sec) ((sec) * STIO_NSECS_PER_SEC)
|
||||||
|
#define STIO_NSEC_TO_SEC(nsec) ((nsec) / STIO_NSECS_PER_SEC)
|
||||||
|
|
||||||
|
#define STIO_SEC_TO_USEC(sec) ((sec) * STIO_USECS_PER_SEC)
|
||||||
|
#define STIO_USEC_TO_SEC(usec) ((usec) / STIO_USECS_PER_SEC)
|
||||||
|
|
||||||
|
#define stio_inittime(x,s,ns) (((x)->sec = (s)), ((x)->nsec = (ns)))
|
||||||
|
#define stio_cleartime(x) stio_inittime(x,0,0)
|
||||||
|
/*#define stio_cleartime(x) ((x)->sec = (x)->nsec = 0)*/
|
||||||
|
#define stio_cmptime(x,y) \
|
||||||
|
(((x)->sec == (y)->sec)? ((x)->nsec - (y)->nsec): \
|
||||||
|
((x)->sec - (y)->sec))
|
||||||
|
|
||||||
|
#define stio_iszerotime(x) ((x)->sec == 0 && (x)->nsec == 0)
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -100,6 +164,32 @@ int stio_makesckasync (stio_sckhnd_t sck);
|
|||||||
int stio_getsckadrinfo (stio_t* stio, const stio_sckadr_t* addr, stio_scklen_t* len, stio_sckfam_t* family);
|
int stio_getsckadrinfo (stio_t* stio, const stio_sckadr_t* addr, stio_scklen_t* len, stio_sckfam_t* family);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The stio_gettime() function gets the current time.
|
||||||
|
*/
|
||||||
|
STIO_EXPORT void stio_gettime (
|
||||||
|
stio_ntime_t* nt
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The stio_addtime() function adds x and y and stores the result in z
|
||||||
|
*/
|
||||||
|
STIO_EXPORT void stio_addtime (
|
||||||
|
const stio_ntime_t* x,
|
||||||
|
const stio_ntime_t* y,
|
||||||
|
stio_ntime_t* z
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The stio_subtime() function subtract y from x and stores the result in z.
|
||||||
|
*/
|
||||||
|
STIO_EXPORT void stio_subtime (
|
||||||
|
const stio_ntime_t* x,
|
||||||
|
const stio_ntime_t* y,
|
||||||
|
stio_ntime_t* z
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The stio_instmrjob() function schedules a new event.
|
* The stio_instmrjob() function schedules a new event.
|
||||||
*
|
*
|
||||||
|
@ -88,7 +88,7 @@ static void tcp_kill (stio_dev_t* dev)
|
|||||||
{
|
{
|
||||||
stio_dev_tcp_t* tcp = (stio_dev_tcp_t*)dev;
|
stio_dev_tcp_t* tcp = (stio_dev_tcp_t*)dev;
|
||||||
|
|
||||||
if (tcp->state & (STIO_DEV_TCP_ACCEPTED | STIO_DEV_TCP_CONNECTED))
|
if (tcp->state & (STIO_DEV_TCP_ACCEPTED | STIO_DEV_TCP_CONNECTED | STIO_DEV_TCP_CONNECTING | STIO_DEV_TCP_LISTENING))
|
||||||
{
|
{
|
||||||
if (tcp->on_disconnected) tcp->on_disconnected (tcp);
|
if (tcp->on_disconnected) tcp->on_disconnected (tcp);
|
||||||
}
|
}
|
||||||
@ -160,12 +160,15 @@ static void tmr_connect_handle (stio_t* stio, const stio_ntime_t* now, stio_tmrj
|
|||||||
|
|
||||||
if (tcp->state & STIO_DEV_TCP_CONNECTING)
|
if (tcp->state & STIO_DEV_TCP_CONNECTING)
|
||||||
{
|
{
|
||||||
/* the state check is actually redundant as it must not be fired
|
/* the state check for STIO_DEV_TCP_CONNECTING is actually redundant
|
||||||
* after it gets connected. the timer job doesn't need to be deleted
|
* as it must not be fired after it gets connected. the timer job
|
||||||
* when it gets connected for this check here */
|
* doesn't need to be deleted when it gets connected for this check
|
||||||
|
* here. this libarary, however, deletes the job when it gets
|
||||||
|
* connected. */
|
||||||
|
/*
|
||||||
if (tcp->on_disconnected) tcp->on_disconnected (tcp);
|
if (tcp->on_disconnected) tcp->on_disconnected (tcp);
|
||||||
|
|
||||||
tcp->state &= ~STIO_DEV_TCP_CONNECTING;
|
tcp->state &= ~STIO_DEV_TCP_CONNECTING;
|
||||||
|
*/
|
||||||
stio_dev_tcp_kill (tcp);
|
stio_dev_tcp_kill (tcp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -341,24 +344,39 @@ static int tcp_ready (stio_dev_t* dev, int events)
|
|||||||
stio_dev_tcp_t* tcp = (stio_dev_tcp_t*)dev;
|
stio_dev_tcp_t* tcp = (stio_dev_tcp_t*)dev;
|
||||||
printf ("TCP READY...%p\n", dev);
|
printf ("TCP READY...%p\n", dev);
|
||||||
|
|
||||||
|
if (events & STIO_DEV_EVENT_ERR)
|
||||||
|
{
|
||||||
|
int errcode;
|
||||||
|
stio_scklen_t len;
|
||||||
|
|
||||||
|
len = STIO_SIZEOF(errcode);
|
||||||
|
if (getsockopt (tcp->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
|
||||||
|
{
|
||||||
|
/* the error number is set to the socket error code.
|
||||||
|
* errno resulting from getsockopt() doesn't reflect the actual
|
||||||
|
* socket error. so errno is not used to set the error number.
|
||||||
|
* instead, the generic device error STIO_EDEVERRR is used */
|
||||||
|
tcp->stio->errnum = STIO_EDEVERR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tcp->stio->errnum = stio_syserrtoerrnum (errcode);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (tcp->state & STIO_DEV_TCP_CONNECTING)
|
if (tcp->state & STIO_DEV_TCP_CONNECTING)
|
||||||
{
|
{
|
||||||
if (events & (STIO_DEV_EVENT_ERR | STIO_DEV_EVENT_HUP | STIO_DEV_EVENT_PRI | STIO_DEV_EVENT_IN))
|
if (events & STIO_DEV_EVENT_HUP)
|
||||||
{
|
{
|
||||||
int errcode;
|
/* device hang-up */
|
||||||
stio_scklen_t len;
|
tcp->stio->errnum = STIO_EDEVHUP;
|
||||||
|
return -1;
|
||||||
len = STIO_SIZEOF(errcode);
|
}
|
||||||
if (getsockopt (tcp->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
|
else if (events & (STIO_DEV_EVENT_PRI | STIO_DEV_EVENT_IN))
|
||||||
{
|
{
|
||||||
printf ("CANNOT CONNECT ERRORCODE - %s\n", strerror(errcode));
|
/* invalid event masks. generic device error */
|
||||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
tcp->stio->errnum = STIO_EDEVERR;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tcp->stio->errnum = stio_syserrtoerrnum(errcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (events & STIO_DEV_EVENT_OUT)
|
else if (events & STIO_DEV_EVENT_OUT)
|
||||||
@ -413,57 +431,73 @@ printf ("CAANOT MANIPULTE EVENT ...\n");
|
|||||||
}
|
}
|
||||||
else if (tcp->state & STIO_DEV_TCP_LISTENING)
|
else if (tcp->state & STIO_DEV_TCP_LISTENING)
|
||||||
{
|
{
|
||||||
stio_sckhnd_t clisck;
|
if (events & STIO_DEV_EVENT_HUP)
|
||||||
stio_sckadr_t peer;
|
|
||||||
stio_scklen_t addrlen;
|
|
||||||
stio_dev_tcp_t* clitcp;
|
|
||||||
|
|
||||||
/* this is a server(lisening) socket */
|
|
||||||
|
|
||||||
addrlen = STIO_SIZEOF(peer);
|
|
||||||
clisck = accept (tcp->sck, (struct sockaddr*)&peer, &addrlen);
|
|
||||||
if (clisck == -1)
|
|
||||||
{
|
{
|
||||||
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0;
|
/* device hang-up */
|
||||||
if (errno == EINTR) return 0; /* if interrupted by a signal, treat it as if it's EINPROGRESS */
|
tcp->stio->errnum = STIO_EDEVHUP;
|
||||||
|
|
||||||
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if (events & (STIO_DEV_EVENT_PRI | STIO_DEV_EVENT_OUT))
|
||||||
|
|
||||||
/* addr is the address of the peer */
|
|
||||||
/* local addresss is inherited from the server */
|
|
||||||
clitcp = (stio_dev_tcp_t*)stio_makedev (tcp->stio, STIO_SIZEOF(*tcp), &tcp_acc_mth, tcp->evcb, &clisck);
|
|
||||||
if (!clitcp)
|
|
||||||
{
|
{
|
||||||
close (clisck);
|
tcp->stio->errnum = STIO_EDEVERR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
else if (events & STIO_DEV_EVENT_IN)
|
||||||
|
{
|
||||||
|
stio_sckhnd_t clisck;
|
||||||
|
stio_sckadr_t peer;
|
||||||
|
stio_scklen_t addrlen;
|
||||||
|
stio_dev_tcp_t* clitcp;
|
||||||
|
|
||||||
clitcp->state |= STIO_DEV_TCP_ACCEPTED;
|
/* this is a server(lisening) socket */
|
||||||
clitcp->peer = peer;
|
|
||||||
clitcp->parent = tcp;
|
addrlen = STIO_SIZEOF(peer);
|
||||||
|
clisck = accept (tcp->sck, (struct sockaddr*)&peer, &addrlen);
|
||||||
|
if (clisck == -1)
|
||||||
|
{
|
||||||
|
if (errno == EINPROGRESS || errno == EWOULDBLOCK) return 0;
|
||||||
|
if (errno == EINTR) return 0; /* if interrupted by a signal, treat it as if it's EINPROGRESS */
|
||||||
|
|
||||||
|
tcp->stio->errnum = stio_syserrtoerrnum(errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* addr is the address of the peer */
|
||||||
|
/* local addresss is inherited from the server */
|
||||||
|
clitcp = (stio_dev_tcp_t*)stio_makedev (tcp->stio, STIO_SIZEOF(*tcp), &tcp_acc_mth, tcp->evcb, &clisck);
|
||||||
|
if (!clitcp)
|
||||||
|
{
|
||||||
|
close (clisck);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
clitcp->state |= STIO_DEV_TCP_ACCEPTED;
|
||||||
|
clitcp->peer = peer;
|
||||||
|
/*clitcp->parent = tcp;*/
|
||||||
|
|
||||||
|
|
||||||
/* inherit some event handlers from the parent.
|
/* inherit some event handlers from the parent.
|
||||||
* you can still change them inside the on_connected handler */
|
* you can still change them inside the on_connected handler */
|
||||||
clitcp->on_connected = tcp->on_connected;
|
clitcp->on_connected = tcp->on_connected;
|
||||||
clitcp->on_disconnected = tcp->on_disconnected;
|
clitcp->on_disconnected = tcp->on_disconnected;
|
||||||
clitcp->on_sent = tcp->on_sent;
|
clitcp->on_sent = tcp->on_sent;
|
||||||
clitcp->on_recv = tcp->on_recv;
|
clitcp->on_recv = tcp->on_recv;
|
||||||
|
|
||||||
clitcp->tmridx_connect = STIO_TMRIDX_INVALID;
|
clitcp->tmridx_connect = STIO_TMRIDX_INVALID;
|
||||||
if (clitcp->on_connected (clitcp) <= -1) stio_dev_tcp_kill (clitcp);
|
if (clitcp->on_connected (clitcp) <= -1) stio_dev_tcp_kill (clitcp);
|
||||||
return 0; /* success but don't invoke on_recv() */
|
return 0; /* success but don't invoke on_recv() */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else if (events & STIO_DEV_EVENT_HUP)
|
||||||
printf ("READY WITH %d\n", events);
|
|
||||||
|
|
||||||
if (events & (STIO_DEV_EVENT_ERR | STIO_DEV_EVENT_HUP))
|
|
||||||
{
|
{
|
||||||
printf ("DISCONNECTED or ERROR \n");
|
if (events & (STIO_DEV_EVENT_PRI | STIO_DEV_EVENT_IN | STIO_DEV_EVENT_OUT))
|
||||||
return -1; /* the caller must kill the device */
|
{
|
||||||
|
/* probably half-open? */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tcp->stio->errnum = STIO_EDEVHUP;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1; /* the device is ok. carry on reading or writing */
|
return 1; /* the device is ok. carry on reading or writing */
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#define _STIO_TCP_H_
|
#define _STIO_TCP_H_
|
||||||
|
|
||||||
#include <stio.h>
|
#include <stio.h>
|
||||||
#include <stio-tim.h>
|
|
||||||
|
|
||||||
enum stio_dev_tcp_ioctl_cmd_t
|
enum stio_dev_tcp_ioctl_cmd_t
|
||||||
{
|
{
|
||||||
@ -72,7 +71,7 @@ struct stio_dev_tcp_t
|
|||||||
stio_sckadr_t peer;
|
stio_sckadr_t peer;
|
||||||
|
|
||||||
/* parent tcp device. valid if STIO_DEV_TCP_ACCEPTED is set */
|
/* parent tcp device. valid if STIO_DEV_TCP_ACCEPTED is set */
|
||||||
stio_dev_tcp_t* parent;
|
/*stio_dev_tcp_t* parent;*/
|
||||||
|
|
||||||
/** return 0 on succes, -1 on failure/
|
/** return 0 on succes, -1 on failure/
|
||||||
* called on a new tcp device for an accepted client or
|
* called on a new tcp device for an accepted client or
|
||||||
@ -125,7 +124,7 @@ struct stio_dev_tcp_accept_t
|
|||||||
{
|
{
|
||||||
stio_syshnd_t sck;
|
stio_syshnd_t sck;
|
||||||
/* TODO: add timeout */
|
/* TODO: add timeout */
|
||||||
stio_dev_tcp_t* parent; /* TODO: is this really needed? */
|
/*stio_dev_tcp_t* parent;*/
|
||||||
stio_sckadr_t peer;
|
stio_sckadr_t peer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "stio-tim.h"
|
|
||||||
#include "stio-prv.h"
|
#include "stio-prv.h"
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
|
@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
Copyright (c) 2015-2016 Chung, Hyung-Hwan. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _STIO_TIME_H_
|
|
||||||
#define _STIO_TIME_H_
|
|
||||||
|
|
||||||
#include <stio.h>
|
|
||||||
|
|
||||||
#define STIO_EPOCH_YEAR (1970)
|
|
||||||
#define STIO_EPOCH_MON (1)
|
|
||||||
#define STIO_EPOCH_DAY (1)
|
|
||||||
#define STIO_EPOCH_WDAY (4)
|
|
||||||
|
|
||||||
/* windows specific epoch time */
|
|
||||||
#define STIO_EPOCH_YEAR_WIN (1601)
|
|
||||||
#define STIO_EPOCH_MON_WIN (1)
|
|
||||||
#define STIO_EPOCH_DAY_WIN (1)
|
|
||||||
|
|
||||||
#define STIO_DAYS_PER_WEEK (7)
|
|
||||||
#define STIO_MONS_PER_YEAR (12)
|
|
||||||
#define STIO_HOURS_PER_DAY (24)
|
|
||||||
#define STIO_MINS_PER_HOUR (60)
|
|
||||||
#define STIO_MINS_PER_DAY (STIO_MINS_PER_HOUR*STIO_HOURS_PER_DAY)
|
|
||||||
#define STIO_SECS_PER_MIN (60)
|
|
||||||
#define STIO_SECS_PER_HOUR (STIO_SECS_PER_MIN*STIO_MINS_PER_HOUR)
|
|
||||||
#define STIO_SECS_PER_DAY (STIO_SECS_PER_MIN*STIO_MINS_PER_DAY)
|
|
||||||
#define STIO_MSECS_PER_SEC (1000)
|
|
||||||
#define STIO_MSECS_PER_MIN (STIO_MSECS_PER_SEC*STIO_SECS_PER_MIN)
|
|
||||||
#define STIO_MSECS_PER_HOUR (STIO_MSECS_PER_SEC*STIO_SECS_PER_HOUR)
|
|
||||||
#define STIO_MSECS_PER_DAY (STIO_MSECS_PER_SEC*STIO_SECS_PER_DAY)
|
|
||||||
|
|
||||||
#define STIO_USECS_PER_MSEC (1000)
|
|
||||||
#define STIO_NSECS_PER_USEC (1000)
|
|
||||||
#define STIO_NSECS_PER_MSEC (STIO_NSECS_PER_USEC*STIO_USECS_PER_MSEC)
|
|
||||||
#define STIO_USECS_PER_SEC (STIO_USECS_PER_MSEC*STIO_MSECS_PER_SEC)
|
|
||||||
#define STIO_NSECS_PER_SEC (STIO_NSECS_PER_USEC*STIO_USECS_PER_MSEC*STIO_MSECS_PER_SEC)
|
|
||||||
|
|
||||||
#define STIO_SECNSEC_TO_MSEC(sec,nsec) \
|
|
||||||
(((stio_intptr_t)(sec) * STIO_MSECS_PER_SEC) + ((stio_intptr_t)(nsec) / STIO_NSECS_PER_MSEC))
|
|
||||||
|
|
||||||
#define STIO_SECNSEC_TO_USEC(sec,nsec) \
|
|
||||||
(((stio_intptr_t)(sec) * STIO_USECS_PER_SEC) + ((stio_intptr_t)(nsec) / STIO_NSECS_PER_USEC))
|
|
||||||
|
|
||||||
#define STIO_SEC_TO_MSEC(sec) ((sec) * STIO_MSECS_PER_SEC)
|
|
||||||
#define STIO_MSEC_TO_SEC(sec) ((sec) / STIO_MSECS_PER_SEC)
|
|
||||||
|
|
||||||
#define STIO_USEC_TO_NSEC(usec) ((usec) * STIO_NSECS_PER_USEC)
|
|
||||||
#define STIO_NSEC_TO_USEC(nsec) ((nsec) / STIO_NSECS_PER_USEC)
|
|
||||||
|
|
||||||
#define STIO_MSEC_TO_NSEC(msec) ((msec) * STIO_NSECS_PER_MSEC)
|
|
||||||
#define STIO_NSEC_TO_MSEC(nsec) ((nsec) / STIO_NSECS_PER_MSEC)
|
|
||||||
|
|
||||||
#define STIO_SEC_TO_NSEC(sec) ((sec) * STIO_NSECS_PER_SEC)
|
|
||||||
#define STIO_NSEC_TO_SEC(nsec) ((nsec) / STIO_NSECS_PER_SEC)
|
|
||||||
|
|
||||||
#define STIO_SEC_TO_USEC(sec) ((sec) * STIO_USECS_PER_SEC)
|
|
||||||
#define STIO_USEC_TO_SEC(usec) ((usec) / STIO_USECS_PER_SEC)
|
|
||||||
|
|
||||||
#define stio_inittime(x,s,ns) (((x)->sec = (s)), ((x)->nsec = (ns)))
|
|
||||||
#define stio_cleartime(x) stio_inittime(x,0,0)
|
|
||||||
/*#define stio_cleartime(x) ((x)->sec = (x)->nsec = 0)*/
|
|
||||||
#define stio_cmptime(x,y) \
|
|
||||||
(((x)->sec == (y)->sec)? ((x)->nsec - (y)->nsec): \
|
|
||||||
((x)->sec - (y)->sec))
|
|
||||||
|
|
||||||
#define stio_iszerotime(x) ((x)->sec == 0 && (x)->nsec == 0)
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The stio_gettime() function gets the current time.
|
|
||||||
*/
|
|
||||||
STIO_EXPORT void stio_gettime (
|
|
||||||
stio_ntime_t* nt
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The stio_addtime() function adds x and y and stores the result in z
|
|
||||||
*/
|
|
||||||
STIO_EXPORT void stio_addtime (
|
|
||||||
const stio_ntime_t* x,
|
|
||||||
const stio_ntime_t* y,
|
|
||||||
stio_ntime_t* z
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The stio_subtime() function subtract y from x and stores the result in z.
|
|
||||||
*/
|
|
||||||
STIO_EXPORT void stio_subtime (
|
|
||||||
const stio_ntime_t* x,
|
|
||||||
const stio_ntime_t* y,
|
|
||||||
stio_ntime_t* z
|
|
||||||
);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@ -267,15 +267,16 @@ int stio_exec (stio_t* stio)
|
|||||||
int x, events = 0;
|
int x, events = 0;
|
||||||
|
|
||||||
if (stio->revs[i].events & EPOLLERR) events |= STIO_DEV_EVENT_ERR;
|
if (stio->revs[i].events & EPOLLERR) events |= STIO_DEV_EVENT_ERR;
|
||||||
#if defined(EPOLLRDHUP)
|
|
||||||
if (stio->revs[i].events & (EPOLLHUP | EPOLLRDHUP)) events |= STIO_DEV_EVENT_HUP;
|
|
||||||
#else
|
|
||||||
if (stio->revs[i].events & EPOLLHUP) events |= STIO_DEV_EVENT_HUP;
|
if (stio->revs[i].events & EPOLLHUP) events |= STIO_DEV_EVENT_HUP;
|
||||||
#endif
|
#if defined(EPOLLRDHUP)
|
||||||
|
/* treat it the same way as EPOLLHUP */
|
||||||
|
if (stio->revs[i].events & EPOLLRDHUP) events |= STIO_DEV_EVENT_HUP;
|
||||||
|
#endif
|
||||||
if (stio->revs[i].events & EPOLLIN) events |= STIO_DEV_EVENT_IN;
|
if (stio->revs[i].events & EPOLLIN) events |= STIO_DEV_EVENT_IN;
|
||||||
if (stio->revs[i].events & EPOLLOUT) events |= STIO_DEV_EVENT_OUT;
|
if (stio->revs[i].events & EPOLLOUT) events |= STIO_DEV_EVENT_OUT;
|
||||||
if (stio->revs[i].events & EPOLLPRI) events |= STIO_DEV_EVENT_PRI;
|
if (stio->revs[i].events & EPOLLPRI) events |= STIO_DEV_EVENT_PRI;
|
||||||
|
|
||||||
|
|
||||||
/* return value of ready()
|
/* return value of ready()
|
||||||
* <= -1 - failure. kill the device.
|
* <= -1 - failure. kill the device.
|
||||||
* == 0 - ok. but don't invoke recv() or send().
|
* == 0 - ok. but don't invoke recv() or send().
|
||||||
@ -594,6 +595,16 @@ stio_errnum_t stio_syserrtoerrnum (int no)
|
|||||||
return STIO_ENFILE;
|
return STIO_ENFILE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(ECONNREFUSED)
|
||||||
|
case ECONNREFUSED:
|
||||||
|
return STIO_ECONRF;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ECONNRESETD)
|
||||||
|
case ECONNRESET:
|
||||||
|
return STIO_ECONRS;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return STIO_ESYSERR;
|
return STIO_ESYSERR;
|
||||||
}
|
}
|
||||||
|
@ -105,8 +105,13 @@ enum stio_errnum_t
|
|||||||
STIO_ENOSUP, /* not supported */
|
STIO_ENOSUP, /* not supported */
|
||||||
STIO_EMFILE,
|
STIO_EMFILE,
|
||||||
STIO_ENFILE,
|
STIO_ENFILE,
|
||||||
|
STIO_ECONRF, /* connection refused */
|
||||||
|
STIO_ECONRS, /* connection reset */
|
||||||
|
|
||||||
STIO_EDEVMAKE,
|
STIO_EDEVMAKE,
|
||||||
|
STIO_EDEVERR,
|
||||||
|
STIO_EDEVHUP,
|
||||||
|
|
||||||
STIO_ESYSERR
|
STIO_ESYSERR
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user