OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock Class Reference

Public Member Functions

 InterProcessRefreshTokenLock (const std::string &path)
 ~InterProcessRefreshTokenLock ()
bool locked () const
 InterProcessRefreshTokenLock (const InterProcessRefreshTokenLock &)=delete
InterProcessRefreshTokenLock & operator= (const InterProcessRefreshTokenLock &)=delete

Private Attributes

bool m_locked = false
int m_fd = -1

Detailed Description

Constructor & Destructor Documentation

◆ InterProcessRefreshTokenLock() [1/2]

Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock::InterProcessRefreshTokenLock ( const std::string & path)
inlineexplicit
138 {
139 if (path.empty()) { m_locked = true; return; } // no path -> proceed unsynchronized
140#if defined(_WIN32)
141 const std::wstring name = L"Local\\OrcaTokenRefresh_" + std::to_wstring(std::hash<std::string>{}(path));
142 m_handle = ::CreateMutexW(nullptr, FALSE, name.c_str());
143 if (!m_handle) { m_locked = true; return; } // can't create -> don't block
144 const DWORD r = ::WaitForSingleObject(m_handle, INFINITE); // blocks, no spin
145 m_locked = (r == WAIT_OBJECT_0 || r == WAIT_ABANDONED); // ABANDONED: prior holder crashed
146#else
147 m_fd = ::open(path.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600);
148 if (m_fd == -1) { m_locked = true; return; } // can't open -> don't block
149 int rc;
150 // An fcntl lock would not block other threads in this process, and any close() of this file would release it.
151 do { rc = ::flock(m_fd, LOCK_EX); } while (rc == -1 && errno == EINTR); // blocks in kernel
152 m_locked = (rc != -1);
153#endif
154 }
#define L(s)
Definition ExtrusionEntity.cpp:25

References L, m_fd, and m_locked.

Referenced by InterProcessRefreshTokenLock(), and operator=().

Here is the caller graph for this function:

◆ ~InterProcessRefreshTokenLock()

Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock::~InterProcessRefreshTokenLock ( )
inline
157 {
158#if defined(_WIN32)
159 if (m_handle) { if (m_locked) ::ReleaseMutex(m_handle); ::CloseHandle(m_handle); }
160#else
161 if (m_fd != -1) ::close(m_fd); // closing the fd releases the lock we hold
162#endif
163 }

References m_fd, and m_locked.

◆ InterProcessRefreshTokenLock() [2/2]

Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock::InterProcessRefreshTokenLock ( const InterProcessRefreshTokenLock & )
delete

References InterProcessRefreshTokenLock().

Here is the call graph for this function:

Member Function Documentation

◆ locked()

bool Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock::locked ( ) const
inline
165{ return m_locked; }

References m_locked.

◆ operator=()

InterProcessRefreshTokenLock & Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock::operator= ( const InterProcessRefreshTokenLock & )
delete

References InterProcessRefreshTokenLock().

Here is the call graph for this function:

Member Data Documentation

◆ m_fd

int Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock::m_fd = -1
private

◆ m_locked

bool Slic3r::anonymous_namespace{OrcaCloudServiceAgent.cpp}::InterProcessRefreshTokenLock::m_locked = false
private

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