code: plan9front

Download patch

ref: 14ac74fce1017b5c23ff4aed6f0289ab82bf71a2
parent: fb96a050f8a9d5f23da3557ba89251ffb73889bf
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Oct 22 14:03:00 EDT 2023

ndb/dns: embedd name string into DN struct

Avoid some indirection and malloc overhad
and just embedd the name string directy in
the DN struct at the end.

--- a/sys/src/cmd/ndb/dn.c
+++ b/sys/src/cmd/ndb/dn.c
@@ -213,11 +213,11 @@
 {
 	DN **l;
 	DN *dp;
+	int n;
 
 	l = &ht[dnhash(name)];
 	lock(&dnlock);
 	for(dp = *l; dp; dp = dp->next) {
-		assert(dp->magic == DNmagic);
 		if(dp->class == class && cistrcmp(dp->name, name) == 0)
 			goto out;
 		l = &dp->next;
@@ -228,9 +228,9 @@
 		return nil;
 	}
 	dnvars.names++;
-	dp = emalloc(sizeof(*dp));
-	dp->magic = DNmagic;
-	dp->name = estrdup(name);
+	n = strlen(name) + 1;
+	dp = emalloc(sizeof(*dp) + n);
+	memmove(dp->name, name, n);
 	dp->class = class;
 	dp->rr = nil;
 	/* add new DN to tail of the hash list.  *l points to last next ptr. */
@@ -486,7 +486,7 @@
 
 	l = &dp->rr;
 	while ((rp = *l) != nil){
-		assert(rp->magic == RRmagic && rp->cached);
+		assert(rp->cached);
 		if(!rp->db && ((long)(rp->expire - now) <= 0
 		|| (long)(now - (rp->expire - rp->ttl)) > dnvars.oldest))
 			rrdelhead(l); /* rp == *l before; *l == rp->next after */
@@ -585,13 +585,10 @@
 		l = &ht[i];
 		for(dp = *l; dp; dp = *l){
 			if(dp->mark == dnvars.mark){
-				assert(dp->magic == DNmagic);
 				assert(dp->rr == nil);
 				*l = dp->next;
 
-				free(dp->name);
 				memset(dp, 0, sizeof *dp); /* cause trouble */
-				dp->magic = ~DNmagic;
 				free(dp);
 
 				dnvars.names--;
@@ -735,10 +732,10 @@
 	DN *dp;
 	ulong ttl;
 
-	assert(new->magic == RRmagic && !new->cached);
+	assert(!new->cached);
 
 	dp = new->owner;
-	assert(dp != nil && dp->magic == DNmagic);
+	assert(dp != nil);
 	new->auth |= auth;
 	new->next = 0;
 
@@ -760,7 +757,7 @@
 	 */
 	l = &dp->rr;
 	for(rp = *l; rp; rp = *l){
-		assert(rp->magic == RRmagic && rp->cached);
+		assert(rp->cached);
 		if(rp->type == new->type)
 			break;
 		l = &rp->next;
@@ -776,7 +773,7 @@
 	 *  fields (e.g. multiple NS servers).
 	 */
 	while ((rp = *l) != nil){
-		assert(rp->magic == RRmagic && rp->cached);
+		assert(rp->cached);
 		if(rp->type != new->type)
 			break;
 
@@ -864,7 +861,6 @@
 	Null *null;
 	Txt *t, *nt, **l;
 
-	assert(rp->magic == RRmagic);
 	nrp = rralloc(rp->type);
 	switch(rp->type){
 	case Tsoa:
@@ -965,8 +961,6 @@
 {
 	RR *rp, *first, **last;
 
-	assert(dp->magic == DNmagic);
-
 	first = nil;
 	last = &first;
 	lock(&dnlock);
@@ -973,7 +967,7 @@
 
 	/* try for an authoritative db entry */
 	for(rp = dp->rr; rp; rp = rp->next){
-		assert(rp->magic == RRmagic && rp->cached);
+		assert(rp->cached);
 		if(rp->db)
 		if(rp->auth)
 		if(tsame(type, rp->type))
@@ -1742,15 +1736,14 @@
 char*
 estrdup(char *s)
 {
-	int size;
 	char *p;
+	int n;
 
-	size = strlen(s);
-	p = mallocz(size+1, 0);
+	n = strlen(s) + 1;
+	p = mallocz(n, 0);
 	if(p == nil)
 		abort();
-	memmove(p, s, size);
-	p[size] = 0;
+	memmove(p, s, n);
 	setmalloctag(p, getcallerpc(&s));
 	return p;
 }
@@ -1842,13 +1835,10 @@
 
 	while(*l)
 		l = &(*l)->next;
-	n = strlen(name);
-	s = malloc(sizeof(Server)+n+1);
-	if(s == nil)
-		return;
+	n = strlen(name) + 1;
+	s = emalloc(sizeof(*s) + n);
 	s->name = (char*)(s+1);
 	memmove(s->name, name, n);
-	s->name[n] = 0;
 	s->next = nil;
 	*l = s;
 }
@@ -1919,7 +1909,6 @@
 	RR *rp;
 
 	rp = emalloc(sizeof(*rp));
-	rp->magic = RRmagic;
 	rp->pc = getcallerpc(&type);
 	rp->type = type;
 	if (rp->type != type)
@@ -1971,7 +1960,7 @@
 {
 	Txt *t;
 
-	assert(rp->magic == RRmagic && !rp->cached);
+	assert(!rp->cached);
 
 	switch(rp->type){
 	case Tsoa:
@@ -2019,6 +2008,5 @@
 	}
 
 	memset(rp, 0, sizeof *rp);		/* cause trouble */
-	rp->magic = ~RRmagic;
 	free(rp);
 }
--- a/sys/src/cmd/ndb/dnresolve.c
+++ b/sys/src/cmd/ndb/dnresolve.c
@@ -196,7 +196,7 @@
 static void
 queryinit(Query *qp, DN *dp, int type, Request *req)
 {
-	assert(dp && dp->magic == DNmagic);
+	assert(dp != nil);
 
 	memset(qp, 0, sizeof *qp);
 	qp->udpfd = qp->tcpfd = qp->tcpctlfd = -1;
@@ -763,7 +763,6 @@
 	mark = 1UL<<type;
 	arp = nil;
 	for(rp = qp->nsrp; rp; rp = rp->next){
-		assert(rp->magic == RRmagic);
 		if(rp->marker & mark)
 			continue;
 		arp = rrlookup(rp->host, type, NOneg);
--- a/sys/src/cmd/ndb/dns.h
+++ b/sys/src/cmd/ndb/dns.h
@@ -139,9 +139,6 @@
 
 	RRnames=	8,	/* # of referenced names per RR */
 
-	RRmagic=	0xdeadbabe,
-	DNmagic=	0xa110a110,
-
 	/* parallelism: tune; was 32; allow lots */
 	Maxactive=	250,
 
@@ -188,13 +185,12 @@
 struct DN
 {
 	DN	*next;		/* hash collision list */
-	char	*name;		/* owner */
 	RR	*rr;		/* resource records off this name */
 	ulong	ordinal;
 	ushort	class;		/* RR class */
 	uchar	respcode;	/* response code */
 	uchar	mark;		/* for mark and sweep */
-	ulong	magic;
+	char	name[];		/* owner */
 };
 
 /*
@@ -254,7 +250,6 @@
 struct RR
 {
 	RR	*next;
-	ulong	magic;
 	DN	*owner;		/* domain that owns this resource record */
 	uintptr	pc;		/* for tracking memory allocation */
 	ulong	ttl;		/* time to live to be passed on */