Revert "Revert "and added files""
[bcm963xx.git] / userapps / opensource / net-snmp / snmplib / mt_support.c
1 /*
2  * mt_support.c - multi-thread resource locking support 
3  */
4 /*
5  * Author: Markku Laukkanen
6  * Created: 6-Sep-1999
7  * History:
8  *  8-Sep-1999 M. Slifcak method names changed;
9  *                        use array of resource locking structures.
10  */
11
12 #include <net-snmp/net-snmp-config.h>
13 #include <errno.h>
14 #include <net-snmp/library/mt_support.h>
15
16 #ifdef __cplusplus
17 extern          "C" {
18 #endif
19
20 #ifdef NS_REENTRANT
21
22 static mutex_type s_res[MT_MAX_IDS][MT_LIB_MAXIMUM];  /* locking structures */
23
24 static mutex_type *
25 _mt_res(int groupID, int resourceID)
26 {
27     if (groupID < 1) {
28         return 0;
29     }
30     if (groupID >= MT_MAX_IDS) {
31         return 0;
32     }
33     if (resourceID < 1) {
34         return 0;
35     }
36     if (resourceID >= MT_LIB_MAXIMUM) {
37         return 0;
38     }
39     return (&s_res[groupID][resourceID]);
40 }
41
42 static int
43 snmp_res_init_mutex(mutex_type *mutex)
44 {
45     int rc = 0;
46 #if HAVE_PTHREAD_H
47     rc = pthread_mutex_init(mutex, MT_MUTEX_INIT_DEFAULT);
48 #elif defined(WIN32)
49     InitializeCriticalSection(mutex);
50 #endif
51
52     return rc;
53 }
54
55 int
56 snmp_res_init(void)
57 {
58     int ii, jj, rc = 0;
59     mutex_type *mutex;
60
61     for (jj = 0; (0 == rc) && (jj < MT_MAX_IDS); jj++) {
62         for (ii = 0; (0 == rc) && (ii < MT_LIB_MAXIMUM); ii++) {
63             mutex = _mt_res(jj, ii);
64             if (!mutex) {
65                 continue;
66             }
67             rc = snmp_res_init_mutex(mutex);
68         }
69     }
70
71     return rc;
72 }
73
74 int
75 snmp_res_destroy_mutex(int groupID, int resourceID)
76 {
77     int rc = 0;
78     mutex_type *mutex = _mt_res(groupID, resourceID);
79     if (!mutex) {
80         return EFAULT;
81     }
82
83 #if HAVE_PTHREAD_H
84     rc = pthread_mutex_destroy(mutex);
85 #elif defined(WIN32)
86     DeleteCriticalSection(mutex);
87 #endif
88
89     return rc;
90 }
91
92 int
93 snmp_res_lock(int groupID, int resourceID)
94 {
95     int rc = 0;
96     mutex_type *mutex = _mt_res(groupID, resourceID);
97     
98     if (!mutex) {
99         return EFAULT;
100     }
101
102 #if HAVE_PTHREAD_H
103     rc = pthread_mutex_lock(mutex);
104 #elif defined(WIN32)
105     EnterCriticalSection(mutex);
106 #endif
107
108     return rc;
109 }
110
111 int
112 snmp_res_unlock(int groupID, int resourceID)
113 {
114     int rc = 0;
115     mutex_type *mutex = _mt_res(groupID, resourceID);
116
117     if (!mutex) {
118         return EFAULT;
119     }
120
121 #if HAVE_PTHREAD_H
122     rc = pthread_mutex_unlock(mutex);
123 #elif defined(WIN32)
124     LeaveCriticalSection(mutex);
125 #endif
126
127     return rc;
128 }
129
130 #else  /*  NS_REENTRANT  */
131 #ifdef WIN32
132
133 /*
134  * Provide "do nothing" targets for Release (.DLL) builds. 
135  */
136
137 int
138 snmp_res_init(void)
139 {
140     return 0;
141 }
142
143 int
144 snmp_res_lock(int groupID, int resourceID)
145 {
146     return 0;
147 }
148
149 int
150 snmp_res_unlock(int groupID, int resourceID)
151 {
152     return 0;
153 }
154
155 int
156 snmp_res_destroy_mutex(int groupID, int resourceID)
157 {
158     return 0;
159 }
160 #endif /*  WIN32  */
161 #endif /*  NS_REENTRANT  */
162
163 #ifdef __cplusplus
164 };
165 #endif