| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 1 | /*	$OpenBSD: fileext.h,v 1.2 2005/06/17 20:40:32 espie Exp $	*/ | 
 | 2 | /* $NetBSD: fileext.h,v 1.5 2003/07/18 21:46:41 nathanw Exp $ */ | 
 | 3 |  | 
 | 4 | /*- | 
 | 5 |  * Copyright (c)2001 Citrus Project, | 
 | 6 |  * All rights reserved. | 
 | 7 |  * | 
 | 8 |  * Redistribution and use in source and binary forms, with or without | 
 | 9 |  * modification, are permitted provided that the following conditions | 
 | 10 |  * are met: | 
 | 11 |  * 1. Redistributions of source code must retain the above copyright | 
 | 12 |  *    notice, this list of conditions and the following disclaimer. | 
 | 13 |  * 2. Redistributions in binary form must reproduce the above copyright | 
 | 14 |  *    notice, this list of conditions and the following disclaimer in the | 
 | 15 |  *    documentation and/or other materials provided with the distribution. | 
 | 16 |  * | 
 | 17 |  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | 
 | 18 |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
 | 19 |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
 | 20 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | 
 | 21 |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
 | 22 |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
 | 23 |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
 | 24 |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
 | 25 |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
 | 26 |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
 | 27 |  * SUCH DAMAGE. | 
 | 28 |  * | 
 | 29 |  * $Citrus$ | 
 | 30 |  */ | 
 | 31 |  | 
| David 'Digit' Turner | 9831ad3 | 2011-08-29 21:43:46 +0200 | [diff] [blame] | 32 | #include <pthread.h> | 
 | 33 | #include "wcio.h" | 
 | 34 |  | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 35 | /* | 
 | 36 |  * file extension | 
 | 37 |  */ | 
 | 38 | struct __sfileext { | 
 | 39 | 	struct	__sbuf _ub; /* ungetc buffer */ | 
 | 40 | 	struct wchar_io_data _wcio;	/* wide char io status */ | 
| David 'Digit' Turner | 9831ad3 | 2011-08-29 21:43:46 +0200 | [diff] [blame] | 41 | 	pthread_mutex_t _lock; /* file lock */ | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 42 | }; | 
 | 43 |  | 
| David 'Digit' Turner | 9831ad3 | 2011-08-29 21:43:46 +0200 | [diff] [blame] | 44 | #define _FILEEXT_INITIALIZER  {{NULL,0},{0},PTHREAD_RECURSIVE_MUTEX_INITIALIZER} | 
 | 45 |  | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 46 | #define _EXT(fp) ((struct __sfileext *)((fp)->_ext._base)) | 
 | 47 | #define _UB(fp) _EXT(fp)->_ub | 
| David 'Digit' Turner | 9831ad3 | 2011-08-29 21:43:46 +0200 | [diff] [blame] | 48 | #define _FLOCK(fp)  _EXT(fp)->_lock | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 49 |  | 
 | 50 | #define _FILEEXT_INIT(fp) \ | 
 | 51 | do { \ | 
 | 52 | 	_UB(fp)._base = NULL; \ | 
 | 53 | 	_UB(fp)._size = 0; \ | 
 | 54 | 	WCIO_INIT(fp); \ | 
| David 'Digit' Turner | 9831ad3 | 2011-08-29 21:43:46 +0200 | [diff] [blame] | 55 | 	_FLOCK_INIT(fp); \ | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 56 | } while (0) | 
 | 57 |  | 
| David 'Digit' Turner | 9831ad3 | 2011-08-29 21:43:46 +0200 | [diff] [blame] | 58 | /* Helper macros to avoid a function call when you know that fp is not NULL. | 
 | 59 |  * Notice that we keep _FLOCK_INIT() fast by slightly breaking our pthread | 
 | 60 |  * encapsulation. | 
 | 61 |  */ | 
 | 62 | #define _FLOCK_INIT(fp)    _FLOCK(fp).value = __PTHREAD_RECURSIVE_MUTEX_INIT_VALUE | 
 | 63 | #define _FLOCK_LOCK(fp)    pthread_mutex_lock(&_FLOCK(fp)) | 
 | 64 | #define _FLOCK_TRYLOCK(fp) pthread_mutex_trylock(&_FLOCK(fp)) | 
 | 65 | #define _FLOCK_UNLOCK(fp)  pthread_mutex_unlock(&_FLOCK(fp)) | 
 | 66 |  | 
| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 67 | #define _FILEEXT_SETUP(f, fext) \ | 
 | 68 | do { \ | 
 | 69 | 	(f)->_ext._base = (unsigned char *)(fext); \ | 
 | 70 | 	_FILEEXT_INIT(f); \ | 
 | 71 | } while (0) |