| /* $NetBSD: fileext.h,v 1.5 2003/07/18 21:46:41 nathanw Exp $ */ | |
| /*- | |
| * Copyright (c)2001 Citrus Project, | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions | |
| * are met: | |
| * 1. Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * 2. Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| * SUCH DAMAGE. | |
| * | |
| * $Citrus$ | |
| */ | |
| /* | |
| * file extension | |
| */ | |
| struct __sfileext { | |
| struct __sbuf _ub; /* ungetc buffer */ | |
| struct wchar_io_data _wcio; /* wide char i/o status */ | |
| #ifdef _REENTRANT | |
| mutex_t _lock; /* Lock for FLOCKFILE/FUNLOCKFILE */ | |
| cond_t _lockcond; /* Condition variable for signalling lock releases */ | |
| thr_t _lockowner; /* The thread currently holding the lock */ | |
| int _lockcount; /* Count of recursive locks */ | |
| int _lockinternal; /* Flag of whether the lock is held inside stdio */ | |
| int _lockcancelstate; /* Stashed cancellation state on internal lock */ | |
| #endif | |
| }; | |
| #define _EXT(fp) ((struct __sfileext *)(void *)((fp)->_ext._base)) | |
| #define _UB(fp) _EXT(fp)->_ub | |
| #ifdef _REENTRANT | |
| #define _LOCK(fp) (_EXT(fp)->_lock) | |
| #define _LOCKCOND(fp) (_EXT(fp)->_lockcond) | |
| #define _LOCKOWNER(fp) (_EXT(fp)->_lockowner) | |
| #define _LOCKCOUNT(fp) (_EXT(fp)->_lockcount) | |
| #define _LOCKINTERNAL(fp) (_EXT(fp)->_lockinternal) | |
| #define _LOCKCANCELSTATE(fp) (_EXT(fp)->_lockcancelstate) | |
| #define _FILEEXT_SETUP(f, fext) do { \ | |
| /* LINTED */(f)->_ext._base = (unsigned char *)(fext); \ | |
| mutex_init(&_LOCK(f), NULL); \ | |
| cond_init(&_LOCKCOND(f), 0, NULL); \ | |
| _LOCKOWNER(f) = NULL; \ | |
| _LOCKCOUNT(f) = 0; \ | |
| _LOCKINTERNAL(f) = 0; \ | |
| } while (/* LINTED */ 0) | |
| #else | |
| #define _FILEEXT_SETUP(f, fext) /* LINTED */(f)->_ext._base = (unsigned char *)(fext) | |
| #endif |