shmticklib.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:2k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  *
  5.  * By using this file, you agree to the terms and conditions set
  6.  * forth in the LICENSE file which can be found at the top level of
  7.  * the sendmail distribution.
  8.  *
  9.  * Contributed by Exactis.com, Inc.
  10.  *
  11.  */
  12. #ifndef lint
  13. static char id[] = "@(#)$Id: shmticklib.c,v 8.4 1999/11/23 07:22:28 gshapiro Exp $";
  14. #endif /* ! lint */
  15. #if _FFR_SHM_STATUS
  16. # include <stdio.h>
  17. # include <sys/types.h>
  18. # include <sys/ipc.h>
  19. # include <sys/shm.h>
  20. # include "statusd_shm.h"
  21. /*
  22. **  SHMTICK -- increment a shared memory variable
  23. **
  24. ** Parameters:
  25. ** inc_me -- identity of shared memory segment
  26. ** what -- which variable to increment
  27. **
  28. ** Returns:
  29. ** none
  30. */
  31. void
  32. shmtick(inc_me, what)
  33. int inc_me;
  34. int what;
  35. {
  36. static int shmid = -1;
  37. static STATUSD_SHM *sp = (STATUSD_SHM *)-1;
  38. static unsigned int cookie = 0;
  39. if (shmid < 0)
  40. {
  41. int size = sizeof(STATUSD_SHM);
  42. shmid = shmget(STATUSD_SHM_KEY, size, 0);
  43. if (shmid < 0)
  44. return;
  45. }
  46. if ((unsigned long *)sp == (unsigned long *)-1)
  47. {
  48. sp = (STATUSD_SHM *)shmat(shmid, NULL, 0);
  49. if ((unsigned long *)sp == (unsigned long *)-1)
  50. return;
  51. }
  52. if (sp->magic != STATUSD_MAGIC)
  53. {
  54. /*
  55. **  possible race condition, wait for
  56. **  statusd to initialize.
  57. */
  58. return;
  59. }
  60. if (what >= STATUSD_LONGS)
  61. what = STATUSD_LONGS - 1;
  62. if (inc_me >= STATUSD_LONGS)
  63. inc_me = STATUSD_LONGS - 1;
  64. if (sp->ul[STATUSD_COOKIE] != cookie)
  65. {
  66. cookie = sp->ul[STATUSD_COOKIE];
  67. ++(sp->ul[inc_me]);
  68. }
  69. ++(sp->ul[what]);
  70. }
  71. #endif /* _FFR_SHM_STATUS */