| #if !defined(DREAD_THREAD_CHAIN_EMPTY) | |
| /* | |
| * Copyright (c) 1994 by Bennet Yee. | |
| * | |
| * This material was developed by the author. Permission to copy this | |
| * software, to redistribute it, and to use it for any purpose is hereby | |
| * granted, subject to the following five restrictions. | |
| * | |
| * 1. Any copy made of this software must include this copyright notice in | |
| * full. | |
| * | |
| * 2. All materials containing this software or derivatives thereof must | |
| * provide this software in source form or provide a means of obtaining | |
| * this software in source form; no fees may be charged for this software | |
| * except those for covering media costs and handling. | |
| * | |
| * 3. All materials developed as a consequence of the use of this software | |
| * shall duly acknowledge such use, in accordance with the usual standards | |
| * of acknowledging credit in academic research. | |
| * | |
| * 4. The author makes no warranty or representation that the operation | |
| * of this software will be error-free, and the author is under no | |
| * obligation to provide any services, by way of maintenance, update, or | |
| * otherwise. | |
| * | |
| * 5. In conjunction with products arising from the use of this material, | |
| * there shall be no use of the names of the author, of Carnegie-Mellon | |
| * University, nor of any adaptation thereof in any advertising, | |
| * promotional, or sales literature without prior written consent from the | |
| * author and Carnegie-Mellon University in each case. | |
| * | |
| * If you have questions, you can contact the author at bsy@cs.cmu.edu | |
| * | |
| * Users of this software is requested to make their best efforts (a) to | |
| * return to the author any improvements or extensions that they make, so | |
| * that these may be included in future releases; (b) to document clearly | |
| * any improvements or extensions made to this software; and (c) to inform | |
| * the author of noteworthy uses of this software. Any improvements or | |
| * extensions to this software may be placed under different copyright | |
| * restrictions by the author of those improvements or extensions. That | |
| * those improvements or extensions be placed under the same copyright as | |
| * * this software is encouraged. | |
| */ | |
| /* | |
| * User must keep track of offset from chain structure to base of actual | |
| * structure. Usually the struct chain is first in the derived class, so | |
| * the offset is zero. | |
| */ | |
| struct dthr_chain { | |
| struct dthr_chain *prev,*next; | |
| }; | |
| #define DREAD_THREAD_CHAIN_EMPTY(chainp) ((chainp)->next == (chainp)) | |
| struct dthr_chain *dthr_chain_init(struct dthr_chain *anchor); | |
| struct dthr_chain *dthr_chain_insert_after(struct dthr_chain *link, | |
| struct dthr_chain *new_link); | |
| struct dthr_chain *dthr_chain_insert_before(struct dthr_chain *link, | |
| struct dthr_chain *new_link); | |
| struct dthr_chain *dthr_chain_delete(struct dthr_chain *link); | |
| #define dthr_chain_insert(anchor,link) dthr_chain_insert_after(anchor,link) | |
| #define dthr_chain_push(anchor,link) dthr_chain_insert_after(anchor,link) | |
| #define dthr_chain_enqueue(anchor,link) dthr_chain_insert_before(anchor,link) | |
| #define DREAD_THREAD_CHAIN_DEQUEUE(anchor) \ | |
| (DREAD_THREAD_CHAIN_EMPTY(anchor) ? \ | |
| (struct dthr_chain *) 0 : \ | |
| dthr_chain_delete((anchor)->next)) | |
| #include <stdio.h> | |
| void dthr_chain_show(FILE *iop, | |
| struct dthr_chain *anchor); | |
| #if defined(__GNUC__) | |
| # if defined(DREAD_THREAD_CHAIN_REAL_CODE) | |
| # define DREAD_THREAD_CHAIN_EXTINLINE | |
| # else | |
| # define DREAD_THREAD_CHAIN_EXTINLINE extern inline | |
| # define DREAD_THREAD_CHAIN_REAL_CODE 0 | |
| /* | |
| * For inlined functions. For make, this also means that anything that | |
| * depends on chain.h will also depend on chain.c, but that's not easily | |
| * expressible (if at all) in most make languages. | |
| */ | |
| # include "dread_chain.c" | |
| # endif | |
| #else | |
| # define DREAD_THREAD_CHAIN_EXTINLINE | |
| #endif | |
| /* | |
| * chain loops: | |
| * | |
| * for (p = anchor.next; p != &anchor; p = p->next) { | |
| * ... | |
| * } | |
| */ | |
| #endif |