shmem.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. * END COPYRIGHT BLOCK **/
  6. /*
  7. * shmem.h: Portable abstraction for memory shared among a server's workers
  8. *
  9. * Rob McCool
  10. */
  11. #include "shmem.h"
  12. #if defined (SHMEM_UNIX_MMAP)
  13. #include <sys/types.h>
  14. #include <sys/stat.h>
  15. #include <unistd.h>
  16. #include <private/pprio.h> /* for nspr20 binary release */
  17. NSPR_BEGIN_EXTERN_C
  18. #include <sys/mman.h>
  19. NSPR_END_EXTERN_C
  20. NSAPI_PUBLIC shmem_s *shmem_alloc(char *name, int size, int expose)
  21. {
  22. shmem_s *ret = (shmem_s *) PERM_MALLOC(sizeof(shmem_s));
  23. char *growme;
  24. if( (ret->fd = PR_Open(name, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE, 0666)) == NULL) {
  25. PERM_FREE(ret);
  26. return NULL;
  27. }
  28. growme = (char *) PERM_MALLOC(size);
  29. ZERO(growme, size);
  30. if(PR_Write(ret->fd, (char *)growme, size) < 0) {
  31. PR_Close(ret->fd);
  32. PERM_FREE(growme);
  33. PERM_FREE(ret);
  34. return NULL;
  35. }
  36. PERM_FREE(growme);
  37. PR_Seek(ret->fd, 0, PR_SEEK_SET);
  38. if( (ret->data = (char *)mmap(NULL, size, PROT_READ | PROT_WRITE,
  39. SHMEM_MMAP_FLAGS, PR_FileDesc2NativeHandle(ret->fd), 0)) == (caddr_t) -1)
  40. {
  41. PR_Close(ret->fd);
  42. PERM_FREE(ret);
  43. return NULL;
  44. }
  45. if(!expose) {
  46. ret->name = NULL;
  47. unlink(name);
  48. }
  49. else
  50. ret->name = STRDUP(name);
  51. ret->size = size;
  52. return ret;
  53. }
  54. NSAPI_PUBLIC void shmem_free(shmem_s *region)
  55. {
  56. if(region->name) {
  57. unlink(region->name);
  58. PERM_FREE(region->name);
  59. }
  60. munmap((char *)region->data, region->size); /* CLEARLY, C++ SUCKS */
  61. PR_Close(region->fd);
  62. PERM_FREE(region);
  63. }
  64. #elif defined (SHMEM_WIN32_MMAP)
  65. #define PAGE_SIZE (1024*8)
  66. #define ALIGN(x) ( (x+PAGE_SIZE-1) & (~(PAGE_SIZE-1)) )
  67. NSAPI_PUBLIC shmem_s *shmem_alloc(char *name, int size, int expose)
  68. {
  69. shmem_s *ret = (shmem_s *) PERM_MALLOC(sizeof(shmem_s));
  70. HANDLE fHandle;
  71. ret->fd = 0; /* not used on NT */
  72. size = ALIGN(size);
  73. if( !(ret->fdmap = CreateFileMapping(
  74. (HANDLE)0xffffffff,
  75. NULL,
  76. PAGE_READWRITE,
  77. 0,
  78. size,
  79. name)) )
  80. {
  81. int err = GetLastError();
  82. PERM_FREE(ret);
  83. return NULL;
  84. }
  85. if( !(ret->data = (char *)MapViewOfFile (
  86. ret->fdmap,
  87. FILE_MAP_ALL_ACCESS,
  88. 0,
  89. 0,
  90. 0)) )
  91. {
  92. CloseHandle(ret->fdmap);
  93. PERM_FREE(ret);
  94. return NULL;
  95. }
  96. ret->size = size;
  97. ret->name = NULL;
  98. return ret;
  99. }
  100. NSAPI_PUBLIC void shmem_free(shmem_s *region)
  101. {
  102. if(region->name) {
  103. DeleteFile(region->name);
  104. PERM_FREE(region->name);
  105. }
  106. UnmapViewOfFile(region->data);
  107. CloseHandle(region->fdmap);
  108. PERM_FREE(region);
  109. }
  110. #endif /* SHMEM_WIN32_MMAP */