Skip to content

File Synch.h

File List > include > SpinGenApi > Synch.h

Go to the documentation of this file

//=============================================================================
// Copyright (c) 2026 FLIR Integrated Imaging Solutions, Inc. All Rights Reserved.
//
// This software is the confidential and proprietary information of FLIR
// Integrated Imaging Solutions, Inc. ("Confidential Information"). You
// shall not disclose such Confidential Information and shall use it only in
// accordance with the terms of the license agreement you entered into
// with FLIR Integrated Imaging Solutions, Inc. (FLIR).
//
// FLIR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
// SOFTWARE, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE, OR NON-INFRINGEMENT. FLIR SHALL NOT BE LIABLE FOR ANY DAMAGES
// SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
// THIS SOFTWARE OR ITS DERIVATIVES.
//=============================================================================

#ifndef SPINNAKER_GENAPI_SYNCH_H
#define SPINNAKER_GENAPI_SYNCH_H

#include "SpinnakerPlatform.h"

namespace Spinnaker
{
    namespace GenApi
    {
        //-----------------------------------------------------------------
        // CLock
        //-----------------------------------------------------------------

        class SPINNAKER_API CLock
        {
          public:
            CLock();

            CLock(void* pLock);

            ~CLock();

            bool TryLock();

            void Lock();

            void Unlock();

          private:
            CLock(const CLock&);

            CLock& operator=(const CLock&);

          protected:
            friend class NodeMap;
            void* m_lock;
            bool m_bOwnLock;
        };

        class SPINNAKER_API CLockEx : public CLock
        {
          public:
#if defined(_WIN32)
            int64_t GetLockCount();

            int64_t GetRecursionCount();

#elif defined(__GNUC__) && (defined(__linux__) || defined(__APPLE__))
            // nothing implemented for Unix
#else
#error No/unknown platform support
#endif

          private:
            CLockEx(const CLockEx&);

            CLockEx& operator=(const CLockEx&);

          protected:
            void* m_lockEx;
        };

        //-----------------------------------------------------------------
        // AutoLock
        //-----------------------------------------------------------------
        class AutoLock
        {
            CLock& m_Lock;

          public:
            AutoLock(CLock& lock) : m_Lock(lock)
            {
                m_Lock.Lock();
            }

            ~AutoLock()
            {
                m_Lock.Unlock();
            }

          private:
            AutoLock& operator=(const AutoLock&);
            AutoLock(const AutoLock&);
        };

    } // namespace GenApi
} // namespace Spinnaker

#endif // SPINNAKER_GENAPI_SYNCH_H