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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * gwlib/counter.c - a counter object
  3.  *
  4.  * This file implements the Counter objects declared in counter.h.
  5.  *
  6.  * Lars Wirzenius.
  7.  *
  8.  * Changed the counter type 'long' into 'unsigned long' so it wraps 
  9.  * by itself. Just keep increasing it.
  10.  * Also added a counter_increase_with function.
  11.  * harrie@lisanza.net
  12.  */
  13. #include <limits.h>
  14. #include "gwlib.h"
  15. struct Counter
  16. {
  17.     Mutex *lock;
  18.     unsigned long n;
  19. };
  20. Counter *counter_create(void)
  21. {
  22.     Counter *counter;
  23.     counter = gw_malloc(sizeof(Counter));
  24.     counter->lock = mutex_create();
  25.     counter->n = 0;
  26.     return counter;
  27. }
  28. void counter_destroy(Counter *counter)
  29. {
  30.     mutex_destroy(counter->lock);
  31.     gw_free(counter);
  32. }
  33. unsigned long counter_increase(Counter *counter)
  34. {
  35.     unsigned long ret;
  36.     mutex_lock(counter->lock);
  37.     ret = counter->n;
  38.     ++counter->n;
  39.     mutex_unlock(counter->lock);
  40.     return ret;
  41. }
  42. unsigned long counter_increase_with(Counter *counter, unsigned long value)
  43. {
  44.     unsigned long ret;
  45.     mutex_lock(counter->lock);
  46.     ret = counter->n;
  47.     counter->n += value;
  48.     mutex_unlock(counter->lock);
  49.     return ret;
  50. }
  51. unsigned long counter_value(Counter *counter)
  52. {
  53.     unsigned long ret;
  54.     mutex_lock(counter->lock);
  55.     ret = counter->n;
  56.     mutex_unlock(counter->lock);
  57.     return ret;
  58. }
  59. unsigned long counter_decrease(Counter *counter)
  60. {
  61.     unsigned long ret;
  62.     mutex_lock(counter->lock);
  63.     ret = counter->n;
  64.     if (counter->n > 0)
  65.         --counter->n;
  66.     mutex_unlock(counter->lock);
  67.     return ret;
  68. }
  69. unsigned long counter_set(Counter *counter, unsigned long n)
  70. {
  71.     unsigned long ret;
  72.     mutex_lock(counter->lock);
  73.     ret = counter->n;
  74.     counter->n = n;
  75.     mutex_unlock(counter->lock);
  76.     return ret;
  77. }