![]() ![]() | ![]() |
epoll support fixed select/epoll and kqueue
1: /************************************************************************* 2: * (C) 2011 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com> 3: * by Michael Pounov <misho@openbsd-bg.org> 4: * 5: * $Author: misho $ 6: * $Id: defs.h,v 1.13.2.4 2014/06/03 20:39:54 misho Exp $ 7: * 8: ************************************************************************** 9: The ELWIX and AITNET software is distributed under the following 10: terms: 11: 12: All of the documentation and software included in the ELWIX and AITNET 13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> 14: 15: Copyright 2004 - 2014 16: by Michael Pounov <misho@elwix.org>. All rights reserved. 17: 18: Redistribution and use in source and binary forms, with or without 19: modification, are permitted provided that the following conditions 20: are met: 21: 1. Redistributions of source code must retain the above copyright 22: notice, this list of conditions and the following disclaimer. 23: 2. Redistributions in binary form must reproduce the above copyright 24: notice, this list of conditions and the following disclaimer in the 25: documentation and/or other materials provided with the distribution. 26: 3. All advertising materials mentioning features or use of this software 27: must display the following acknowledgement: 28: This product includes software developed by Michael Pounov <misho@elwix.org> 29: ELWIX - Embedded LightWeight unIX and its contributors. 30: 4. Neither the name of AITNET nor the names of its contributors 31: may be used to endorse or promote products derived from this software 32: without specific prior written permission. 33: 34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND 35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 44: SUCH DAMAGE. 45: */ 46: #ifndef __DEFS_H 47: #define __DEFS_H 48: 49: 50: #ifndef STRSIZ 51: #define STRSIZ 256 52: #endif 53: 54: #ifndef KQ_EVENTS 55: #define KQ_EVENTS 32 56: #endif 57: 58: #ifndef EV_EOF 59: #define EV_EOF 0x8000 60: #endif 61: 62: #ifndef SIGRTMIN 63: #define SIGRTMIN 65 64: #endif 65: 66: #ifndef FIONWRITE 67: #define FIONWRITE SIOCOUTQ 68: #endif 69: 70: #ifndef TIMER_RELTIME 71: #define TIMER_RELTIME 0 72: #endif 73: 74: #ifndef EV_EOF 75: #define EV_EOF 0x8000 /* EOF detected */ 76: #endif 77: #ifndef EV_ERROR 78: #define EV_ERROR 0x4000 /* error, data contains errno */ 79: #endif 80: 81: #ifndef __unused 82: #define __unused __attribute__((unused)) 83: #endif 84: 85: #define MAX_TASK_MISS 12 86: 87: #define LOGERR { \ 88: sched_Errno = errno; \ 89: strlcpy(sched_Error, strerror(errno), STRSIZ); \ 90: } 91: 92: #ifndef HAVE_LIBPTHREAD 93: #define pthread_mutex_lock(x) 94: #define pthread_mutex_unlock(x) 95: #endif 96: 97: #define SCHED_QLOCK(r, x) pthread_mutex_lock(&(r)->root_mtx[(x)]) 98: #define SCHED_QUNLOCK(r, x) pthread_mutex_unlock(&(r)->root_mtx[(x)]) 99: 100: #define sched_timespecclear(tsp) ((tsp)->tv_sec = (tsp)->tv_nsec = 0) 101: #define sched_timespecinf(tsp) ((tsp)->tv_sec = (tsp)->tv_nsec = -1) 102: #define sched_timespecisinf(tsp) ((tsp)->tv_sec == -1 && (tsp)->tv_nsec == -1) 103: #define sched_timespecisset(tsp) (((tsp)->tv_sec && (tsp)->tv_sec != -1) || \ 104: ((tsp)->tv_nsec && (tsp)->tv_nsec != -1)) 105: #define sched_timespeccmp(tsp, usp, cmp) \ 106: (((tsp)->tv_sec == (usp)->tv_sec) ? \ 107: ((tsp)->tv_nsec cmp (usp)->tv_nsec) : \ 108: ((tsp)->tv_sec cmp (usp)->tv_sec)) 109: #define sched_timespecadd(tsp, usp, vsp) \ 110: do { \ 111: (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \ 112: (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \ 113: if ((vsp)->tv_nsec >= 1000000000L) { \ 114: (vsp)->tv_sec++; \ 115: (vsp)->tv_nsec -= 1000000000L; \ 116: } \ 117: } while (0) 118: #define sched_timespecsub(tsp, usp, vsp) \ 119: do { \ 120: (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ 121: (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ 122: if ((vsp)->tv_nsec < 0) { \ 123: (vsp)->tv_sec--; \ 124: (vsp)->tv_nsec += 1000000000L; \ 125: } \ 126: } while (0) 127: 128: #define sched_timespec2val(tsp, tvp) ((tvp)->tv_sec = (tsp)->tv_sec, \ 129: (tvp)->tv_usec = (tsp)->tv_nsec / 1000) 130: #define sched_timeval2spec(tvp, tsp) ((tsp)->tv_sec = (tvp)->tv_sec, \ 131: (tsp)->tv_nsec = (tvp)->tv_usec * 1000) 132: 133: #define sched_timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) 134: #define sched_timevalinf(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = -1) 135: #define sched_timevalisinf(tvp) ((tvp)->tv_sec == -1 && (tvp)->tv_usec == -1) 136: #define sched_timevalisset(tvp) (((tvp)->tv_sec && (tvp)->tv_sec != -1) || \ 137: ((tvp)->tv_usec && (tvp)->tv_usec != -1)) 138: #define sched_timevalcmp(tvp, uvp, cmp) \ 139: (((tvp)->tv_sec == (uvp)->tv_sec) ? \ 140: ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ 141: ((tvp)->tv_sec cmp (uvp)->tv_sec)) 142: #define sched_timevaladd(tvp, uvp, vvp) \ 143: do { \ 144: (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 145: (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 146: if ((vvp)->tv_usec >= 1000000) { \ 147: (vvp)->tv_sec++; \ 148: (vvp)->tv_usec -= 1000000; \ 149: } \ 150: } while (0) 151: #define sched_timevalsub(tvp, uvp, vvp) \ 152: do { \ 153: (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 154: (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 155: if ((vvp)->tv_usec < 0) { \ 156: (vvp)->tv_sec--; \ 157: (vvp)->tv_usec += 1000000; \ 158: } \ 159: } while (0) 160: 161: 162: #ifndef HAVE_STRLCAT 163: size_t strlcat(char * __restrict dst, const char * __restrict src, size_t siz); 164: #endif 165: #ifndef HAVE_STRLCPY 166: size_t strlcpy(char * __restrict dst, const char * __restrict src, size_t siz); 167: #endif 168: 169: 170: extern int sched_Errno; 171: extern char sched_Error[]; 172: 173: void sched_SetErr(int, char *, ...); 174: 175: void *_sched_threadWrapper(sched_task_t *); 176: void *_sched_rtcWrapper(sched_task_t *); 177: 178: 179: static inline void 180: remove_task_from(sched_task_t * __restrict t, sched_queue_t * __restrict q) 181: { 182: assert(t && q); 183: 184: SCHED_QLOCK(TASK_ROOT(t), TASK_TYPE(t)); 185: TAILQ_REMOVE(q, t, task_node); 186: SCHED_QUNLOCK(TASK_ROOT(t), TASK_TYPE(t)); 187: } 188: 189: static inline void 190: insert_task_to(sched_task_t * __restrict t, sched_queue_t * __restrict q) 191: { 192: assert(t && q); 193: 194: SCHED_QLOCK(TASK_ROOT(t), TASK_TYPE(t)); 195: TAILQ_INSERT_TAIL(q, t, task_node); 196: SCHED_QUNLOCK(TASK_ROOT(t), TASK_TYPE(t)); 197: } 198: 199: static inline void 200: transit_task2unuse(sched_task_t * __restrict t, sched_queue_t * __restrict q) 201: { 202: assert(t && q); 203: 204: remove_task_from(t, q); 205: 206: TASK_UNLOCK(t); 207: TASK_TYPE(t) = taskUNUSE; 208: insert_task_to(t, &(TASK_ROOT(t))->root_unuse); 209: } 210: 211: 212: #endif