LSSTApplications  1.1.2+25,10.0+13,10.0+132,10.0+133,10.0+224,10.0+41,10.0+8,10.0-1-g0f53050+14,10.0-1-g4b7b172+19,10.0-1-g61a5bae+98,10.0-1-g7408a83+3,10.0-1-gc1e0f5a+19,10.0-1-gdb4482e+14,10.0-11-g3947115+2,10.0-12-g8719d8b+2,10.0-15-ga3f480f+1,10.0-2-g4f67435,10.0-2-gcb4bc6c+26,10.0-28-gf7f57a9+1,10.0-3-g1bbe32c+14,10.0-3-g5b46d21,10.0-4-g027f45f+5,10.0-4-g86f66b5+2,10.0-4-gc4fccf3+24,10.0-40-g4349866+2,10.0-5-g766159b,10.0-5-gca2295e+25,10.0-6-g462a451+1
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | List of all members
lsst::ap::detail::BootstrapLock Struct Reference

Mutual exclusion lock suitable for initializing shared memory objects. More...

Public Member Functions

 BootstrapLock (char const *const name)
 
 ~BootstrapLock ()
 

Public Attributes

char const *const _name
 
int _fd
 

Detailed Description

Mutual exclusion lock suitable for initializing shared memory objects.

Before standard POSIX shared memory mutexes can be used for inter-process synchronization, shared memory must be allocated and initialized. Therefore, such mutexes cannot be used to protect allocation and initialization of shared memory blocks themselves. BootstrapLock instances get around this by spinning on exclusive creation of a zero-size shared memory object.

Definition at line 88 of file ChunkManager.cc.

Constructor & Destructor Documentation

lsst::ap::detail::BootstrapLock::BootstrapLock ( char const *const  name)

Definition at line 98 of file ChunkManager.cc.

98  : _name(name), _fd(-1) {
99 
100  assert(name != 0 && name[0] == '/' && "BootstrapLock: illegal name");
101 
102  TimeSpec ts;
103  ts.tv_nsec = 50000; // start off with 50usec sleep time
104  int tries = 22;
105  int fd = 0;
106 
107  while ((fd = ::shm_open(name, O_RDONLY | O_CREAT | O_EXCL, S_IRUSR | S_IRGRP | S_IROTH)) == -1) {
108  if (tries == 0) {
109  throw LSST_EXCEPT(ex::TimeoutError,
110  (boost::format("Unable to obtain shared memory bootstrap lock %1%") % name).str());
111  }
112  ::nanosleep(&ts, 0);
113  ts += ts; // exponential backoff
114  --tries;
115  }
116  _fd = fd;
117 }
#define LSST_EXCEPT(type,...)
Definition: Exception.h:46
lsst::ap::detail::BootstrapLock::~BootstrapLock ( )

Definition at line 120 of file ChunkManager.cc.

120  {
121  if (_fd != -1) {
122  ::close(_fd);
123  ::shm_unlink(_name);
124  }
125 }

Member Data Documentation

int lsst::ap::detail::BootstrapLock::_fd

Definition at line 91 of file ChunkManager.cc.

char const* const lsst::ap::detail::BootstrapLock::_name

Definition at line 90 of file ChunkManager.cc.


The documentation for this struct was generated from the following file: