config/Data: cast to std::chrono::steady_clock::duration properly
Oh no, 3413d1bf23 was broken!  Instead of passing a number as
"seconds" to the duration constructor, it just abused the duration
constructor as cast operator, which caused custom state_file_interval
settings to be extremely short.
			
			
This commit is contained in:
		
							
								
								
									
										1
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								NEWS
									
									
									
									
									
								
							@@ -4,6 +4,7 @@ ver 0.22.1 (not yet released)
 | 
			
		||||
  - jack, pulse: reduce the delay when stopping or pausing playback
 | 
			
		||||
* playlist
 | 
			
		||||
  - cue: fix two crash bugs
 | 
			
		||||
* state_file: fix the state_file_interval setting
 | 
			
		||||
 | 
			
		||||
ver 0.22 (2020/09/23)
 | 
			
		||||
* protocol
 | 
			
		||||
 
 | 
			
		||||
@@ -101,6 +101,38 @@ ConfigData::GetPositive(ConfigOption option, unsigned default_value) const
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::chrono::steady_clock::duration
 | 
			
		||||
ConfigData::GetUnsigned(ConfigOption option,
 | 
			
		||||
			std::chrono::steady_clock::duration default_value) const
 | 
			
		||||
{
 | 
			
		||||
	return With(option, [default_value](const char *s){
 | 
			
		||||
		if (s == nullptr)
 | 
			
		||||
			return default_value;
 | 
			
		||||
 | 
			
		||||
		auto value = ParseDuration(s);
 | 
			
		||||
		if (value < std::chrono::steady_clock::duration{})
 | 
			
		||||
			throw std::runtime_error("Value must not be negative");
 | 
			
		||||
 | 
			
		||||
		return value;
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::chrono::steady_clock::duration
 | 
			
		||||
ConfigData::GetPositive(ConfigOption option,
 | 
			
		||||
			std::chrono::steady_clock::duration default_value) const
 | 
			
		||||
{
 | 
			
		||||
	return With(option, [default_value](const char *s){
 | 
			
		||||
		if (s == nullptr)
 | 
			
		||||
			return default_value;
 | 
			
		||||
 | 
			
		||||
		auto value = ParseDuration(s);
 | 
			
		||||
		if (value <= std::chrono::steady_clock::duration{})
 | 
			
		||||
			throw std::runtime_error("Value must be positive");
 | 
			
		||||
 | 
			
		||||
		return value;
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
ConfigData::GetBool(ConfigOption option, bool default_value) const
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -78,22 +78,14 @@ struct ConfigData {
 | 
			
		||||
 | 
			
		||||
	std::chrono::steady_clock::duration
 | 
			
		||||
	GetUnsigned(ConfigOption option,
 | 
			
		||||
		    std::chrono::steady_clock::duration default_value) const {
 | 
			
		||||
		// TODO: allow unit suffixes
 | 
			
		||||
		auto u = GetUnsigned(option, default_value.count());
 | 
			
		||||
		return std::chrono::steady_clock::duration(u);
 | 
			
		||||
	}
 | 
			
		||||
		    std::chrono::steady_clock::duration default_value) const;
 | 
			
		||||
 | 
			
		||||
	unsigned GetPositive(ConfigOption option,
 | 
			
		||||
			     unsigned default_value) const;
 | 
			
		||||
 | 
			
		||||
	std::chrono::steady_clock::duration
 | 
			
		||||
	GetPositive(ConfigOption option,
 | 
			
		||||
		    std::chrono::steady_clock::duration default_value) const {
 | 
			
		||||
		// TODO: allow unit suffixes
 | 
			
		||||
		auto u = GetPositive(option, default_value.count());
 | 
			
		||||
		return std::chrono::steady_clock::duration(u);
 | 
			
		||||
	}
 | 
			
		||||
		    std::chrono::steady_clock::duration default_value) const;
 | 
			
		||||
 | 
			
		||||
	bool GetBool(ConfigOption option, bool default_value) const;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -135,3 +135,11 @@ ParseSize(const char *s, std::size_t default_factor)
 | 
			
		||||
 | 
			
		||||
	return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::chrono::steady_clock::duration
 | 
			
		||||
ParseDuration(const char *s)
 | 
			
		||||
{
 | 
			
		||||
	// TODO: allow unit suffixes
 | 
			
		||||
	const std::chrono::seconds seconds(ParseLong(s));
 | 
			
		||||
	return std::chrono::duration_cast<std::chrono::steady_clock::duration>(seconds);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
#ifndef MPD_CONFIG_PARSER_HXX
 | 
			
		||||
#define MPD_CONFIG_PARSER_HXX
 | 
			
		||||
 | 
			
		||||
#include <chrono>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -54,4 +55,10 @@ ParsePositive(const char *s);
 | 
			
		||||
std::size_t
 | 
			
		||||
ParseSize(const char *s, std::size_t default_factor=1);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Throws on error.
 | 
			
		||||
 */
 | 
			
		||||
std::chrono::steady_clock::duration
 | 
			
		||||
ParseDuration(const char *s);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user