Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 12 Apr 2008 16:33:03 GMT
From:      Aaron Meihm <alm@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 139907 for review
Message-ID:  <200804121633.m3CGX3LM082289@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=139907

Change 139907 by alm@alm_praetorian on 2008/04/12 16:32:26

	In most cases we will have a 1:1 relationship between source and
	destination components.  We reference count usage of the audit
	record to avoid an extra copy.  This may be built upon to avoid
	copies altogether.

Affected files ...

.. //depot/projects/trustedbsd/netauditd/netauditd.h#14 edit
.. //depot/projects/trustedbsd/netauditd/reader.c#4 edit

Differences ...

==== //depot/projects/trustedbsd/netauditd/netauditd.h#14 (text+ko) ====

@@ -37,6 +37,7 @@
 
 struct audit_record {
 	void			*ar_buf;
+	int			ar_count;
 	u_int32_t		ar_record_len;
 };
 

==== //depot/projects/trustedbsd/netauditd/reader.c#4 (text+ko) ====

@@ -212,9 +212,6 @@
 
 	for (i = 0; i < ac->ac_ndsts; i++)
 		reader_q_record_cmpnt(ar, ac->ac_dsts[i]);
-	/* Once we have copied the record to all this components consumers
-	 * we can discard it. */
-	free(ar->ar_buf);
 	free(ar);
 }
 
@@ -226,9 +223,20 @@
 	new = malloc(sizeof(struct au_queue_ent));
 	assert(new != NULL);
 	bzero(new, sizeof(struct au_queue_ent));
-	new->aq_record.ar_buf = malloc(ar->ar_record_len);
-	assert(new->aq_record.ar_buf != NULL);
-	bcopy(ar->ar_buf, new->aq_record.ar_buf, ar->ar_record_len);
+	/*
+	 * In most cases we will have a 1:1 relationship between source
+	 * and destination components.  We avoid an extra copy by reference
+	 * counting usage of this audit record.  This may be built on to
+	 * avoid copying altogether.
+	 */
+	if (ar->ar_count == 0)
+		new->aq_record.ar_buf = ar->ar_buf;
+	else {
+		new->aq_record.ar_buf = malloc(ar->ar_record_len);
+		assert(new->aq_record.ar_buf != NULL);
+		bcopy(ar->ar_buf, new->aq_record.ar_buf, ar->ar_record_len);
+	}
+	ar->ar_count++;
 	new->aq_record.ar_record_len = ar->ar_record_len;
 	new->aq_remain = ar->ar_record_len;
 	(void) pthread_mutex_lock(&ac->ac_q.qp_lock);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200804121633.m3CGX3LM082289>