diff options
Diffstat (limited to 'core/io/ip.cpp')
| -rw-r--r-- | core/io/ip.cpp | 86 | 
1 files changed, 37 insertions, 49 deletions
diff --git a/core/io/ip.cpp b/core/io/ip.cpp index 24b8ec7cc1..eb7814054b 100644 --- a/core/io/ip.cpp +++ b/core/io/ip.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */  /*                                                                       */  /* Permission is hereby granted, free of charge, to any person obtaining */  /* a copy of this software and associated documentation files (the       */ @@ -30,9 +30,9 @@  #include "ip.h" -#include "core/hash_map.h"  #include "core/os/semaphore.h"  #include "core/os/thread.h" +#include "core/templates/hash_map.h"  VARIANT_ENUM_CAST(IP::ResolverStatus); @@ -40,14 +40,14 @@ VARIANT_ENUM_CAST(IP::ResolverStatus);  struct _IP_ResolverPrivate {  	struct QueueItem { -		volatile IP::ResolverStatus status; -		IP_Address response; +		SafeNumeric<IP::ResolverStatus> status; +		IPAddress response;  		String hostname;  		IP::Type type;  		void clear() { -			status = IP::RESOLVER_STATUS_NONE; -			response = IP_Address(); +			status.set(IP::RESOLVER_STATUS_NONE); +			response = IPAddress();  			type = IP::TYPE_NONE;  			hostname = "";  		}; @@ -61,7 +61,7 @@ struct _IP_ResolverPrivate {  	IP::ResolverID find_empty_id() const {  		for (int i = 0; i < IP::RESOLVER_MAX_QUERIES; i++) { -			if (queue[i].status == IP::RESOLVER_STATUS_NONE) { +			if (queue[i].status.get() == IP::RESOLVER_STATUS_NONE) {  				return i;  			}  		} @@ -71,21 +71,21 @@ struct _IP_ResolverPrivate {  	Mutex mutex;  	Semaphore sem; -	Thread *thread; +	Thread thread;  	//Semaphore* semaphore;  	bool thread_abort;  	void resolve_queues() {  		for (int i = 0; i < IP::RESOLVER_MAX_QUERIES; i++) { -			if (queue[i].status != IP::RESOLVER_STATUS_WAITING) { +			if (queue[i].status.get() != IP::RESOLVER_STATUS_WAITING) {  				continue;  			}  			queue[i].response = IP::get_singleton()->resolve_hostname(queue[i].hostname, queue[i].type);  			if (!queue[i].response.is_valid()) { -				queue[i].status = IP::RESOLVER_STATUS_ERROR; +				queue[i].status.set(IP::RESOLVER_STATUS_ERROR);  			} else { -				queue[i].status = IP::RESOLVER_STATUS_DONE; +				queue[i].status.set(IP::RESOLVER_STATUS_DONE);  			}  		}  	} @@ -101,23 +101,23 @@ struct _IP_ResolverPrivate {  		}  	} -	HashMap<String, IP_Address> cache; +	HashMap<String, IPAddress> cache;  	static String get_cache_key(String p_hostname, IP::Type p_type) {  		return itos(p_type) + p_hostname;  	}  }; -IP_Address IP::resolve_hostname(const String &p_hostname, IP::Type p_type) { +IPAddress IP::resolve_hostname(const String &p_hostname, IP::Type p_type) {  	MutexLock lock(resolver->mutex);  	String key = _IP_ResolverPrivate::get_cache_key(p_hostname, p_type);  	if (resolver->cache.has(key) && resolver->cache[key].is_valid()) { -		IP_Address res = resolver->cache[key]; +		IPAddress res = resolver->cache[key];  		return res;  	} -	IP_Address res = _resolve_hostname(p_hostname, p_type); +	IPAddress res = _resolve_hostname(p_hostname, p_type);  	resolver->cache[key] = res;  	return res;  } @@ -137,11 +137,11 @@ IP::ResolverID IP::resolve_hostname_queue_item(const String &p_hostname, IP::Typ  	resolver->queue[id].type = p_type;  	if (resolver->cache.has(key) && resolver->cache[key].is_valid()) {  		resolver->queue[id].response = resolver->cache[key]; -		resolver->queue[id].status = IP::RESOLVER_STATUS_DONE; +		resolver->queue[id].status.set(IP::RESOLVER_STATUS_DONE);  	} else { -		resolver->queue[id].response = IP_Address(); -		resolver->queue[id].status = IP::RESOLVER_STATUS_WAITING; -		if (resolver->thread) { +		resolver->queue[id].response = IPAddress(); +		resolver->queue[id].status.set(IP::RESOLVER_STATUS_WAITING); +		if (resolver->thread.is_started()) {  			resolver->sem.post();  		} else {  			resolver->resolve_queues(); @@ -156,23 +156,23 @@ IP::ResolverStatus IP::get_resolve_item_status(ResolverID p_id) const {  	MutexLock lock(resolver->mutex); -	if (resolver->queue[p_id].status == IP::RESOLVER_STATUS_NONE) { +	if (resolver->queue[p_id].status.get() == IP::RESOLVER_STATUS_NONE) {  		ERR_PRINT("Condition status == IP::RESOLVER_STATUS_NONE");  		resolver->mutex.unlock();  		return IP::RESOLVER_STATUS_NONE;  	} -	return resolver->queue[p_id].status; +	return resolver->queue[p_id].status.get();  } -IP_Address IP::get_resolve_item_address(ResolverID p_id) const { -	ERR_FAIL_INDEX_V(p_id, IP::RESOLVER_MAX_QUERIES, IP_Address()); +IPAddress IP::get_resolve_item_address(ResolverID p_id) const { +	ERR_FAIL_INDEX_V(p_id, IP::RESOLVER_MAX_QUERIES, IPAddress());  	MutexLock lock(resolver->mutex); -	if (resolver->queue[p_id].status != IP::RESOLVER_STATUS_DONE) { +	if (resolver->queue[p_id].status.get() != IP::RESOLVER_STATUS_DONE) {  		ERR_PRINT("Resolve of '" + resolver->queue[p_id].hostname + "'' didn't complete yet.");  		resolver->mutex.unlock(); -		return IP_Address(); +		return IPAddress();  	}  	return resolver->queue[p_id].response; @@ -183,13 +183,13 @@ void IP::erase_resolve_item(ResolverID p_id) {  	MutexLock lock(resolver->mutex); -	resolver->queue[p_id].status = IP::RESOLVER_STATUS_NONE; +	resolver->queue[p_id].status.set(IP::RESOLVER_STATUS_NONE);  }  void IP::clear_cache(const String &p_hostname) {  	MutexLock lock(resolver->mutex); -	if (p_hostname.empty()) { +	if (p_hostname.is_empty()) {  		resolver->cache.clear();  	} else {  		resolver->cache.erase(_IP_ResolverPrivate::get_cache_key(p_hostname, IP::TYPE_NONE)); @@ -201,9 +201,9 @@ void IP::clear_cache(const String &p_hostname) {  Array IP::_get_local_addresses() const {  	Array addresses; -	List<IP_Address> ip_addresses; +	List<IPAddress> ip_addresses;  	get_local_addresses(&ip_addresses); -	for (List<IP_Address>::Element *E = ip_addresses.front(); E; E = E->next()) { +	for (List<IPAddress>::Element *E = ip_addresses.front(); E; E = E->next()) {  		addresses.push_back(E->get());  	} @@ -222,7 +222,7 @@ Array IP::_get_local_interfaces() const {  		rc["index"] = c.index;  		Array ips; -		for (const List<IP_Address>::Element *F = c.ip_addresses.front(); F; F = F->next()) { +		for (const List<IPAddress>::Element *F = c.ip_addresses.front(); F; F = F->next()) {  			ips.push_front(F->get());  		}  		rc["addresses"] = ips; @@ -233,11 +233,11 @@ Array IP::_get_local_interfaces() const {  	return results;  } -void IP::get_local_addresses(List<IP_Address> *r_addresses) const { +void IP::get_local_addresses(List<IPAddress> *r_addresses) const {  	Map<String, Interface_Info> interfaces;  	get_local_interfaces(&interfaces);  	for (Map<String, Interface_Info>::Element *E = interfaces.front(); E; E = E->next()) { -		for (const List<IP_Address>::Element *F = E->get().ip_addresses.front(); F; F = F->next()) { +		for (const List<IPAddress>::Element *F = E->get().ip_addresses.front(); F; F = F->next()) {  			r_addresses->push_front(F->get());  		}  	} @@ -285,26 +285,14 @@ IP::IP() {  	singleton = this;  	resolver = memnew(_IP_ResolverPrivate); -#ifndef NO_THREADS -  	resolver->thread_abort = false; - -	resolver->thread = Thread::create(_IP_ResolverPrivate::_thread_function, resolver); -#else -	resolver->thread = nullptr; -#endif +	resolver->thread.start(_IP_ResolverPrivate::_thread_function, resolver);  }  IP::~IP() { -#ifndef NO_THREADS -	if (resolver->thread) { -		resolver->thread_abort = true; -		resolver->sem.post(); -		Thread::wait_to_finish(resolver->thread); -		memdelete(resolver->thread); -	} - -#endif +	resolver->thread_abort = true; +	resolver->sem.post(); +	resolver->thread.wait_to_finish();  	memdelete(resolver);  }  |