Line data Source code
1 : //
2 : // Author: Vladimir Migashko <migashko@gmail.com>, (C) 2012
3 : //
4 : // Copyright: See COPYING file that comes with this distribution
5 : //
6 :
7 : #ifndef VSET_VSET_BUFFER_PERSISTENT_MMAP_AD_CLOSE_HPP
8 : #define VSET_VSET_BUFFER_PERSISTENT_MMAP_AD_CLOSE_HPP
9 :
10 : #include <vset/buffer/tags.hpp>
11 : #include <vset/buffer/persistent/tags.hpp>
12 : #include <fas/system/nullptr.hpp>
13 :
14 :
15 : namespace vset { namespace buffer { namespace persistent{ namespace mmap{
16 :
17 9 : struct ad_close
18 : {
19 : template<typename T>
20 20 : void operator()( T& t)
21 : {
22 20 : char *data = t.get_aspect().template get<_buffer_>();
23 20 : size_t size = t.get_aspect().template get<_buffer_size_>();
24 :
25 20 : if ( data != fas_nullptr )
26 : {
27 9 : if ( -1 == ::munmap( data, size ) )
28 0 : throw std::runtime_error(strerror(errno));
29 : }
30 :
31 20 : t.get_aspect().template get<_close_file_>()(t);
32 20 : t.get_aspect().template get<_buffer_>() = fas_nullptr;
33 20 : t.get_aspect().template get<_buffer_size_>() = 0;
34 20 : t.get_aspect().template get<_size_value_>() = 0;
35 20 : t.get_aspect().template get<_capacity_value_>() = 0;
36 20 : t.get_aspect().template get<_file_name_>().clear();
37 20 : }
38 : };
39 :
40 : }}}}
41 :
42 : #endif
|