Mercurial > ecos
diff packages/net/snmp/lib/current/src/mt_support.c @ 103:95f3e12a6327 ecos-sw-2000-06-23
Merge from eCos master repository on 2000-06-23-16:41:10-BST
| author | jlarmour |
|---|---|
| date | Fri, 23 Jun 2000 17:06:31 +0000 |
| parents | |
| children | e0c0827131d1 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/net/snmp/lib/current/src/mt_support.c @@ -0,0 +1,213 @@ +//========================================================================== +// +// ./lib/current/src/mt_support.c +// +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####UCDSNMPCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from the UCD-SNMP +// project, <http://ucd-snmp.ucdavis.edu/> from the University of +// California at Davis, which was originally based on the Carnegie Mellon +// University SNMP implementation. Portions of this software are therefore +// covered by the appropriate copyright disclaimers included herein. +// +// The release used was version 4.1.2 of May 2000. "ucd-snmp-4.1.2" +// ------------------------------------------- +// +//####UCDSNMPCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): hmt +// Contributors: hmt +// Date: 2000-05-30 +// Purpose: Port of UCD-SNMP distribution to eCos. +// Description: +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== +/******************************************************************** + Copyright 1989, 1991, 1992 by Carnegie Mellon University + + Derivative Work - +Copyright 1996, 1998, 1999, 2000 The Regents of the University of California + + All Rights Reserved + +Permission to use, copy, modify and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appears in all copies and +that both that copyright notice and this permission notice appear in +supporting documentation, and that the name of CMU and The Regents of +the University of California not be used in advertising or publicity +pertaining to distribution of the software without specific written +permission. + +CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR +THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING +FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*********************************************************************/ + +/* mt_support.c - multi-thread resource locking support */ +/* + * Author: Markku Laukkanen + * Created: 6-Sep-1999 + * History: + * 8-Sep-1999 M. Slifcak method names changed; + * use array of resource locking structures. + */ + +#include <config.h> +#include <errno.h> +#include "mt_support.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _REENTRANT + +static +mutex_type s_res[MT_MAX_IDS][MT_LIB_MAXIMUM]; /* locking structures */ + +static mutex_type * _mt_res(int groupID, int resourceID) +{ + if (groupID < 1) return 0; + if (groupID >= MT_MAX_IDS) return 0; + if (resourceID < 1) return 0; + if (resourceID >= MT_LIB_MAXIMUM) return 0; + return (&s_res[groupID][resourceID]); +} + +static +int snmp_res_init_mutex(mutex_type * mutex) +{ + int rc = 0; +#if HAVE_PTHREAD_H + rc = pthread_mutex_init(mutex, MT_MUTEX_INIT_DEFAULT); +#elif defined(WIN32) + InitializeCriticalSection(mutex); +#endif + + return rc; +} + +int snmp_res_init(void) +{ + int ii, jj; + int rc = 0; + mutex_type *mutex; + + for (jj = 0; (0 == rc) && (jj < MT_MAX_IDS); jj++) + for (ii = 0; (0 == rc) && (ii < MT_LIB_MAXIMUM); ii++) + { + mutex = _mt_res(jj, ii); + if (!mutex) continue; + rc = snmp_res_init_mutex( mutex ); + } + + return rc; +} + +int snmp_res_destroy_mutex(int groupID, int resourceID) +{ + int rc = 0; + mutex_type *mutex = _mt_res(groupID, resourceID); + if (!mutex) return EFAULT; + +#if HAVE_PTHREAD_H + rc = pthread_mutex_destroy(mutex); +#elif defined(WIN32) + DeleteCriticalSection(mutex); +#endif + + return rc; +} + +int snmp_res_lock(int groupID, int resourceID) +{ + int rc = 0; + mutex_type *mutex = _mt_res(groupID, resourceID); + if (!mutex) return EFAULT; + +#if HAVE_PTHREAD_H + rc = pthread_mutex_lock(mutex); +#elif defined(WIN32) + EnterCriticalSection(mutex); +#endif + + return rc; +} + +int snmp_res_unlock(int groupID, int resourceID) +{ + int rc = 0; + mutex_type *mutex = _mt_res(groupID, resourceID); + if (!mutex) return EFAULT; + +#if HAVE_PTHREAD_H + rc = pthread_mutex_unlock(mutex); +#elif defined(WIN32) + LeaveCriticalSection(mutex); +#endif + + return rc; +} + + +#else /* !_REENTRANT */ + +#ifdef WIN32 + +/* Provide "do nothing" targets for Release (.DLL) builds. */ +#undef snmp_res_init +#undef snmp_res_lock +#undef snmp_res_unlock +#undef snmp_res_destroy_mutex + +int snmp_res_init(void) { return 0; } +int snmp_res_lock(int groupID, int resourceID) { return 0; } +int snmp_res_unlock(int groupID, int resourceID) { return 0; } +int snmp_res_destroy_mutex(int groupID, int resourceID) { return 0; } +#endif /* !WIN32 */ + +#endif /* !_REENTRANT */ + + +#ifdef __cplusplus +}; +#endif +
