Blame snmplib/mt_support.c

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