public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
From: Denis KENZIOR <denis.kenzior@trolltech.com>
To: BlueZ development <bluez-devel@lists.sourceforge.net>
Subject: Re: [Bluez-devel] Proposed DTD
Date: Mon, 13 Nov 2006 11:14:43 +1000	[thread overview]
Message-ID: <200611131114.43541.denis.kenzior@trolltech.com> (raw)
In-Reply-To: <e1effdeb0611101338v1902b247if13f2239622f1a3a@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1001 bytes --]

Claudio,

> >
> > Hi Denis,
> >
> > the patch is in cvs now!
> >
> > The sdp-xml.* were moved to common directory.
> >
> > Some points to be improved:
> > 1. append_and_grow_string: avoid a lot of strlen calls and string copy
> > 2. Analyze if it is possible use sdp_buf_t instead of string_t
> > 3. I got some system bus disconnection messages when calling
> > GetRemoteServiceRecordAsXML consecutively. We need fix this bug.
> >
> > BR,
> > Claudio.
> > --
>
> Hi Marcel, Denis,
>
> this patch replaces string_t by sdp_buf_t and fix system bus
> disconnection problem. Check if this patch make sense or if it is
> better keep  string_t.

I agree we should replace string_t by sdp_buf_t since this avoids an extra 
strlen.  However, I think that the buffer should be grown by factors.  Your  
proposed solution would call realloc many times, as the append function is 
called quite frequently with small strings, but this is no biggie.

Would the attached patch be better?

>
> BR,
> Claudio

-Denis

