PageRenderTime 51ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/fpm/fpm_shm.c

http://github.com/dreamcat4/php-fpm
C | 100 lines | 66 code | 30 blank | 4 comment | 11 complexity | 823f93b1a089a3182611ce864f6b4821 MD5 | raw file
  1. /* $Id: fpm_shm.c,v 1.3 2008/05/24 17:38:47 anight Exp $ */
  2. /* (c) 2007,2008 Andrei Nigmatulin */
  3. #include "fpm_config.h"
  4. #include <unistd.h>
  5. #include <sys/mman.h>
  6. #include <stdlib.h>
  7. #include "fpm_shm.h"
  8. #include "zlog.h"
  9. /* MAP_ANON is depricated, but not in macosx */
  10. #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
  11. #define MAP_ANONYMOUS MAP_ANON
  12. #endif
  13. struct fpm_shm_s *fpm_shm_alloc(size_t sz)
  14. {
  15. struct fpm_shm_s *shm;
  16. shm = malloc(sizeof(*shm));
  17. if (!shm) {
  18. return 0;
  19. }
  20. shm->mem = mmap(0, sz, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
  21. if (!shm->mem) {
  22. zlog(ZLOG_STUFF, ZLOG_SYSERROR, "mmap(MAP_ANONYMOUS | MAP_SHARED) failed");
  23. free(shm);
  24. return 0;
  25. }
  26. shm->used = 0;
  27. shm->sz = sz;
  28. return shm;
  29. }
  30. static void fpm_shm_free(struct fpm_shm_s *shm, int do_unmap)
  31. {
  32. if (do_unmap) {
  33. munmap(shm->mem, shm->sz);
  34. }
  35. free(shm);
  36. }
  37. void fpm_shm_free_list(struct fpm_shm_s *shm, void *mem)
  38. {
  39. struct fpm_shm_s *next;
  40. for (; shm; shm = next) {
  41. next = shm->next;
  42. fpm_shm_free(shm, mem != shm->mem);
  43. }
  44. }
  45. void *fpm_shm_alloc_chunk(struct fpm_shm_s **head, size_t sz, void **mem)
  46. {
  47. size_t pagesize = getpagesize();
  48. static const size_t cache_line_size = 16;
  49. size_t aligned_sz;
  50. struct fpm_shm_s *shm;
  51. void *ret;
  52. sz = (sz + cache_line_size - 1) & -cache_line_size;
  53. shm = *head;
  54. if (0 == shm || shm->sz - shm->used < sz) {
  55. /* allocate one more shm segment */
  56. aligned_sz = (sz + pagesize - 1) & -pagesize;
  57. shm = fpm_shm_alloc(aligned_sz);
  58. if (!shm) {
  59. return 0;
  60. }
  61. shm->next = *head;
  62. if (shm->next) { shm->next->prev = shm; }
  63. shm->prev = 0;
  64. *head = shm;
  65. }
  66. *mem = shm->mem;
  67. ret = (char *) shm->mem + shm->used;
  68. shm->used += sz;
  69. return ret;
  70. }