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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * protected.c - thread-safe versions of standard library functions
  3.  *
  4.  * Lars Wirzenius
  5.  */
  6. #include <locale.h>
  7. #include "gwlib.h"
  8. /*
  9.  * Undefine the accident protectors.
  10.  */
  11. #undef localtime
  12. #undef gmtime
  13. #undef rand
  14. #undef gethostbyname
  15. enum {
  16.     LOCALTIME,
  17.     GMTIME,
  18.     RAND,
  19.     GETHOSTBYNAME,
  20.     NUM_LOCKS
  21. };
  22. static Mutex locks[NUM_LOCKS];
  23. static void lock(int which)
  24. {
  25.     mutex_lock(&locks[which]);
  26. }
  27. static void unlock(int which)
  28. {
  29.     mutex_unlock(&locks[which]);
  30. }
  31. void gwlib_protected_init(void)
  32. {
  33.     int i;
  34.     for (i = 0; i < NUM_LOCKS; ++i)
  35.         mutex_init_static(&locks[i]);
  36. }
  37. void gwlib_protected_shutdown(void)
  38. {
  39.     int i;
  40.     for (i = 0; i < NUM_LOCKS; ++i)
  41.         mutex_destroy(&locks[i]);
  42. }
  43. struct tm gw_localtime(time_t t)
  44. {
  45.     struct tm tm;
  46.     lock(LOCALTIME);
  47.     tm = *localtime(&t);
  48.     unlock(LOCALTIME);
  49.     return tm;
  50. }
  51. struct tm gw_gmtime(time_t t)
  52. {
  53.     struct tm tm;
  54.     lock(GMTIME);
  55.     tm = *gmtime(&t);
  56.     unlock(GMTIME);
  57.     return tm;
  58. }
  59. int gw_rand(void)
  60. {
  61.     int ret;
  62.     lock(RAND);
  63.     ret = rand();
  64.     unlock(RAND);
  65.     return ret;
  66. }
  67. int gw_gethostbyname(struct hostent *ent, const char *name)
  68. {
  69.     int ret;
  70.     struct hostent *p;
  71.     lock(GETHOSTBYNAME);
  72.     p = gethostbyname(name);
  73.     if (p == NULL)
  74.         ret = -1;
  75.     else {
  76.         ret = 0;
  77.         *ent = *p;
  78.     }
  79.     unlock(GETHOSTBYNAME);
  80.     return ret;
  81. }