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 */ 68typedef TAILQ_ENTRY(sscfu_sig) sscfu_sigq_link_t; 69typedef 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