|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* mt_support.c - multi-thread resource locking support
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Author: Markku Laukkanen
|
|
Packit |
fcad23 |
* Created: 6-Sep-1999
|
|
Packit |
fcad23 |
* History:
|
|
Packit |
fcad23 |
* 8-Sep-1999 M. Slifcak method names changed;
|
|
Packit |
fcad23 |
* use array of resource locking structures.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
#include <errno.h>
|
|
Packit |
fcad23 |
#include <net-snmp/library/mt_support.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifdef __cplusplus
|
|
Packit |
fcad23 |
extern "C" {
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifdef NETSNMP_REENTRANT
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static mutex_type s_res[MT_MAX_IDS][MT_LIB_MAXIMUM]; /* locking structures */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static mutex_type *
|
|
Packit |
fcad23 |
_mt_res(int groupID, int resourceID)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
if (groupID < 0) {
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (groupID >= MT_MAX_IDS) {
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (resourceID < 0) {
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (resourceID >= MT_LIB_MAXIMUM) {
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return (&s_res[groupID][resourceID]);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
snmp_res_init_mutex(mutex_type *mutex)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int rc = 0;
|
|
Packit |
fcad23 |
#if HAVE_PTHREAD_H
|
|
Packit |
fcad23 |
pthread_mutexattr_t attr;
|
|
Packit |
fcad23 |
pthread_mutexattr_init(&attr);
|
|
Packit |
fcad23 |
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
|
Packit |
fcad23 |
rc = pthread_mutex_init(mutex, &attr);
|
|
Packit |
fcad23 |
pthread_mutexattr_destroy(&attr);
|
|
Packit |
fcad23 |
#elif defined(WIN32)
|
|
Packit |
fcad23 |
InitializeCriticalSection(mutex);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_init(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int ii, jj, rc = 0;
|
|
Packit |
fcad23 |
mutex_type *mutex;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
for (jj = 0; (0 == rc) && (jj < MT_MAX_IDS); jj++) {
|
|
Packit |
fcad23 |
for (ii = 0; (0 == rc) && (ii < MT_LIB_MAXIMUM); ii++) {
|
|
Packit |
fcad23 |
mutex = _mt_res(jj, ii);
|
|
Packit |
fcad23 |
if (!mutex) {
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
rc = snmp_res_init_mutex(mutex);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_destroy_mutex(int groupID, int resourceID)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int rc = 0;
|
|
Packit |
fcad23 |
mutex_type *mutex = _mt_res(groupID, resourceID);
|
|
Packit |
fcad23 |
if (!mutex) {
|
|
Packit |
fcad23 |
return EFAULT;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#if HAVE_PTHREAD_H
|
|
Packit |
fcad23 |
rc = pthread_mutex_destroy(mutex);
|
|
Packit |
fcad23 |
#elif defined(WIN32)
|
|
Packit |
fcad23 |
DeleteCriticalSection(mutex);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_lock(int groupID, int resourceID)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int rc = 0;
|
|
Packit |
fcad23 |
mutex_type *mutex = _mt_res(groupID, resourceID);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (!mutex) {
|
|
Packit |
fcad23 |
return EFAULT;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#if HAVE_PTHREAD_H
|
|
Packit |
fcad23 |
rc = pthread_mutex_lock(mutex);
|
|
Packit |
fcad23 |
#elif defined(WIN32)
|
|
Packit |
fcad23 |
EnterCriticalSection(mutex);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_unlock(int groupID, int resourceID)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int rc = 0;
|
|
Packit |
fcad23 |
mutex_type *mutex = _mt_res(groupID, resourceID);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (!mutex) {
|
|
Packit |
fcad23 |
return EFAULT;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#if HAVE_PTHREAD_H
|
|
Packit |
fcad23 |
rc = pthread_mutex_unlock(mutex);
|
|
Packit |
fcad23 |
#elif defined(WIN32)
|
|
Packit |
fcad23 |
LeaveCriticalSection(mutex);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#else /* NETSNMP_REENTRANT */
|
|
Packit |
fcad23 |
#ifdef WIN32
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Provide "do nothing" targets for Release (.DLL) builds.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_init(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_lock(int groupID, int resourceID)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_unlock(int groupID, int resourceID)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_res_destroy_mutex(int groupID, int resourceID)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
#endif /* WIN32 */
|
|
Packit |
fcad23 |
#endif /* NETSNMP_REENTRANT */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifdef __cplusplus
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
#endif
|