X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=utcp.c;h=b5102dd7c907015ed7b87c5bd31844e462601e2d;hb=3c7a825eb4582146108ed26cd69e2573a86f709f;hp=cc17b0f744b0f4b63109daed01b55996f50f7613;hpb=723d8c8b2d96834135f00c0ac4147282e1f0cc2c;p=utcp diff --git a/utcp.c b/utcp.c index cc17b0f..b5102dd 100644 --- a/utcp.c +++ b/utcp.c @@ -43,6 +43,14 @@ #undef poll #endif +#ifndef UTCP_CLOCK +#if defined(CLOCK_MONOTONIC_RAW) && defined(__x86_64__) +#define UTCP_CLOCK CLOCK_MONOTONIC_RAW +#else +#define UTCP_CLOCK CLOCK_MONOTONIC +#endif +#endif + static void timespec_sub(const struct timespec *a, const struct timespec *b, struct timespec *r) { r->tv_sec = a->tv_sec - b->tv_sec; r->tv_nsec = a->tv_nsec - b->tv_nsec; @@ -73,7 +81,7 @@ static bool timespec_isset(const struct timespec *a) { return a->tv_sec; } -static long CLOCK_GRANULARITY; +static long CLOCK_GRANULARITY; // usec static inline size_t min(size_t a, size_t b) { return a < b ? a : b; @@ -90,14 +98,6 @@ static inline size_t max(size_t a, size_t b) { #define UTCP_DEBUG_DATALEN 20 #endif -#ifndef UTCP_CLOCK -#if defined(CLOCK_MONOTONIC_RAW) && defined(__x86_64__) -#define UTCP_CLOCK CLOCK_MONOTONIC_RAW -#else -#define UTCP_CLOCK CLOCK_MONOTONIC -#endif -#endif - static void debug(struct utcp_connection *c, const char *format, ...) { struct timespec tv; char buf[1024]; @@ -749,6 +749,7 @@ ssize_t utcp_send(struct utcp_connection *c, const void *data, size_t len) { if(!is_reliable(c)) { c->snd.una = c->snd.nxt = c->snd.last; buffer_discard(&c->sndbuf, c->sndbuf.used); + c->do_poll = true; } if(is_reliable(c) && !timespec_isset(&c->rtrx_timeout)) { @@ -1484,6 +1485,7 @@ synack: if(data_acked) { buffer_discard(&c->sndbuf, data_acked); + c->do_poll = true; } // Also advance snd.nxt if possible @@ -2001,8 +2003,9 @@ struct timespec utcp_timeout(struct utcp *utcp) { } if(c->poll) { - if((c->state == ESTABLISHED || c->state == CLOSE_WAIT)) { - uint32_t len = buffer_free(&c->sndbuf); + if((c->state == ESTABLISHED || c->state == CLOSE_WAIT) && c->do_poll) { + c->do_poll = false; + uint32_t len = buffer_free(&c->sndbuf); if(len) { c->poll(c, len); @@ -2056,7 +2059,7 @@ struct utcp *utcp_init(utcp_accept_t accept, utcp_pre_accept_t pre_accept, utcp_ if(!CLOCK_GRANULARITY) { struct timespec res; clock_getres(UTCP_CLOCK, &res); - CLOCK_GRANULARITY = res.tv_sec * NSEC_PER_SEC + res.tv_nsec; + CLOCK_GRANULARITY = res.tv_sec * USEC_PER_SEC + res.tv_nsec / 1000; } utcp->accept = accept; @@ -2205,6 +2208,8 @@ void utcp_set_sndbuf(struct utcp_connection *c, size_t size) { if(c->sndbuf.maxsize != size) { c->sndbuf.maxsize = -1; } + + c->do_poll = buffer_free(&c->sndbuf); } size_t utcp_get_rcvbuf(struct utcp_connection *c) { @@ -2272,6 +2277,7 @@ void utcp_set_recv_cb(struct utcp_connection *c, utcp_recv_t recv) { void utcp_set_poll_cb(struct utcp_connection *c, utcp_poll_t poll) { if(c) { c->poll = poll; + c->do_poll = buffer_free(&c->sndbuf); } } @@ -2331,3 +2337,7 @@ void utcp_offline(struct utcp *utcp, bool offline) { utcp->rto = START_RTO; } } + +void utcp_set_clock_granularity(long granularity) { + CLOCK_GRANULARITY = granularity; +}