mirror of
				https://gitee.com/jiuyilian/embedded-framework.git
				synced 2025-10-24 18:20:15 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			42 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.6 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 "IHalCpp.h"
 | |
| #include "ILog.h"
 | |
| #include <memory>
 | |
| std::shared_ptr<IHalCpp> &IHalCpp::GetInstance(std::shared_ptr<IHalCpp> *impl)
 | |
| {
 | |
|     static std::shared_ptr<IHalCpp> instance = std::make_shared<IHalCpp>();
 | |
|     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 = *impl;
 | |
|         }
 | |
|         else {
 | |
|             LogError("[ error ] instance change failed, using by some one.\n");
 | |
|         }
 | |
|         instanceChanging = false;
 | |
|     }
 | |
|     if (instanceChanging) {
 | |
|         static std::shared_ptr<IHalCpp> tmporaryInstance = std::make_shared<IHalCpp>();
 | |
|         return tmporaryInstance;
 | |
|     }
 | |
|     return instance;
 | |
| } | 
