Re: [Dnsmasq-discuss] [PATCH] Simplify options flags

2018-10-24 Thread Simon Kelley
On 24/10/2018 16:25, Petr Mensik wrote:
> Hi!
> 
> I have not managed it until dnsmasq 2.80 were out, but anyway. I have
> some proposal to simplify handling of options bits. Static analysis
> complains on compiler dead-code optimization. I propose having array
> instead. It adds few defines. But it allows adding any bits to defines
> and moving OPT_LAST. It will resize itself as required.
> 
> It might be possible to change unsigned int to unsigned long. It would
> use 64 bit numbers on x86_64 machines. But I guess it might not be worth
> that optimization.
> 
> Chances to get it merged?
> 
> 

Merged as is. a definite improvement.


Cheers,

Simon.




signature.asc
Description: OpenPGP digital signature
___
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss


[Dnsmasq-discuss] Compile-time options - taming the combinatorial explosion.

2018-10-24 Thread Simon Kelley
The dnsmasq code has a range of binary compile-time options, implemented
conventionally using the C pre-processor. These options are mutually
independent, so the numnber of different versions scales as 2^n. To keep
this managable, I'm trying to limit the number of options.

I've already removed HAVE_IPV6. This was added originally to support
very ancient embedded libc versions, and to save a few bytes on very
limited machines. I think it's reasonable to assume in 2018 that nobody
wants to eliminate IPv6 support, and that nobody is running with a libc
that doesn't know about IPv6.


The next option in my sights is NO_FORK. This produces a
mostly-functional binary that never forks any new processes. It was
added long ago to support uclinux, the MMU-less version of Linux. As far
as I can tell, MMU-less linux is a dead project, and I'm minded to
remove NO_FORK. Opinions? Is this option vital to something I'm not
aware of?



Cheers,

Simon.




signature.asc
Description: OpenPGP digital signature
___
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss


[Dnsmasq-discuss] [PATCH] Simplify options flags

2018-10-24 Thread Petr Mensik
Hi!

I have not managed it until dnsmasq 2.80 were out, but anyway. I have
some proposal to simplify handling of options bits. Static analysis
complains on compiler dead-code optimization. I propose having array
instead. It adds few defines. But it allows adding any bits to defines
and moving OPT_LAST. It will resize itself as required.

It might be possible to change unsigned int to unsigned long. It would
use 64 bit numbers on x86_64 machines. But I guess it might not be worth
that optimization.

Chances to get it merged?
-- 
Petr Menšík
Software Engineer
Red Hat, http://www.redhat.com/
email: pemen...@redhat.com  PGP: 65C6C973
From 2a698e8e5162c2e2272a638354bb0e3bbebb4b02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= 
Date: Mon, 20 Aug 2018 19:56:47 +0200
Subject: [PATCH] Simplify options bits

Do not rely on dead code elimination, use array instead.
Make options bits derived from size and count. Use size of option bits
and last supported bit in computation. No new change would be required
when new options are added. Just change OPT_LAST constant.
---
 src/dnsmasq.h | 11 +++
 src/option.c  | 10 ++
 2 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index e2d5626..f8803f5 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -200,9 +200,6 @@ struct event_desc {
 #define EC_MISC5
 #define EC_INIT_OFFSET 10
 
-/* Trust the compiler dead-code eliminator */
-#define option_bool(x) (((x) < 32) ? daemon->options & (1u << (x)) : daemon->options2 & (1u << ((x) - 32)))
-
 #define OPT_BOGUSPRIV  0
 #define OPT_FILTER 1
 #define OPT_LOG2
@@ -264,6 +261,12 @@ struct event_desc {
 #define OPT_UBUS   58
 #define OPT_LAST   59
 
+#define OPTION_BITS (sizeof(unsigned int)*8)
+#define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) )
+#define option_var(x) (daemon->options[(x) / OPTION_BITS])
+#define option_val(x) ((1u) << ((x) % OPTION_BITS))
+#define option_bool(x) (option_var(x) & option_val(x))
+
 /* extra flags for my_syslog, we use a couple of facilities since they are known 
not to occupy the same bits as priorities, no matter how syslog.h is set up. */
 #define MS_TFTP   LOG_USER
@@ -978,7 +981,7 @@ extern struct daemon {
  config file arguments. All set (including defaults)
  in option.c */
 
-  unsigned int options, options2;
+  unsigned int options[OPTION_SIZE];
   struct resolvc default_resolv, *resolv_files;
   time_t last_resolv;
   char *servers_file;
diff --git a/src/option.c b/src/option.c
index 66847fb..8198757 100644
--- a/src/option.c
+++ b/src/option.c
@@ -1583,18 +1583,12 @@ on_error:
 
 void set_option_bool(unsigned int opt)
 {
-  if (opt < 32)
-daemon->options |= 1u << opt;
-  else
-daemon->options2 |= 1u << (opt - 32);
+  option_var(opt) |= option_val(opt);
 }
 
 void reset_option_bool(unsigned int opt)
 {
-  if (opt < 32)
-daemon->options &= ~(1u << opt);
-  else
-daemon->options2 &= ~(1u << (opt - 32));
+  option_var(opt) &= ~(option_val(opt));
 }
 
 static void server_list_free(struct server *list)
-- 
2.14.4

___
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss