46 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2023 Fancy Code.
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 * 
 | 
						|
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 * 
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
#include "ILogCpp.h"
 | 
						|
#include <memory>
 | 
						|
std::shared_ptr<ILogCpp> &ILogCpp::GetInstance(std::shared_ptr<ILogCpp> *impl)
 | 
						|
{
 | 
						|
    static std::shared_ptr<ILogCpp> instance = std::make_shared<ILogCpp>();
 | 
						|
    static bool instanceChanging = false;
 | 
						|
    if (impl && false == instanceChanging)
 | 
						|
    {
 | 
						|
        // Don't use std::mutex for runing faster.
 | 
						|
        // Sleep for difference thread to release instance.
 | 
						|
        instanceChanging = true;
 | 
						|
        // std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Don't sleep and make sure that start fast.
 | 
						|
        if (instance.use_count() == 1) // bug?
 | 
						|
        {
 | 
						|
            // LogInfo("Instance change succeed.\n");
 | 
						|
            // instance->UnInit();
 | 
						|
            // (*impl)->Init();
 | 
						|
            instance = *impl;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            // LogError("[ error ] instance change failed, using by some one.\n");
 | 
						|
        }
 | 
						|
        instanceChanging = false;
 | 
						|
    }
 | 
						|
    if (instanceChanging)
 | 
						|
    {
 | 
						|
        static std::shared_ptr<ILogCpp> tmporaryInstance = std::make_shared<ILogCpp>();
 | 
						|
        return tmporaryInstance;
 | 
						|
    }
 | 
						|
    return instance;
 | 
						|
} |