mt_support.c
上传用户:cxs890
上传日期:2021-05-22
资源大小:347k
文件大小:3k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /* mt_support.c - multi-thread resource locking support */
  2. /*
  3.  * Author: Markku Laukkanen
  4.  * Created: 6-Sep-1999
  5.  * History:
  6.  *  8-Sep-1999 M. Slifcak method names changed;
  7.  *                        use array of resource locking structures.
  8.  */
  9. #include <config.h>
  10. #include <errno.h>
  11. #include "mt_support.h"
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. #ifdef _REENTRANT
  16. static
  17. mutex_type s_res[MT_MAX_IDS][MT_LIB_MAXIMUM];  /* locking structures */
  18. static mutex_type * _mt_res(int groupID, int resourceID)
  19. {
  20.     if (groupID < 1) return 0;
  21.     if (groupID >= MT_MAX_IDS) return 0;
  22.     if (resourceID < 1) return 0;
  23.     if (resourceID >= MT_LIB_MAXIMUM) return 0;
  24.     return (&s_res[groupID][resourceID]);
  25. }
  26. static
  27. int snmp_res_init_mutex(mutex_type * mutex)
  28. {    
  29.     int rc = 0;
  30. #if HAVE_PTHREAD_H
  31.     rc = pthread_mutex_init(mutex, MT_MUTEX_INIT_DEFAULT);
  32. #elif defined(WIN32)
  33.     InitializeCriticalSection(mutex);
  34. #endif
  35.     return rc;
  36. }
  37. int snmp_res_init(void)
  38. {    
  39.     int ii, jj;
  40.     int rc = 0;
  41.     mutex_type *mutex;
  42.   for (jj = 0; (0 == rc) && (jj < MT_MAX_IDS); jj++)
  43.   for (ii = 0; (0 == rc) && (ii < MT_LIB_MAXIMUM); ii++)
  44.   {
  45.     mutex = _mt_res(jj, ii);
  46.     if (!mutex) continue;
  47.     rc = snmp_res_init_mutex( mutex );
  48.   }
  49.     return rc;
  50. }
  51. int snmp_res_destroy_mutex(int groupID, int resourceID)
  52. {    
  53.     int rc = 0;
  54.     mutex_type *mutex = _mt_res(groupID, resourceID);
  55.     if (!mutex) return EFAULT;
  56. #if HAVE_PTHREAD_H
  57.     rc = pthread_mutex_destroy(mutex);
  58. #elif defined(WIN32)
  59.     DeleteCriticalSection(mutex);
  60. #endif
  61.     return rc;
  62. }
  63.     
  64. int snmp_res_lock(int groupID, int resourceID)
  65. {
  66.     int rc = 0;
  67.     mutex_type *mutex = _mt_res(groupID, resourceID);
  68.     if (!mutex) return EFAULT;
  69. #if HAVE_PTHREAD_H
  70.     rc = pthread_mutex_lock(mutex);
  71. #elif defined(WIN32)
  72.     EnterCriticalSection(mutex);
  73. #endif
  74.     return rc;
  75. }
  76. int snmp_res_unlock(int groupID, int resourceID)
  77. {
  78.     int rc = 0;
  79.     mutex_type *mutex = _mt_res(groupID, resourceID);
  80.     if (!mutex) return EFAULT;
  81. #if HAVE_PTHREAD_H
  82.     rc = pthread_mutex_unlock(mutex);
  83. #elif defined(WIN32)
  84.     LeaveCriticalSection(mutex);
  85. #endif
  86.     return rc;
  87. }
  88. #else  /* !_REENTRANT */
  89. #ifdef WIN32
  90. /* Provide "do nothing" targets for Release (.DLL) builds. */
  91. #undef snmp_res_init
  92. #undef snmp_res_lock
  93. #undef snmp_res_unlock
  94. #undef snmp_res_destroy_mutex
  95. int snmp_res_init(void) { return 0; }
  96. int snmp_res_lock(int groupID, int resourceID) { return 0; }
  97. int snmp_res_unlock(int groupID, int resourceID) { return 0; }
  98. int snmp_res_destroy_mutex(int groupID, int resourceID) { return 0; }
  99. #endif /* !WIN32 */
  100. #endif /* !_REENTRANT */
  101. #ifdef __cplusplus
  102. };
  103. #endif