doc_managed_allocation_command.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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_allocation_command
  12. #include <boost/interprocess/managed_shared_memory.hpp>
  13. #include <cassert>
  14. //<-
  15. #include "../test/get_process_id_name.hpp"
  16. //->
  17. int main()
  18. {
  19. using namespace boost::interprocess;
  20. //Remove shared memory on construction and destruction
  21. struct shm_remove
  22. {
  23. //<-
  24. #if 1
  25. shm_remove() { shared_memory_object::remove(test::get_process_id_name()); }
  26. ~shm_remove(){ shared_memory_object::remove(test::get_process_id_name()); }
  27. #else
  28. //->
  29. shm_remove() { shared_memory_object::remove("MySharedMemory"); }
  30. ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
  31. //<-
  32. #endif
  33. //->
  34. } remover;
  35. //<-
  36. (void)remover;
  37. //->
  38. //Managed memory segment that allocates portions of a shared memory
  39. //segment with the default management algorithm
  40. //<-
  41. #if 1
  42. managed_shared_memory managed_shm(create_only, test::get_process_id_name(), 10000*sizeof(std::size_t));
  43. #else
  44. //->
  45. managed_shared_memory managed_shm(create_only, "MySharedMemory", 10000*sizeof(std::size_t));
  46. //<-
  47. #endif
  48. //->
  49. //Allocate at least 100 bytes, 1000 bytes if possible
  50. managed_shared_memory::size_type min_size = 100;
  51. managed_shared_memory::size_type first_received_size = 1000;
  52. std::size_t *hint = 0;
  53. std::size_t *ptr = managed_shm.allocation_command<std::size_t>
  54. (boost::interprocess::allocate_new, min_size, first_received_size, hint);
  55. //Received size must be bigger than min_size
  56. assert(first_received_size >= min_size);
  57. //Get free memory
  58. managed_shared_memory::size_type free_memory_after_allocation = managed_shm.get_free_memory();
  59. //<-
  60. (void)free_memory_after_allocation;
  61. //->
  62. //Now write the data
  63. for(std::size_t i = 0; i < first_received_size; ++i) ptr[i] = i;
  64. //Now try to triplicate the buffer. We won't admit an expansion
  65. //lower to the double of the original buffer.
  66. //This "should" be successful since no other class is allocating
  67. //memory from the segment
  68. min_size = first_received_size*2;
  69. managed_shared_memory::size_type expanded_size = first_received_size*3;
  70. std::size_t * ret = managed_shm.allocation_command
  71. (boost::interprocess::expand_fwd, min_size, expanded_size, ptr);
  72. //<-
  73. (void)ret;
  74. //->
  75. //Check invariants
  76. assert(ptr != 0);
  77. assert(ret == ptr);
  78. assert(expanded_size >= first_received_size*2);
  79. //Get free memory and compare
  80. managed_shared_memory::size_type free_memory_after_expansion = managed_shm.get_free_memory();
  81. assert(free_memory_after_expansion < free_memory_after_allocation);
  82. //<-
  83. (void)free_memory_after_expansion;
  84. //->
  85. //Write new values
  86. for(std::size_t i = first_received_size; i < expanded_size; ++i) ptr[i] = i;
  87. //Try to shrink approximately to min_size, but the new size
  88. //should be smaller than min_size*2.
  89. //This "should" be successful since no other class is allocating
  90. //memory from the segment
  91. managed_shared_memory::size_type shrunk_size = min_size;
  92. ret = managed_shm.allocation_command
  93. (boost::interprocess::shrink_in_place, min_size*2, shrunk_size, ptr);
  94. //Check invariants
  95. assert(ptr != 0);
  96. assert(ret == ptr);
  97. assert(shrunk_size <= min_size*2);
  98. assert(shrunk_size >= min_size);
  99. //Get free memory and compare
  100. managed_shared_memory::size_type free_memory_after_shrinking = managed_shm.get_free_memory();
  101. assert(free_memory_after_shrinking > free_memory_after_expansion);
  102. //<-
  103. (void)free_memory_after_shrinking;
  104. //->
  105. //Deallocate the buffer
  106. managed_shm.deallocate(ptr);
  107. return 0;
  108. }
  109. //]
  110. #include <boost/interprocess/detail/config_end.hpp>