thread.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:2k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <unistd.h>
  7. #include "gwlib/gwlib.h"
  8. #ifdef MUTEX_STATS
  9. Mutex *mutex_make_measured(Mutex *mutex, unsigned char *filename, int lineno)
  10. {
  11.     mutex->filename = filename;
  12.     mutex->lineno = lineno;
  13.     mutex->locks = 0;
  14.     mutex->collisions = 0;
  15.     return mutex;
  16. }
  17. #endif
  18. Mutex *mutex_create_real(void)
  19. {
  20.     Mutex *mutex;
  21.     mutex = gw_malloc(sizeof(Mutex));
  22.     pthread_mutex_init(&mutex->mutex, NULL);
  23.     mutex->owner = -1;
  24.     mutex->dynamic = 1;
  25.     return mutex;
  26. }
  27. Mutex *mutex_init_static_real(Mutex *mutex)
  28. {
  29.     pthread_mutex_init(&mutex->mutex, NULL);
  30.     mutex->owner = -1;
  31.     mutex->dynamic = 0;
  32.     return mutex;
  33. }
  34. void mutex_destroy(Mutex *mutex)
  35. {
  36.     if (mutex == NULL)
  37.         return;
  38. #ifdef MUTEX_STATS
  39.     if (mutex->locks > 0 || mutex->collisions > 0) {
  40.         info(0, "Mutex %s:%d: %ld locks, %ld collisions.",
  41.              mutex->filename, mutex->lineno,
  42.              mutex->locks, mutex->collisions);
  43.     }
  44. #endif
  45.     pthread_mutex_destroy(&mutex->mutex);
  46.     if (mutex->dynamic == 0)
  47.         return;
  48.     gw_free(mutex);
  49. }
  50. void mutex_lock_real(Mutex *mutex, char *file, int line, const char *func)
  51. {
  52.     int ret;
  53.     gw_assert(mutex != NULL);
  54. #ifdef MUTEX_STATS
  55.     ret = pthread_mutex_trylock(&mutex->mutex);
  56.     if (ret != 0) {
  57.         ret = pthread_mutex_lock(&mutex->mutex);
  58.         mutex->collisions++;
  59.     }
  60.     mutex->locks++;
  61. #else
  62.     ret = pthread_mutex_lock(&mutex->mutex);
  63. #endif
  64.     if (ret != 0)
  65.         panic(0, "%s:%ld: %s: Mutex failure! (Called from %s:%ld:%s.)", 
  66.          __FILE__, (long) __LINE__, __func__, file, (long) line, func);
  67.     if (mutex->owner == gwthread_self())
  68.         panic(0, "%s:%ld: %s: Managed to lock the mutex twice! (Called from %s:%ld:%s.)", 
  69.          __FILE__, (long) __LINE__, __func__, file, (long) line, func);
  70.     mutex->owner = gwthread_self();
  71. }
  72. int mutex_unlock_real(Mutex *mutex, char *file, int line, const char *func)
  73. {
  74.      int ret;
  75.     
  76.     if (mutex == NULL) {
  77.         error(0, "%s:%ld: %s: Trying to unlock a NULL mutex! (Called from %s:%ld:%s.)", 
  78.          __FILE__, (long) __LINE__, __func__, file, (long) line, func);
  79.        return -1;
  80.     }
  81.     gw_assert(mutex != NULL);
  82.     mutex->owner = -1;
  83.     ret = pthread_mutex_unlock(&mutex->mutex);
  84.     if (ret != 0)
  85.         panic(0, "%s:%ld: %s: Mutex failure! (Called from %s:%ld:%s.)", 
  86.          __FILE__, (long) __LINE__, __func__, file, (long) line, func);
  87.     return ret;
  88. }