--- libaitsched/inc/defs.h 2011/08/05 15:52:00 1.1 +++ libaitsched/inc/defs.h 2014/06/05 22:15:59 1.13.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: defs.h,v 1.1 2011/08/05 15:52:00 misho Exp $ +* $Id: defs.h,v 1.13.2.5 2014/06/05 22:15:59 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Copyright 2004 - 2014 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -47,20 +47,163 @@ SUCH DAMAGE. #define __DEFS_H +#ifndef STRSIZ #define STRSIZ 256 -#define KQ_EVENTS 24 -#define MAX_EVENTLO_MISS 48 +#endif +#ifndef KQ_EVENTS +#define KQ_EVENTS 32 +#endif + +#ifndef EV_EOF +#define EV_EOF 0x8000 +#endif + +#ifndef SIGRTMIN +#define SIGRTMIN 65 +#endif + +#ifndef FIONWRITE +#define FIONWRITE SIOCOUTQ +#endif + +#ifndef TIMER_RELTIME +#define TIMER_RELTIME 0 +#endif + +#ifndef EV_EOF +#define EV_EOF 0x8000 /* EOF detected */ +#endif +#ifndef EV_ERROR +#define EV_ERROR 0x4000 /* error, data contains errno */ +#endif + +#ifndef __unused +#define __unused __attribute__((unused)) +#endif + +#define MAX_TASK_MISS 12 + #define LOGERR { \ sched_Errno = errno; \ strlcpy(sched_Error, strerror(errno), STRSIZ); \ } +#ifndef HAVE_LIBPTHREAD +#define pthread_mutex_lock(x) +#define pthread_mutex_unlock(x) +#endif +#define SCHED_QLOCK(r, x) pthread_mutex_lock(&(r)->root_mtx[(x)]) +#define SCHED_QUNLOCK(r, x) pthread_mutex_unlock(&(r)->root_mtx[(x)]) + +#define sched_timespecclear(tsp) ((tsp)->tv_sec = (tsp)->tv_nsec = 0) +#define sched_timespecinf(tsp) ((tsp)->tv_sec = (tsp)->tv_nsec = -1) +#define sched_timespecisinf(tsp) ((tsp)->tv_sec == -1 && (tsp)->tv_nsec == -1) +#define sched_timespecisset(tsp) (((tsp)->tv_sec && (tsp)->tv_sec != -1) || \ + ((tsp)->tv_nsec && (tsp)->tv_nsec != -1)) +#define sched_timespeccmp(tsp, usp, cmp) \ + (((tsp)->tv_sec == (usp)->tv_sec) ? \ + ((tsp)->tv_nsec cmp (usp)->tv_nsec) : \ + ((tsp)->tv_sec cmp (usp)->tv_sec)) +#define sched_timespecadd(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \ + if ((vsp)->tv_nsec >= 1000000000L) { \ + (vsp)->tv_sec++; \ + (vsp)->tv_nsec -= 1000000000L; \ + } \ + } while (0) +#define sched_timespecsub(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ + if ((vsp)->tv_nsec < 0) { \ + (vsp)->tv_sec--; \ + (vsp)->tv_nsec += 1000000000L; \ + } \ + } while (0) + +#define sched_timespec2val(tsp, tvp) ((tvp)->tv_sec = (tsp)->tv_sec, \ + (tvp)->tv_usec = (tsp)->tv_nsec / 1000) +#define sched_timeval2spec(tvp, tsp) ((tsp)->tv_sec = (tvp)->tv_sec, \ + (tsp)->tv_nsec = (tvp)->tv_usec * 1000) + +#define sched_timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) +#define sched_timevalinf(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = -1) +#define sched_timevalisinf(tvp) ((tvp)->tv_sec == -1 && (tvp)->tv_usec == -1) +#define sched_timevalisset(tvp) (((tvp)->tv_sec && (tvp)->tv_sec != -1) || \ + ((tvp)->tv_usec && (tvp)->tv_usec != -1)) +#define sched_timevalcmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) +#define sched_timevaladd(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ + if ((vvp)->tv_usec >= 1000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_usec -= 1000000; \ + } \ + } while (0) +#define sched_timevalsub(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (0) + + +#ifndef HAVE_STRLCAT +size_t strlcat(char * __restrict dst, const char * __restrict src, size_t siz); +#endif +#ifndef HAVE_STRLCPY +size_t strlcpy(char * __restrict dst, const char * __restrict src, size_t siz); +#endif + + extern int sched_Errno; extern char sched_Error[]; -inline void sched_SetErr(int eno, char *estr, ...); +void sched_SetErr(int, char *, ...); + + +static inline void +remove_task_from(sched_task_t * __restrict t, sched_queue_t * __restrict q) +{ + assert(t && q); + + SCHED_QLOCK(TASK_ROOT(t), TASK_TYPE(t)); + TAILQ_REMOVE(q, t, task_node); + SCHED_QUNLOCK(TASK_ROOT(t), TASK_TYPE(t)); +} + +static inline void +insert_task_to(sched_task_t * __restrict t, sched_queue_t * __restrict q) +{ + assert(t && q); + + SCHED_QLOCK(TASK_ROOT(t), TASK_TYPE(t)); + TAILQ_INSERT_TAIL(q, t, task_node); + SCHED_QUNLOCK(TASK_ROOT(t), TASK_TYPE(t)); +} + +static inline void +transit_task2unuse(sched_task_t * __restrict t, sched_queue_t * __restrict q) +{ + assert(t && q); + + remove_task_from(t, q); + + TASK_UNLOCK(t); + TASK_TYPE(t) = taskUNUSE; + insert_task_to(t, &(TASK_ROOT(t))->root_unuse); +} #endif