1 /* 2 * Copyright (c) 2001-2003 3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * Author: Hartmut Brandt <harti@freebsd.org> 28 * 29 * $Begemot: libunimsg/libngatm/sscfucust.h,v 1.4 2004/07/08 08:21:40 brandt Exp $ 30 * 31 * Customisation of the SSCFU code for the user space library. 32 */ 33 #include <sys/types.h> 34 #include <sys/queue.h> 35 #include <stdio.h> 36 #include <stdlib.h> 37 #include <string.h> 38 #include <errno.h> 39 #ifdef SSCFU_DEBUG 40 #include <assert.h> 41 #endif 42 #include <netnatm/unimsg.h> 43 44 /* 45 * Allocate zeroed or non-zeroed memory of some size and cast it. 46 * Return NULL on failure. 47 */ 48 #define MEMINIT() 49 50 #define MEMZALLOC(PTR,CAST,SIZE) do { \ 51 void *_m = malloc(SIZE); \ 52 if (_m != NULL) \ 53 bzero(_m, SIZE); \ 54 (PTR) = (CAST)_m; \ 55 } while(0) 56 57 #define MEMFREE(PTR) \ 58 free(PTR) 59 60 #define SIG_ALLOC(PTR) \ 61 MEMZALLOC(PTR, struct sscfu_sig *, sizeof(struct sscfu_sig)) 62 #define SIG_FREE(PTR) \ 63 MEMFREE(PTR) 64 65 /* 66 * Signal queues 67 */ 68 typedef TAILQ_ENTRY(sscfu_sig) sscfu_sigq_link_t; 69 typedef TAILQ_HEAD(sscfu_sigq, sscfu_sig) sscfu_sigq_head_t; 70 #define SIGQ_INIT(Q) TAILQ_INIT(Q) 71 #define SIGQ_APPEND(Q,S) TAILQ_INSERT_TAIL(Q, S, link) 72 #define SIGQ_GET(Q) \ 73 ({ \ 74 struct sscfu_sig *_s = NULL; \ 75 \ 76 if(!TAILQ_EMPTY(Q)) { \ 77 _s = TAILQ_FIRST(Q); \ 78 TAILQ_REMOVE(Q, _s, link); \ 79 } \ 80 _s; \ 81 }) 82 83 #define SIGQ_CLEAR(Q) \ 84 do { \ 85 struct sscfu_sig *_s1, *_s2; \ 86 \ 87 _s1 = TAILQ_FIRST(Q); \ 88 while(_s1 != NULL) { \ 89 _s2 = TAILQ_NEXT(_s1, link); \ 90 if(_s1->m) \ 91 MBUF_FREE(_s1->m); \ 92 SIG_FREE(_s1); \ 93 _s1 = _s2; \ 94 } \ 95 TAILQ_INIT(Q); \ 96 } while(0) 97 98 99 /* 100 * Message buffers 101 */ 102 #define MBUF_FREE(M) uni_msg_destroy(M) 103 104 #ifdef SSCFU_DEBUG 105 #define ASSERT(S) assert(S) 106 #else 107 #define ASSERT(S) 108 #endif 109