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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) Yuri Dario & 2000 MySQL AB
  2.    All the above parties has a full, independent copyright to
  3.    the following code, including the right to use the code in
  4.    any manner without any demands from the other parties.
  5.    This library is free software; you can redistribute it and/or
  6.    modify it under the terms of the GNU Library General Public
  7.    License as published by the Free Software Foundation; either
  8.    version 2 of the License, or (at your option) any later version.
  9.    This library is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.    Library General Public License for more details.
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /*****************************************************************************
  18. ** The following is a simple implementation of posix conditions
  19. *****************************************************************************/
  20. #undef SAFE_MUTEX /* Avoid safe_mutex redefinitions */
  21. #include "mysys_priv.h"
  22. #if defined(THREAD) && defined(OS2)
  23. #include <m_string.h>
  24. #include <process.h>
  25. #include <sys/timeb.h>
  26. int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
  27. {
  28.    APIRET    rc = 0;
  29.    HEV    event;
  30.    cond->waiting=0;
  31.    /* Warp3 FP29 or Warp4 FP4 or better required */
  32.    rc = DosCreateEventSem( NULL, &cond->semaphore, 0x0800, 0);
  33.    if (rc)
  34.       return ENOMEM;
  35.   return 0;
  36. }
  37. int pthread_cond_destroy(pthread_cond_t *cond)
  38. {
  39.    APIRET   rc;
  40.    do {
  41.       rc = DosCloseEventSem(cond->semaphore);
  42.       if (rc == 301) DosPostEventSem(cond->semaphore);
  43.    } while (rc == 301);
  44.    if (rc)
  45.       return EINVAL;
  46. return 0;
  47. }
  48. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
  49. {
  50.    APIRET   rc;
  51.    int     rval;
  52.    rval = 0;
  53.    cond->waiting++;
  54.    if (mutex) pthread_mutex_unlock(mutex);
  55.    rc = DosWaitEventSem(cond->semaphore,SEM_INDEFINITE_WAIT);
  56.    if (rc != 0)
  57.       rval = EINVAL;
  58.    if (mutex) pthread_mutex_lock(mutex);
  59.    cond->waiting--;
  60.    return rval;
  61. }
  62. int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
  63.    struct timespec *abstime)
  64. {
  65.   struct timeb curtime;
  66.   int result;
  67.   long timeout;
  68.    APIRET   rc;
  69.    int     rval;
  70.    _ftime(&curtime);
  71.    timeout= ((long) (abstime->ts_sec - curtime.time)*1000L +
  72.     (long)((abstime->ts_nsec/1000) - curtime.millitm)/1000L);
  73.    if (timeout < 0) /* Some safety */
  74.       timeout = 0L;
  75.    rval = 0;
  76.    cond->waiting++;
  77.    if (mutex) pthread_mutex_unlock(mutex);
  78.    rc = DosWaitEventSem(cond->semaphore, timeout);
  79.    if (rc != 0)
  80.       rval = ETIME;
  81.    if (mutex) pthread_mutex_lock(mutex);
  82.    cond->waiting--;
  83.    return rval;
  84. }
  85. int pthread_cond_signal(pthread_cond_t *cond)
  86. {
  87.    APIRET   rc;
  88.    /* Bring the next thread off the condition queue: */
  89.    rc = DosPostEventSem(cond->semaphore);
  90.    return 0;
  91. }
  92. int pthread_cond_broadcast(pthread_cond_t *cond)
  93. {
  94.    int     i;
  95.    APIRET   rc;
  96. /*
  97.  * Enter a loop to bring all threads off the
  98.  * condition queue:
  99.  */
  100.    i = cond->waiting;
  101.    while (i--) rc = DosPostEventSem(cond->semaphore);
  102.    return 0 ;
  103. }
  104. int pthread_attr_init(pthread_attr_t *connect_att)
  105. {
  106.   connect_att->dwStackSize = 0;
  107.   connect_att->dwCreatingFlag = 0;
  108.   connect_att->priority = 0;
  109.   return 0;
  110. }
  111. int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack)
  112. {
  113.   connect_att->dwStackSize=stack;
  114.   return 0;
  115. }
  116. int pthread_attr_setprio(pthread_attr_t *connect_att,int priority)
  117. {
  118.   connect_att->priority=priority;
  119.   return 0;
  120. }
  121. int pthread_attr_destroy(pthread_attr_t *connect_att)
  122. {
  123.   bzero((gptr) connect_att,sizeof(*connect_att));
  124.   return 0;
  125. }
  126. /****************************************************************************
  127. ** Fix localtime_r() to be a bit safer
  128. ****************************************************************************/
  129. struct tm *localtime_r(const time_t *timep,struct tm *tmp)
  130. {
  131.   if (*timep == (time_t) -1) /* This will crash win32 */
  132.   {
  133.     bzero(tmp,sizeof(*tmp));
  134.   }
  135.   else
  136.   {
  137.     struct tm *res=localtime(timep);
  138.     if (!res) /* Wrong date */
  139.     {
  140.       bzero(tmp,sizeof(*tmp)); /* Keep things safe */
  141.       return 0;
  142.     }
  143.     *tmp= *res;
  144.   }
  145.   return tmp;
  146. }
  147. #endif /* __WIN__ */