[-- Attachment #2: remove_string_t_2.patch --]
[-- Type: text/x-diff, Size: 3329 bytes --]

Index: dbus-sdp.c
===================================================================
RCS file: /cvsroot/bluez/utils/hcid/dbus-sdp.c,v
retrieving revision 1.55
diff -u -5 -r1.55 dbus-sdp.c
--- dbus-sdp.c	10 Nov 2006 17:59:15 -0000	1.55
+++ dbus-sdp.c	13 Nov 2006 00:54:20 -0000
@@ -56,11 +56,11 @@
 #include "dbus-error.h"
 #include "dbus-sdp.h"
 #include "sdp-xml.h"
 
 #define MAX_IDENTIFIER_LEN	29	/* "XX:XX:XX:XX:XX:XX/0xYYYYYYYY\0" */
-#define DEFAULT_XML_BUFFER_SIZE 1024
+#define DEFAULT_XML_BUF_SIZE	1024
 
 struct service_provider {
 	char *owner;	/* null for remote services or unique name if local */
 	char *prov;	/* remote Bluetooth address that provides the service */
 	struct slist *lrec;
@@ -98,35 +98,37 @@
 	char            *name;
 	uint16_t        class;
 	char            *info_name;
 } sdp_service_t;
 
-typedef struct {
-	int size;
-	char *str;
-} string_t;
-
 static void append_and_grow_string(void *data, const char *str)
 {
-	string_t *string = (string_t *)data;
-	char *newbuf;
+	sdp_buf_t *buff = (sdp_buf_t *) data;
+	int len;
 
-	int oldlen = strlen(string->str);
-	int newlen = strlen(str);
-	
-	if ((oldlen + newlen + 1) > string->size) {
-		newbuf = (char *) malloc(string->size * 2);
-		if (!newbuf)
+	len = strlen(str);
+
+	if (!buff->data) {
+		buff->buf_size = DEFAULT_XML_BUF_SIZE;
+		buff->data = realloc(buff->data, buff->buf_size);
+		if (!buff->data)
 			return;
+	}
+
+	/* Grow string */
+	while (buff->buf_size < (buff->data_size + len + 1)) {
+		/* Grow buffer by a factor of 2 */
+		buff->buf_size = (buff->buf_size << 1);
 
-		memcpy(newbuf, string->str, oldlen+1);
-		string->size *= 2;
-		free(string->str);
-		string->str = newbuf;		
+		buff->data = realloc(buff->data, buff->buf_size);
+		if (!buff->data)
+			return;
 	}
 
-	strcat(string->str, str);
+	/* Include the NULL character */
+	memcpy(buff->data + buff->data_size, str, len + 1);
+	buff->data_size += len;
 }
 
 /* FIXME:  move to a common file */
 sdp_service_t sdp_service[] = {
 	{ "vcp",	VIDEO_CONF_SVCLASS_ID,		"Video Conference"	},
@@ -646,12 +648,12 @@
 	struct transaction_context *ctxt = udata;
 	sdp_record_t *rec = NULL;
 	DBusMessage *reply;
 	const char *dst;
 	int scanned;
-	string_t result;
-	
+	sdp_buf_t result;
+
 	if (!ctxt)
 		return;
 
 	if (err == 0xffff) {
 		/* Check for protocol error or I/O error */
@@ -683,32 +685,32 @@
 			DBUS_TYPE_STRING, &dst,
 			DBUS_TYPE_INVALID);
 
 	reply = dbus_message_new_method_return(ctxt->rq);
 
-	result.str = 0;
 	
 	rec = sdp_extract_pdu(rsp, &scanned);
 	if (rec == NULL) {
 		error("SVC REC is null");
 		goto done;
 	}
 
-	result.str = malloc(sizeof(char) * DEFAULT_XML_BUFFER_SIZE);
-	result.size = DEFAULT_XML_BUFFER_SIZE;
-	
+	memset(&result, 0, sizeof(sdp_buf_t));
+
 	sdp_cache_append(NULL, dst, rec);
 
 	convert_sdp_record_to_xml(rec, &result, append_and_grow_string);
 
-	dbus_message_append_args(reply,
-		DBUS_TYPE_STRING, &result.str,
-		DBUS_TYPE_INVALID);
+	if (result.data) {
+		dbus_message_append_args(reply,
+				DBUS_TYPE_STRING, &result.data,
+				DBUS_TYPE_INVALID);
 
+		free(result.data);
+	}
 done:
 	send_message_and_unref(ctxt->conn, reply);
-	free(result.str);
 failed:
 	transaction_context_free(ctxt);
 }
 
 static void remote_svc_handles_completed_cb(uint8_t type, uint16_t err, uint8_t *rsp, size_t size, void *udata)

[-- Attachment #3: Type: text/plain, Size: 373 bytes --]

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642

[-- Attachment #4: Type: text/plain, Size: 164 bytes --]

_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

  reply	other threads:[~2006-11-13  1:14 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-23  0:25 [Bluez-devel] Proposed DTD Denis KENZIOR
2006-10-23  3:13 ` Marcel Holtmann
2006-10-23  3:59   ` Denis KENZIOR
2006-10-23  4:11     ` Marcel Holtmann
2006-10-23  4:31       ` Denis KENZIOR
2006-10-23  7:27         ` Marcel Holtmann
2006-10-24  5:47           ` Denis KENZIOR
2006-10-24  8:13             ` Marcel Holtmann
2006-10-24  6:47               ` Denis KENZIOR
2006-10-24  9:16                 ` Marcel Holtmann
2006-10-24  8:09                   ` Denis KENZIOR
2006-10-24 10:17                     ` Marcel Holtmann
2006-10-30 13:27                 ` Marcel Holtmann
2006-11-09  1:49                   ` Denis KENZIOR
2006-11-10 18:09                     ` Claudio Takahasi
2006-11-10 21:38                       ` Claudio Takahasi
2006-11-13  1:14                         ` Denis KENZIOR [this message]
2006-11-13  6:21                           ` Marcel Holtmann
2006-11-13  6:37                     ` Marcel Holtmann
2006-11-13  7:03                       ` Denis KENZIOR
2006-11-13  7:17                         ` Marcel Holtmann
2006-10-24  7:08               ` Denis KENZIOR
2006-10-24  9:13                 ` Marcel Holtmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200611131114.43541.denis.kenzior@trolltech.com \
    --to=denis.kenzior@trolltech.com \
    --cc=bluez-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox