diff --git a/src/common.c b/src/common.c index 98d8cfa..4180ec4 100644 --- a/src/common.c +++ b/src/common.c @@ -34,6 +34,35 @@ int havelog = 0; unsigned char **stringtable = NULL; +#ifdef WITH_LINUX_FUTEX +int sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) +{ + return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3); +} +int mutex_lock(int *val) +{ + int c; + if ((c = __sync_val_compare_and_swap(val, 0, 1)) != 0) + do { + if(c == 2 || __sync_val_compare_and_swap(val, 1, 2) != 0) + sys_futex(val, FUTEX_WAIT_PRIVATE, 2, NULL, NULL, 0); + } while ((c = __sync_val_compare_and_swap(val, 0, 2)) != 0); + + return 0; +} + +int mutex_unlock(int *val) +{ + if(__sync_fetch_and_sub (val, 1) != 1){ + *val = 0; + sys_futex(val, FUTEX_WAKE_PRIVATE, 1, NULL, NULL, 0); + } + + + return 0; +} +#endif + int myinet_ntop(int af, void *src, char *dst, socklen_t size){ #ifndef NOIPV6 if(af != AF_INET6){ @@ -546,6 +575,10 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->req))); i += (int)strlen((char *)buf+i); break; + case 'L': + sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->cycles); + i += (int)strlen((char *)buf+i); + break; case 'I': sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->statssrv64); i += (int)strlen((char *)buf+i); diff --git a/src/sockmap.c b/src/sockmap.c index 2d36719..e5ea79b 100644 --- a/src/sockmap.c +++ b/src/sockmap.c @@ -107,6 +107,7 @@ int splicemap(struct clientparam * param, int timeo){ while((!stop || (inclipipe && param->remsock != INVALID_SOCKET) || (insrvpipe && param->clisock != INVALID_SOCKET)) && !conf.timetoexit){ + param->cycles++; #ifdef NOIPV6 sasize = sizeof(struct sockaddr_in); #else @@ -367,6 +368,7 @@ int sockmap(struct clientparam * param, int timeo){ while (!stop&&!conf.timetoexit){ + param->cycles++; #ifdef NOIPV6 sasize = sizeof(struct sockaddr_in); #else diff --git a/src/structures.h b/src/structures.h index a9284d7..511e98a 100644 --- a/src/structures.h +++ b/src/structures.h @@ -34,6 +34,21 @@ extern "C" { #define SASIZETYPE socklen_t #define SOCKET int #define INVALID_SOCKET (-1) +#ifdef WITH_LINUX_FUTEX +#define _GNU_SOURCE +#include +#include +#include +#include +#define pthread_mutex_t int +#define pthread_mutex_init(x, y) (*(x)=0) +#define pthread_mutex_destroy(x) (*(x)=0) +#define pthread_mutex_lock(x) mutex_lock(x) +#define pthread_mutex_unlock(x) mutex_unlock(x) +int mutex_lock(int *val); +int mutex_unlock(int *val); +#else +#endif #else #include #include @@ -477,7 +492,8 @@ struct clientparam { REDIRTYPE redirtype; uint64_t waitclient64, - waitserver64; + waitserver64, + cycles; int redirected, operation,