mirror of
				https://github.com/codership/wsrep-lib.git
				synced 2025-11-04 16:31:42 +03:00 
			
		
		
		
	Added a wsrep::thread_service interface to allow application to inject instrumented thread, mutex and condition variable implementation for provider. The interface is defined in include/wsrep/thread_service.hpp. Sample implementation is provided in dbsim/db_threads.[h|c]pp. This patch will also clean up some remaining dependencies to wsrep-API compilation units so that the dependency to wsrep-API is header only. This will extending the provider support to later wsrep-API versions.
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2018 Codership Oy <info@codership.com>
 | 
						|
 *
 | 
						|
 * This file is part of wsrep-lib.
 | 
						|
 *
 | 
						|
 * Wsrep-lib is free software: you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation, either version 2 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * Wsrep-lib is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License
 | 
						|
 * along with wsrep-lib.  If not, see <https://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
 | 
						|
/** @file id.hpp
 | 
						|
 *
 | 
						|
 * A generic identifier utility class.
 | 
						|
 */
 | 
						|
#ifndef WSREP_ID_HPP
 | 
						|
#define WSREP_ID_HPP
 | 
						|
 | 
						|
#include "exception.hpp"
 | 
						|
 | 
						|
#include <iosfwd>
 | 
						|
#include <cstring> // std::memset()
 | 
						|
 | 
						|
namespace wsrep
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * The idientifier class stores identifiers either in UUID
 | 
						|
     * format or in string format. The storage format is decided
 | 
						|
     * upon construction. If the given string contains a valid
 | 
						|
     * UUID, the storage format will be binary. Otherwise the
 | 
						|
     * string will be copied verbatim. If the string format is used,
 | 
						|
     * the maximum length of the identifier is limited to 16 bytes.
 | 
						|
     */
 | 
						|
    class id
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        typedef struct native_type { unsigned char buf[16]; } native_type;
 | 
						|
        /**
 | 
						|
         * Default constructor. Constructs an empty identifier.
 | 
						|
         */
 | 
						|
        id() : data_() { std::memset(data_.buf, 0, sizeof(data_.buf)); }
 | 
						|
 | 
						|
        /**
 | 
						|
         * Construct from string. The input string may contain either
 | 
						|
         * valid UUID or a string with maximum 16 bytes length.
 | 
						|
         */
 | 
						|
        id(const std::string&);
 | 
						|
 | 
						|
        /**
 | 
						|
         * Construct from void pointer.
 | 
						|
         */
 | 
						|
        id (const void* data, size_t size) : data_()
 | 
						|
        {
 | 
						|
            if (size > 16)
 | 
						|
            {
 | 
						|
                throw wsrep::runtime_error("Too long identifier");
 | 
						|
            }
 | 
						|
            std::memset(data_.buf, 0, sizeof(data_.buf));
 | 
						|
            std::memcpy(data_.buf, data, size);
 | 
						|
        }
 | 
						|
 | 
						|
        bool operator<(const id& other) const
 | 
						|
        {
 | 
						|
            return (std::memcmp(data_.buf, other.data_.buf, sizeof(data_.buf)) < 0);
 | 
						|
        }
 | 
						|
 | 
						|
        bool operator==(const id& other) const
 | 
						|
        {
 | 
						|
            return (std::memcmp(data_.buf, other.data_.buf, sizeof(data_.buf)) == 0);
 | 
						|
        }
 | 
						|
        bool operator!=(const id& other) const
 | 
						|
        {
 | 
						|
            return !(*this == other);
 | 
						|
        }
 | 
						|
        const void* data() const { return data_.buf; }
 | 
						|
 | 
						|
        size_t size() const { return sizeof(data_); }
 | 
						|
 | 
						|
        bool is_undefined() const
 | 
						|
        {
 | 
						|
            return (*this == undefined());
 | 
						|
        }
 | 
						|
 | 
						|
        static const wsrep::id& undefined()
 | 
						|
        {
 | 
						|
            return undefined_;
 | 
						|
        }
 | 
						|
    private:
 | 
						|
        static const wsrep::id undefined_;
 | 
						|
        native_type data_;
 | 
						|
    };
 | 
						|
 | 
						|
    std::ostream& operator<<(std::ostream&, const wsrep::id& id);
 | 
						|
    std::istream& operator>>(std::istream&, wsrep::id& id);
 | 
						|
}
 | 
						|
 | 
						|
#endif // WSREP_ID_HPP
 |