doc_managed_grow.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
  4. // Software License, Version 1.0. (See accompanying file
  5. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/libs/interprocess for documentation.
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #include <boost/interprocess/detail/config_begin.hpp>
  11. //[doc_managed_grow
  12. #include <boost/interprocess/managed_shared_memory.hpp>
  13. #include <boost/interprocess/managed_mapped_file.hpp>
  14. #include <cassert>
  15. //<-
  16. #include "../test/get_process_id_name.hpp"
  17. //->
  18. class MyClass
  19. {
  20. //...
  21. };
  22. int main()
  23. {
  24. using namespace boost::interprocess;
  25. //Remove shared memory on construction and destruction
  26. struct shm_remove
  27. {
  28. //<-
  29. #if 1
  30. shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
  31. ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
  32. #else
  33. //->
  34. shm_remove() { shared_memory_object::remove("MySharedMemory"); }
  35. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  36. //<-
  37. #endif
  38. //->
  39. } remover;
  40. //<-
  41. (void)remover;
  42. //->
  43. {
  44. //Create a managed shared memory
  45. //<-
  46. #if 1
  47. managed_shared_memory shm(create_only, test::get_process_id_name(), 1000);
  48. #else
  49. //->
  50. managed_shared_memory shm(create_only, "MySharedMemory", 1000);
  51. //<-
  52. #endif
  53. //->
  54. //Check size
  55. assert(shm.get_size() == 1000);
  56. //Construct a named object
  57. MyClass *myclass = shm.construct<MyClass>("MyClass")();
  58. //The managed segment is unmapped here
  59. //<-
  60. (void)myclass;
  61. //->
  62. }
  63. {
  64. //Now that the segment is not mapped grow it adding extra 500 bytes
  65. //<-
  66. #if 1
  67. managed_shared_memory::grow(test::get_process_id_name(), 500);
  68. #else
  69. //->
  70. managed_shared_memory::grow("MySharedMemory", 500);
  71. //<-
  72. #endif
  73. //->
  74. //Map it again
  75. //<-
  76. #if 1
  77. managed_shared_memory shm(open_only, test::get_process_id_name());
  78. #else
  79. //->
  80. managed_shared_memory shm(open_only, "MySharedMemory");
  81. //<-
  82. #endif
  83. //->
  84. //Check size
  85. assert(shm.get_size() == 1500);
  86. //Check "MyClass" is still there
  87. MyClass *myclass = shm.find<MyClass>("MyClass").first;
  88. assert(myclass != 0);
  89. //<-
  90. (void)myclass;
  91. //->
  92. //The managed segment is unmapped here
  93. }
  94. {
  95. //Now minimize the size of the segment
  96. //<-
  97. #if 1
  98. managed_shared_memory::shrink_to_fit(test::get_process_id_name());
  99. #else
  100. //->
  101. managed_shared_memory::shrink_to_fit("MySharedMemory");
  102. //<-
  103. #endif
  104. //->
  105. //Map it again
  106. //<-
  107. #if 1
  108. managed_shared_memory shm(open_only, test::get_process_id_name());
  109. #else
  110. //->
  111. managed_shared_memory shm(open_only, "MySharedMemory");
  112. //<-
  113. #endif
  114. //->
  115. //Check size
  116. assert(shm.get_size() < 1000);
  117. //Check "MyClass" is still there
  118. MyClass *myclass = shm.find<MyClass>("MyClass").first;
  119. assert(myclass != 0);
  120. //The managed segment is unmapped here
  121. //<-
  122. (void)myclass;
  123. //->
  124. }
  125. return 0;
  126. }
  127. //]
  128. #include <boost/interprocess/detail/config_end.hpp>