summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZach Johnson <zachoverflow@google.com>2014-08-04 20:47:52 -0700
committerAndre Eisenbach <eisenbach@google.com>2015-03-16 16:51:28 -0700
commited7095be083ffe47f8b9d0d3090b0f2e109b8125 (patch)
treeb5399a6501666548eb9d47e1d42bc9a78afa41ce
parent3605c802486424c2fe22b3474c941f224cd56419 (diff)
downloadandroid_system_bt-ed7095be083ffe47f8b9d0d3090b0f2e109b8125.tar.gz
android_system_bt-ed7095be083ffe47f8b9d0d3090b0f2e109b8125.tar.bz2
android_system_bt-ed7095be083ffe47f8b9d0d3090b0f2e109b8125.zip
Fix socket to use safe reactor registration
-rw-r--r--hci/src/hci_inject.c4
-rw-r--r--osi/include/socket.h10
-rw-r--r--osi/src/socket.c13
3 files changed, 15 insertions, 12 deletions
diff --git a/hci/src/hci_inject.c b/hci/src/hci_inject.c
index b45a38cb7..78c1cc1a7 100644
--- a/hci/src/hci_inject.c
+++ b/hci/src/hci_inject.c
@@ -77,7 +77,7 @@ bool hci_inject_open(void) {
if (!socket_listen(listen_socket, LISTEN_PORT))
goto error;
- socket_register(listen_socket, thread_get_reactor(thread), accept_ready, NULL, NULL);
+ socket_register(listen_socket, thread, accept_ready, NULL, NULL);
return true;
error:;
@@ -132,7 +132,7 @@ static void accept_ready(socket_t *socket, UNUSED_ATTR void *context) {
return;
}
- socket_register(socket, thread_get_reactor(thread), read_ready, NULL, client);
+ socket_register(socket, thread, read_ready, NULL, client);
}
static void read_ready(UNUSED_ATTR socket_t *socket, void *context) {
diff --git a/osi/include/socket.h b/osi/include/socket.h
index ba3629156..e9ec8245c 100644
--- a/osi/include/socket.h
+++ b/osi/include/socket.h
@@ -21,6 +21,8 @@
#include <stddef.h>
#include <stdint.h>
+#include "thread.h"
+
typedef struct reactor_t reactor_t;
typedef struct socket_t socket_t;
typedef uint16_t port_t;
@@ -66,13 +68,13 @@ ssize_t socket_read(const socket_t *socket, void *buf, size_t count);
// may be NULL.
ssize_t socket_write(const socket_t *socket, const void *buf, size_t count);
-// Registers |socket| with the |reactor|. When the socket becomes readable, |read_cb|
+// Registers |socket| with the |thread|. When the socket becomes readable, |read_cb|
// will be called. When the socket becomes writeable, |write_cb| will be called. The
// |context| parameter is passed, untouched, to each of the callback routines. Neither
-// |socket| nor |reactor| may be NULL. |read_cb| or |write_cb|, but not both, may be NULL.
+// |socket| nor |thread| may be NULL. |read_cb| or |write_cb|, but not both, may be NULL.
// |context| may be NULL.
-void socket_register(socket_t *socket, reactor_t *reactor, socket_cb read_cb, socket_cb write_cb, void *context);
+void socket_register(socket_t *socket, thread_t *thread, socket_cb read_cb, socket_cb write_cb, void *context);
-// Unregisters |socket| from whichever reactor it is registered with, if any. This
+// Unregisters |socket| from whichever thread it is registered with, if any. This
// function is idempotent.
void socket_unregister(socket_t *socket);
diff --git a/osi/src/socket.c b/osi/src/socket.c
index 83f4a5a27..4e9a406b3 100644
--- a/osi/src/socket.c
+++ b/osi/src/socket.c
@@ -29,9 +29,10 @@
#include "reactor.h"
#include "socket.h"
+#include "thread.h"
struct socket_t {
- reactor_t *reactor;
+ thread_t *thread;
reactor_object_t socket_object;
socket_cb read_ready;
socket_cb write_ready;
@@ -132,7 +133,7 @@ ssize_t socket_write(const socket_t *socket, const void *buf, size_t count) {
return send(socket->socket_object.fd, buf, count, MSG_DONTWAIT);
}
-void socket_register(socket_t *socket, reactor_t *reactor, socket_cb read_cb, socket_cb write_cb, void *context) {
+void socket_register(socket_t *socket, thread_t *thread, socket_cb read_cb, socket_cb write_cb, void *context) {
assert(socket != NULL);
assert(reactor != NULL);
assert(read_cb || write_cb);
@@ -140,7 +141,7 @@ void socket_register(socket_t *socket, reactor_t *reactor, socket_cb read_cb, so
// Make sure the socket isn't currently registered.
socket_unregister(socket);
- socket->reactor = reactor;
+ socket->thread = thread;
socket->read_ready = read_cb;
socket->write_ready = write_cb;
socket->context = context;
@@ -155,14 +156,14 @@ void socket_register(socket_t *socket, reactor_t *reactor, socket_cb read_cb, so
else if (write_cb)
socket->socket_object.interest = REACTOR_INTEREST_WRITE;
- reactor_register(reactor, &socket->socket_object);
+ thread_register(thread, &socket->socket_object);
}
void socket_unregister(socket_t *socket) {
assert(socket != NULL);
- if (socket->reactor)
- reactor_unregister(socket->reactor, &socket->socket_object);
+ if (socket->thread)
+ thread_unregister(socket->thread, &socket->socket_object);
}
static void internal_read_ready(void *context) {