NdbCondition.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <NdbCondition.h>
  15. #include <NdbThread.h>
  16. #include <NdbMutex.h>
  17. #include <NdbMem.h>
  18. struct NdbCondition
  19. {
  20.   pthread_cond_t cond;
  21. };
  22. struct NdbCondition* 
  23. NdbCondition_Create(void)
  24. {
  25.   struct NdbCondition* tmpCond;
  26.   int result;
  27.   
  28.   tmpCond = (struct NdbCondition*)NdbMem_Allocate(sizeof(struct NdbCondition));
  29.   
  30.   if (tmpCond == NULL)
  31.     return NULL;
  32.   
  33.   result = pthread_cond_init(&tmpCond->cond, NULL);
  34.   
  35.   assert(result==0);
  36.   return tmpCond;
  37. }
  38. int 
  39. NdbCondition_Wait(struct NdbCondition* p_cond,
  40.                   NdbMutex* p_mutex)
  41. {
  42.   int result;
  43.   if (p_cond == NULL || p_mutex == NULL)
  44.     return 1;
  45.   
  46.   result = pthread_cond_wait(&p_cond->cond, p_mutex);
  47.   
  48.   return result;
  49. }
  50. int 
  51. NdbCondition_WaitTimeout(struct NdbCondition* p_cond,
  52.                          NdbMutex* p_mutex,
  53.                          int msecs){
  54.   int result;
  55.   struct timespec abstime; 
  56.   int secs = 0;
  57.   
  58.   if (p_cond == NULL || p_mutex == NULL)
  59.     return 1;
  60.   
  61. #ifdef HAVE_CLOCK_GETTIME
  62.   clock_gettime(CLOCK_REALTIME, &abstime);
  63. #else
  64.   {
  65.     struct timeval tick_time;
  66.     gettimeofday(&tick_time, 0);
  67.     abstime.tv_sec  = tick_time.tv_sec;
  68.     abstime.tv_nsec = tick_time.tv_usec * 1000;
  69.   }
  70. #endif
  71.   if(msecs >= 1000){
  72.     secs  = msecs / 1000;
  73.     msecs = msecs % 1000;
  74.   }
  75.   abstime.tv_sec  += secs;
  76.   abstime.tv_nsec += msecs * 1000000;
  77.   if (abstime.tv_nsec >= 1000000000) {
  78.     abstime.tv_sec  += 1;
  79.     abstime.tv_nsec -= 1000000000;
  80.   }
  81.     
  82.   result = pthread_cond_timedwait(&p_cond->cond, p_mutex, &abstime);
  83.   
  84.   return result;
  85. }
  86. int 
  87. NdbCondition_Signal(struct NdbCondition* p_cond){
  88.   int result;
  89.   if (p_cond == NULL)
  90.     return 1;
  91.   result = pthread_cond_signal(&p_cond->cond);
  92.                              
  93.   return result;
  94. }
  95. int NdbCondition_Broadcast(struct NdbCondition* p_cond)
  96. {
  97.   int result;
  98.   if (p_cond == NULL)
  99.     return 1;
  100.   result = pthread_cond_broadcast(&p_cond->cond);
  101.                              
  102.   return result;
  103. }
  104. int NdbCondition_Destroy(struct NdbCondition* p_cond)
  105. {
  106.   int result;
  107.   if (p_cond == NULL)
  108.     return 1;
  109.   result = pthread_cond_destroy(&p_cond->cond);
  110.   free(p_cond);
  111.   return 0;
  112. }