Linux bluetooth development
 help / color / mirror / Atom feed
From: Mikel Astiz <mikel.astiz.oss@gmail.com>
To: linux-bluetooth@vger.kernel.org
Cc: Mikel Astiz <mikel.astiz@bmw-carit.de>
Subject: [PATCH v1 2/6] media: Remove internal transport locks
Date: Wed,  5 Dec 2012 17:15:30 +0100	[thread overview]
Message-ID: <1354724134-7354-3-git-send-email-mikel.astiz.oss@gmail.com> (raw)
In-Reply-To: <1354724134-7354-1-git-send-email-mikel.astiz.oss@gmail.com>

From: Mikel Astiz <mikel.astiz@bmw-carit.de>

The internal transport_lock_t is not needed any more since transports
are now always acquired with read and write permissions.
---
 profiles/audio/transport.c | 130 ++++++++++-----------------------------------
 1 file changed, 28 insertions(+), 102 deletions(-)

diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index a76481c..4bb54f6 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -51,11 +51,6 @@
 #define MEDIA_TRANSPORT_INTERFACE "org.bluez.MediaTransport"
 
 typedef enum {
-	TRANSPORT_LOCK_READ = 1,
-	TRANSPORT_LOCK_WRITE = 1 << 1,
-} transport_lock_t;
-
-typedef enum {
 	TRANSPORT_STATE_IDLE,		/* Not acquired and suspended */
 	TRANSPORT_STATE_PENDING,	/* Playing but not acquired */
 	TRANSPORT_STATE_REQUESTING,	/* Acquire in progress */
@@ -80,7 +75,6 @@ struct media_owner {
 	struct media_transport	*transport;
 	struct media_request	*pending;
 	char			*name;
-	transport_lock_t	lock;
 	guint			watch;
 };
 
@@ -100,7 +94,6 @@ struct media_transport {
 	int			fd;		/* Transport file descriptor */
 	uint16_t		imtu;		/* Transport input mtu */
 	uint16_t		omtu;		/* Transport output mtu */
-	transport_lock_t	lock;
 	transport_state_t	state;
 	guint			hs_watch;
 	guint			source_watch;
@@ -115,18 +108,6 @@ struct media_transport {
 	void			*data;
 };
 
-static const char *lock2str(transport_lock_t lock)
-{
-	if (lock == 0)
-		return "";
-	else if (lock == TRANSPORT_LOCK_READ)
-		return "r";
-	else if (lock == TRANSPORT_LOCK_WRITE)
-		return "w";
-	else
-		return "rw";
-}
-
 static const char *state2str(transport_state_t state)
 {
 	switch (state) {
@@ -229,20 +210,6 @@ static void media_request_reply(struct media_request *req, int err)
 	g_dbus_send_message(btd_get_dbus_connection(), reply);
 }
 
-static gboolean media_transport_release(struct media_transport *transport,
-							transport_lock_t lock)
-{
-	transport->lock &= ~lock;
-
-	if (lock & TRANSPORT_LOCK_READ)
-		DBG("Transport %s: read lock released", transport->path);
-
-	if (lock & TRANSPORT_LOCK_WRITE)
-		DBG("Transport %s: write lock released", transport->path);
-
-	return TRUE;
-}
-
 static void media_owner_remove(struct media_owner *owner)
 {
 	struct media_transport *transport = owner->transport;
@@ -279,8 +246,6 @@ static void media_transport_remove(struct media_transport *transport,
 {
 	DBG("Transport %s Owner %s", transport->path, owner->name);
 
-	media_transport_release(transport, owner->lock);
-
 	/* Reply if owner has a pending request */
 	if (owner->pending)
 		media_request_reply(owner->pending, EIO);
@@ -339,12 +304,6 @@ static void a2dp_resume_complete(struct avdtp *session,
 
 	media_transport_set_fd(transport, fd, imtu, omtu);
 
-	if ((owner->lock & TRANSPORT_LOCK_READ) == 0)
-		imtu = 0;
-
-	if ((owner->lock & TRANSPORT_LOCK_WRITE) == 0)
-		omtu = 0;
-
 	ret = g_dbus_send_reply(btd_get_dbus_connection(), req->msg,
 						DBUS_TYPE_UNIX_FD, &fd,
 						DBUS_TYPE_UINT16, &imtu,
@@ -443,24 +402,6 @@ static void media_owner_exit(DBusConnection *connection, void *user_data)
 	media_transport_remove(owner->transport, owner);
 }
 
-static gboolean media_transport_acquire(struct media_transport *transport,
-							transport_lock_t lock)
-{
-	if (transport->lock & lock)
-		return FALSE;
-
-	transport->lock |= lock;
-
-	if (lock & TRANSPORT_LOCK_READ)
-		DBG("Transport %s: read lock acquired", transport->path);
-
-	if (lock & TRANSPORT_LOCK_WRITE)
-		DBG("Transport %s: write lock acquired", transport->path);
-
-
-	return TRUE;
-}
-
 static void media_transport_add(struct media_transport *transport,
 					struct media_owner *owner)
 {
@@ -473,17 +414,14 @@ static void media_transport_add(struct media_transport *transport,
 							owner, NULL);
 }
 
-static struct media_owner *media_owner_create(DBusMessage *msg,
-						transport_lock_t lock)
+static struct media_owner *media_owner_create(DBusMessage *msg)
 {
 	struct media_owner *owner;
 
 	owner = g_new0(struct media_owner, 1);
 	owner->name = g_strdup(dbus_message_get_sender(msg));
-	owner->lock = lock;
 
-	DBG("Owner created: sender=%s accesstype=%s", owner->name,
-							lock2str(lock));
+	DBG("Owner created: sender=%s", owner->name);
 
 	return owner;
 }
@@ -521,7 +459,6 @@ static DBusMessage *acquire(DBusConnection *conn, DBusMessage *msg,
 	struct media_request *req;
 	const char *sender;
 	guint id;
-	transport_lock_t lock = TRANSPORT_LOCK_READ | TRANSPORT_LOCK_WRITE;
 
 	sender = dbus_message_get_sender(msg);
 
@@ -529,13 +466,12 @@ static DBusMessage *acquire(DBusConnection *conn, DBusMessage *msg,
 	if (owner != NULL)
 		return btd_error_not_authorized(msg);
 
-	if (media_transport_acquire(transport, lock) == FALSE)
+	if (transport->state >= TRANSPORT_STATE_REQUESTING)
 		return btd_error_not_authorized(msg);
 
-	owner = media_owner_create(msg, lock);
+	owner = media_owner_create(msg);
 	id = transport->resume(transport, owner);
 	if (id == 0) {
-		media_transport_release(transport, lock);
 		media_owner_free(owner);
 		return btd_error_not_authorized(msg);
 	}
@@ -554,7 +490,7 @@ static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,
 	struct media_owner *owner;
 	const char *sender;
 	struct media_request *req;
-	transport_lock_t lock = TRANSPORT_LOCK_READ | TRANSPORT_LOCK_WRITE;
+	guint id;
 
 	sender = dbus_message_get_sender(msg);
 
@@ -562,45 +498,35 @@ static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,
 	if (owner == NULL)
 		return btd_error_not_authorized(msg);
 
-	if (owner->lock == lock) {
-		guint id;
-
-		/* Not the last owner, no need to suspend */
-		if (g_slist_length(transport->owners) != 1) {
-			media_transport_remove(transport, owner);
-			return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-		}
-
-		if (owner->pending) {
-			const char *member;
+	/* Not the last owner, no need to suspend */
+	if (g_slist_length(transport->owners) != 1) {
+		media_transport_remove(transport, owner);
+		return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+	}
 
-			member = dbus_message_get_member(owner->pending->msg);
-			/* Cancel Acquire request if that exist */
-			if (g_str_equal(member, "Acquire"))
-				media_owner_remove(owner);
-			else
-				return btd_error_in_progress(msg);
-		}
+	if (owner->pending) {
+		const char *member;
 
-		transport_set_state(transport, TRANSPORT_STATE_SUSPENDING);
+		member = dbus_message_get_member(owner->pending->msg);
+		/* Cancel Acquire request if that exist */
+		if (g_str_equal(member, "Acquire"))
+			media_owner_remove(owner);
+		else
+			return btd_error_in_progress(msg);
+	}
 
-		id = transport->suspend(transport, owner);
-		if (id == 0) {
-			media_transport_remove(transport, owner);
-			return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-		}
+	transport_set_state(transport, TRANSPORT_STATE_SUSPENDING);
 
-		req = media_request_create(msg, id);
-		media_owner_add(owner, req);
+	id = transport->suspend(transport, owner);
+	if (id == 0) {
+		media_transport_remove(transport, owner);
+		return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+	}
 
-		return NULL;
-	} else if ((owner->lock & lock) == lock) {
-		media_transport_release(transport, lock);
-		owner->lock &= ~lock;
-	} else
-		return btd_error_not_authorized(msg);
+	req = media_request_create(msg, id);
+	media_owner_add(owner, req);
 
-	return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+	return NULL;
 }
 
 static gboolean get_device(const GDBusPropertyTable *property,
-- 
1.7.11.7


  parent reply	other threads:[~2012-12-05 16:15 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-05 16:15 [PATCH v1 0/6] Remove access rights from MediaTransport Mikel Astiz
2012-12-05 16:15 ` [PATCH v1 1/6] media: Remove transport access type from D-Bus API Mikel Astiz
2012-12-05 16:15 ` Mikel Astiz [this message]
2012-12-05 16:15 ` [PATCH v1 3/6] media: Remove transport owner list Mikel Astiz
2012-12-05 16:15 ` [PATCH v1 4/6] media: Add MediaTransport.TryAcquire() Mikel Astiz
2012-12-05 16:15 ` [PATCH v1 5/6] media: Trivial style fix Mikel Astiz
2012-12-05 16:15 ` [PATCH v1 6/6] media: Add version suffix to all media interfaces Mikel Astiz
2012-12-05 17:25 ` [PATCH v1 0/6] Remove access rights from MediaTransport Johan Hedberg

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=1354724134-7354-3-git-send-email-mikel.astiz.oss@gmail.com \
    --to=mikel.astiz.oss@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=mikel.astiz@bmw-carit.de \
    /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