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
+