mt_support.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:3k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  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. #include <net-snmp/net-snmp-config.h>
  12. #include <errno.h>
  13. #include <net-snmp/library/mt_support.h>
  14. #ifdef __cplusplus
  15. extern          "C" {
  16. #endif
  17. #ifdef NS_REENTRANT
  18. static mutex_type s_res[MT_MAX_IDS][MT_LIB_MAXIMUM];  /* locking structures */
  19. static mutex_type *
  20. _mt_res(int groupID, int resourceID)
  21. {
  22.     if (groupID < 0) {
  23. return 0;
  24.     }
  25.     if (groupID >= MT_MAX_IDS) {
  26. return 0;
  27.     }
  28.     if (resourceID < 0) {
  29. return 0;
  30.     }
  31.     if (resourceID >= MT_LIB_MAXIMUM) {
  32. return 0;
  33.     }
  34.     return (&s_res[groupID][resourceID]);
  35. }
  36. static int
  37. snmp_res_init_mutex(mutex_type *mutex)
  38. {
  39.     int rc = 0;
  40. #if HAVE_PTHREAD_H
  41.     rc = pthread_mutex_init(mutex, MT_MUTEX_INIT_DEFAULT);
  42. #elif defined(WIN32)
  43.     InitializeCriticalSection(mutex);
  44. #endif
  45.     return rc;
  46. }
  47. int
  48. snmp_res_init(void)
  49. {
  50.     int ii, jj, rc = 0;
  51.     mutex_type *mutex;
  52.     for (jj = 0; (0 == rc) && (jj < MT_MAX_IDS); jj++) {
  53. for (ii = 0; (0 == rc) && (ii < MT_LIB_MAXIMUM); ii++) {
  54.     mutex = _mt_res(jj, ii);
  55.     if (!mutex) {
  56. continue;
  57.     }
  58.     rc = snmp_res_init_mutex(mutex);
  59. }
  60.     }
  61.     return rc;
  62. }
  63. int
  64. snmp_res_destroy_mutex(int groupID, int resourceID)
  65. {
  66.     int rc = 0;
  67.     mutex_type *mutex = _mt_res(groupID, resourceID);
  68.     if (!mutex) {
  69. return EFAULT;
  70.     }
  71. #if HAVE_PTHREAD_H
  72.     rc = pthread_mutex_destroy(mutex);
  73. #elif defined(WIN32)
  74.     DeleteCriticalSection(mutex);
  75. #endif
  76.     return rc;
  77. }
  78. int
  79. snmp_res_lock(int groupID, int resourceID)
  80. {
  81.     int rc = 0;
  82.     mutex_type *mutex = _mt_res(groupID, resourceID);
  83.     
  84.     if (!mutex) {
  85. return EFAULT;
  86.     }
  87. #if HAVE_PTHREAD_H
  88.     rc = pthread_mutex_lock(mutex);
  89. #elif defined(WIN32)
  90.     EnterCriticalSection(mutex);
  91. #endif
  92.     return rc;
  93. }
  94. int
  95. snmp_res_unlock(int groupID, int resourceID)
  96. {
  97.     int rc = 0;
  98.     mutex_type *mutex = _mt_res(groupID, resourceID);
  99.     if (!mutex) {
  100. return EFAULT;
  101.     }
  102. #if HAVE_PTHREAD_H
  103.     rc = pthread_mutex_unlock(mutex);
  104. #elif defined(WIN32)
  105.     LeaveCriticalSection(mutex);
  106. #endif
  107.     return rc;
  108. }
  109. #else  /*  NS_REENTRANT  */
  110. #ifdef WIN32
  111. /*
  112.  * Provide "do nothing" targets for Release (.DLL) builds. 
  113.  */
  114. int
  115. snmp_res_init(void)
  116. {
  117.     return 0;
  118. }
  119. int
  120. snmp_res_lock(int groupID, int resourceID)
  121. {
  122.     return 0;
  123. }
  124. int
  125. snmp_res_unlock(int groupID, int resourceID)
  126. {
  127.     return 0;
  128. }
  129. int
  130. snmp_res_destroy_mutex(int groupID, int resourceID)
  131. {
  132.     return 0;
  133. }
  134. #endif /*  WIN32  */
  135. #endif /*  NS_REENTRANT  */
  136. #ifdef __cplusplus
  137. }
  138. #endif