From 24ced5a6f682f147f6a647d60c96f7528a8a2378 Mon Sep 17 00:00:00 2001
From: Matthias Ringwald <matthias@ringwald.ch>
Date: Thu, 24 Mar 2016 22:12:50 +0100
Subject: [PATCH] runloop: enable callback for all data sources

---
 platform/daemon/src/socket_connection.c       | 22 ++++++++++++-------
 .../hci_transport_h4_ehcill_embedded.c        |  1 +
 platform/embedded/hci_transport_h4_embedded.c |  1 +
 platform/posix/hci_transport_h4_posix.c       |  1 +
 platform/posix/hci_transport_h5_posix.c       | 11 +++++-----
 platform/posix/stdin_support.c                |  3 ++-
 platform/posix/stdin_support.h                |  2 +-
 port/ios/src/btstack_control_iphone.m         |  1 +
 port/ios/src/hci_transport_h4_iphone.c        |  1 +
 port/libusb/hci_transport_h2_libusb.c         |  1 +
 port/mtk/hci_transport_h4_mtk.c               |  1 +
 port/nrf5x/main.c                             |  1 +
 src/btstack_run_loop.c                        |  4 ++--
 src/btstack_run_loop.h                        |  4 ++--
 14 files changed, 35 insertions(+), 19 deletions(-)

diff --git a/platform/daemon/src/socket_connection.c b/platform/daemon/src/socket_connection.c
index 346ed6fc3..b8d35b7e6 100644
--- a/platform/daemon/src/socket_connection.c
+++ b/platform/daemon/src/socket_connection.c
@@ -172,6 +172,7 @@ connection_t * socket_connection_register_new_connection(int fd){
 
     btstack_run_loop_set_data_source_handler(&conn->ds, &socket_connection_hci_process);
     btstack_run_loop_set_data_source_fd(&conn->ds, fd);
+    btstack_run_loop_enable_data_source_callbacks(&conn->ds, DATA_SOURCE_CALLBACK_READ);
     
     // prepare state machine and
     socket_connection_init_statemachine(conn);
@@ -311,10 +312,10 @@ int socket_connection_create_tcp(int port){
     btstack_data_source_t *ds = malloc( sizeof(btstack_data_source_t));
     if (ds == NULL) return -1;
     memset(ds, 0, sizeof(btstack_data_source_t));
-    btstack_run_loop_set_data_source_handler(ds, &socket_connection_accept);
     
 	// create tcp socket
-	if ((ds->fd = socket (PF_INET, SOCK_STREAM, 0)) < 0) {
+    int fd = socket (PF_INET, SOCK_STREAM, 0);
+	if (fd < 0) {
 		log_error("Error creating socket ...(%s)", strerror(errno));
 		free(ds);
         return -1;
@@ -328,20 +329,23 @@ int socket_connection_create_tcp(int port){
 	memset (&addr.sin_addr, 0, sizeof (addr.sin_addr));
 	
 	const int y = 1;
-	setsockopt(ds->fd, SOL_SOCKET, SO_REUSEADDR, (void*) &y, sizeof(int));
+	setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*) &y, sizeof(int));
 	
-	if (bind ( ds->fd, (struct sockaddr *) &addr, sizeof (addr) ) ) {
+	if (bind ( fd, (struct sockaddr *) &addr, sizeof (addr) ) ) {
 		log_error("Error on bind() ...(%s)", strerror(errno));
 		free(ds);
         return -1;
 	}
 	
-	if (listen (ds->fd, MAX_PENDING_CONNECTIONS)) {
+	if (listen (fd, MAX_PENDING_CONNECTIONS)) {
 		log_error("Error on listen() ...(%s)", strerror(errno));
 		free(ds);
         return -1;
 	}
     
+    btstack_run_loop_set_data_source_fd(ds, fd);
+    btstack_run_loop_set_data_source_handler(ds, &socket_connection_accept);
+    btstack_run_loop_enable_data_source_callbacks(ds, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(ds);
     
 	log_info ("Server up and running ...");
@@ -366,8 +370,9 @@ void socket_connection_launchd_register_fd_array(launch_data_t listening_fd_arra
         btstack_data_source_t *ds = malloc( sizeof(btstack_data_source_t));
         if (ds == NULL) return;
         memset(ds, 0, sizeof(btstack_data_source_t));
-        btstack_run_loop_set_data_source_handler(ds, &socket_connection_accept);
         btstack_run_loop_set_data_source_fd(ds, listening_fd);
+        btstack_run_loop_set_data_source_handler(ds, &socket_connection_accept);
+        btstack_run_loop_enable_data_source_callbacks(ds, DATA_SOURCE_CALLBACK_READ);
         btstack_run_loop_add_data_source(ds);
 	}
 }
@@ -453,7 +458,6 @@ int socket_connection_create_unix(char *path){
     btstack_data_source_t *ds = malloc( sizeof(btstack_data_source_t));
     if (ds == NULL) return -1;
     memset(ds, 0, sizeof(btstack_data_source_t));
-    btstack_run_loop_set_data_source_handler(ds, &socket_connection_accept);
 
 	// create unix socket
     int fd = socket (AF_UNIX, SOCK_STREAM, 0);
@@ -462,7 +466,6 @@ int socket_connection_create_unix(char *path){
 		free(ds);
         return -1;
 	}
-    btstack_run_loop_set_data_source_fd(ds, fd);
 	log_info ("Socket created at %s", path);
 	
     struct sockaddr_un addr;
@@ -491,6 +494,9 @@ int socket_connection_create_unix(char *path){
         return -1;
 	}
     
+    btstack_run_loop_set_data_source_fd(ds, fd);
+    btstack_run_loop_set_data_source_handler(ds, &socket_connection_accept);
+    btstack_run_loop_enable_data_source_callbacks(ds, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(ds);
 
 	log_info ("Server up and running ...");
diff --git a/platform/embedded/hci_transport_h4_ehcill_embedded.c b/platform/embedded/hci_transport_h4_ehcill_embedded.c
index 832a97ad5..20190c465 100644
--- a/platform/embedded/hci_transport_h4_ehcill_embedded.c
+++ b/platform/embedded/hci_transport_h4_ehcill_embedded.c
@@ -192,6 +192,7 @@ static int h4_open(void){
     
 	// set up data_source
     btstack_run_loop_set_data_source_handler(&hci_transport_h4_dma_ds, &h4_process);
+    btstack_run_loop_enable_data_source_callbacks(&hci_transport_h4_dma_ds, DATA_SOURCE_CALLBACK_POLL);
     btstack_run_loop_add_data_source(&hci_transport_h4_dma_ds);
     
     // init state machines
diff --git a/platform/embedded/hci_transport_h4_embedded.c b/platform/embedded/hci_transport_h4_embedded.c
index 28fe3a3a3..103ac0c58 100644
--- a/platform/embedded/hci_transport_h4_embedded.c
+++ b/platform/embedded/hci_transport_h4_embedded.c
@@ -144,6 +144,7 @@ static int h4_open(void){
     
 	// set up data_source
     btstack_run_loop_set_data_source_handler(&hci_transport_h4_dma_ds, &h4_process);
+    btstack_run_loop_enable_data_source_callbacks(&hci_transport_h4_dma_ds, DATA_SOURCE_CALLBACK_POLL);
     btstack_run_loop_add_data_source(&hci_transport_h4_dma_ds);
     
     //
diff --git a/platform/posix/hci_transport_h4_posix.c b/platform/posix/hci_transport_h4_posix.c
index fee656e33..d44c61cd2 100644
--- a/platform/posix/hci_transport_h4_posix.c
+++ b/platform/posix/hci_transport_h4_posix.c
@@ -214,6 +214,7 @@ static int h4_open(void){
     hci_transport_h4->uart_fd = fd;
     btstack_run_loop_set_data_source_fd(hci_transport_h4->ds, fd);
     btstack_run_loop_set_data_source_handler(hci_transport_h4->ds, &h4_process);
+    btstack_run_loop_enable_data_source_callbacks(hci_transport_h4->ds, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(hci_transport_h4->ds);
     
     // also set baudrate
diff --git a/platform/posix/hci_transport_h5_posix.c b/platform/posix/hci_transport_h5_posix.c
index 9d33b0021..184763361 100644
--- a/platform/posix/hci_transport_h5_posix.c
+++ b/platform/posix/hci_transport_h5_posix.c
@@ -610,8 +610,9 @@ static int hci_transport_h5_open(void){
     }
     
     // set up data_source
-    hci_transport_h5_data_source.fd = fd;
-    hci_transport_h5_data_source.process = &hci_transport_h5_process;
+    btstack_run_loop_set_data_source_fd(&hci_transport_h5_data_source, fd);
+    btstack_run_loop_set_data_source_handler(&hci_transport_h5_data_source, &hci_transport_h5_process);
+    btstack_run_loop_enable_data_source_callbacks(&hci_transport_h5_data_source, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(&hci_transport_h5_data_source);
     
     // also set baudrate
@@ -652,8 +653,8 @@ static int hci_transport_h5_close(void){
     return 0;
 }
 
-static int hci_transport_h5_process(btstack_data_source_t *ds) {
-    if (hci_transport_h5_data_source.fd < 0) return -1;
+static void hci_transport_h5_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type) {
+    if (hci_transport_h5_data_source.fd < 0) return;
 
     // process data byte by byte
     uint8_t data;
@@ -668,8 +669,8 @@ static int hci_transport_h5_process(btstack_data_source_t *ds) {
             hci_transport_slip_init();
         }
     };
-    return 0;
 }
+
 // get h5 singleton
 const hci_transport_t * hci_transport_h5_instance() {
     if (hci_transport_h5 == NULL) {
diff --git a/platform/posix/stdin_support.c b/platform/posix/stdin_support.c
index 96e940b30..f6ce1f034 100644
--- a/platform/posix/stdin_support.c
+++ b/platform/posix/stdin_support.c
@@ -49,7 +49,7 @@
 static btstack_data_source_t stdin_source;
 static int activated = 0;
 
-void btstack_stdin_setup(int (*stdin_process)(btstack_data_source_t *_ds)){
+void btstack_stdin_setup(void (*stdin_process)(btstack_data_source_t *_ds, btstack_data_source_callback_type_t callback_type)){
 
 #ifndef _WIN32
     struct termios term = {0};
@@ -64,6 +64,7 @@ void btstack_stdin_setup(int (*stdin_process)(btstack_data_source_t *_ds)){
 
     btstack_run_loop_set_data_source_fd(&stdin_source, 0); // stdin
     btstack_run_loop_set_data_source_handler(&stdin_source, stdin_process);
+    btstack_run_loop_enable_data_source_callbacks(&stdin_source, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(&stdin_source);
 
     activated = 1;
diff --git a/platform/posix/stdin_support.h b/platform/posix/stdin_support.h
index fcd6b5f56..ce6fdc70f 100644
--- a/platform/posix/stdin_support.h
+++ b/platform/posix/stdin_support.h
@@ -45,7 +45,7 @@ extern "C" {
 #endif
 
 // setup handler for command line interface
-void btstack_stdin_setup(int (*stdin_handler)(btstack_data_source_t *_ds));
+void btstack_stdin_setup(void (*stdin_handler)(btstack_data_source_t *_ds, btstack_data_source_callback_type_t callback_type));
 
 // gets called by main.c
 void btstack_stdin_reset(void);
diff --git a/port/ios/src/btstack_control_iphone.m b/port/ios/src/btstack_control_iphone.m
index 66ddaee68..0f03c86f4 100644
--- a/port/ios/src/btstack_control_iphone.m
+++ b/port/ios/src/btstack_control_iphone.m
@@ -746,6 +746,7 @@ void iphone_register_for_power_notifications(void (*cb)(POWER_NOTIFICATION_t eve
     // set up data source handler
     btstack_run_loop_set_data_source_fd(&power_notification_ds, power_notification_pipe_fds[0]); // stdin
     btstack_run_loop_set_data_source_handler(&power_notification_ds, &power_notification_process);
+    btstack_run_loop_enable_data_source_callbacks(&power_notification_ds, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(&power_notification_ds);  
 }
 
diff --git a/port/ios/src/hci_transport_h4_iphone.c b/port/ios/src/hci_transport_h4_iphone.c
index 62ae8867e..3008d342e 100644
--- a/port/ios/src/hci_transport_h4_iphone.c
+++ b/port/ios/src/hci_transport_h4_iphone.c
@@ -227,6 +227,7 @@ static int h4_open(void)
     memset(hci_transport_h4->ds, 0, sizeof(btstack_data_source_t));
     btstack_run_loop_set_data_source_fd(hci_transport_h4->ds, fd);
     btstack_run_loop_set_data_source_handler(hci_transport_h4->ds, &h4_process);
+    btstack_run_loop_enable_data_source_callbacks(hci_transport_h4->ds, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(hci_transport_h4->ds);
     
     // init state machine
diff --git a/port/libusb/hci_transport_h2_libusb.c b/port/libusb/hci_transport_h2_libusb.c
index 043c5a077..6b744358e 100644
--- a/port/libusb/hci_transport_h2_libusb.c
+++ b/port/libusb/hci_transport_h2_libusb.c
@@ -844,6 +844,7 @@ static int usb_open(void){
             btstack_data_source_t *ds = &pollfd_data_sources[r];
             btstack_run_loop_set_data_source_fd(ds, pollfd[r]->fd);
             btstack_run_loop_set_data_source_handler(ds, &usb_process_ds);
+            btstack_run_loop_enable_data_source_callbacks(ds, DATA_SOURCE_CALLBACK_READ);
             btstack_run_loop_add_data_source(ds);
             log_info("%u: %p fd: %u, events %x", r, pollfd[r], pollfd[r]->fd, pollfd[r]->events);
         }
diff --git a/port/mtk/hci_transport_h4_mtk.c b/port/mtk/hci_transport_h4_mtk.c
index 7c8cd73ad..d30e93b7e 100644
--- a/port/mtk/hci_transport_h4_mtk.c
+++ b/port/mtk/hci_transport_h4_mtk.c
@@ -87,6 +87,7 @@ static int h4_open(void){
     memset(hci_transport_h4->ds, 0, sizeof(btstack_data_source_t));
     btstack_run_loop_set_data_source_fd(hci_transport_h4->ds, fd);
     btstack_run_loop_set_data_source_handler(hci_transport_h4->ds, &h4_process);
+    btstack_run_loop_enable_data_source_callbacks(hci_transport_h4->ds, DATA_SOURCE_CALLBACK_READ);
     btstack_run_loop_add_data_source(hci_transport_h4->ds);
     return 0;
 }
diff --git a/port/nrf5x/main.c b/port/nrf5x/main.c
index 2245ebffc..edb270ead 100755
--- a/port/nrf5x/main.c
+++ b/port/nrf5x/main.c
@@ -392,6 +392,7 @@ void transport_init(const void *transport_config){
  */
 static int transport_open(void){
     btstack_run_loop_set_data_source_handler(&hci_transport_data_source, &transport_run);
+    btstack_run_loop_enable_data_source_callbacks(&hci_transport_data_source, DATA_SOURCE_CALLBACK_POLL);
     btstack_run_loop_add_data_source(&hci_transport_data_source);
     return 0;
 }
diff --git a/src/btstack_run_loop.c b/src/btstack_run_loop.c
index 6b854f202..c65bfc56c 100644
--- a/src/btstack_run_loop.c
+++ b/src/btstack_run_loop.c
@@ -79,10 +79,10 @@ int btstack_run_loop_get_data_source_fd(btstack_data_source_t *ds){
     return ds->fd;
 }
 
-void btstack_run_loop_enable_data_source_callback(btstack_data_source_t *data_source, uint16_t callbacks){
+void btstack_run_loop_enable_data_source_callbacks(btstack_data_source_t *data_source, uint16_t callbacks){
 }
 
-void btstack_run_loop_disable_data_source_callback(btstack_data_source_t *data_source, uint16_t callbacks){
+void btstack_run_loop_disable_data_source_callbacks(btstack_data_source_t *data_source, uint16_t callbacks){
 }
 
 /**
diff --git a/src/btstack_run_loop.h b/src/btstack_run_loop.h
index c9850a43e..4f7b4dad7 100644
--- a/src/btstack_run_loop.h
+++ b/src/btstack_run_loop.h
@@ -175,14 +175,14 @@ int btstack_run_loop_get_data_source_fd(btstack_data_source_t * data_source);
  * @param data_source to remove
  * @param callback types to enable
  */
-void btstack_run_loop_enable_data_source_callback(btstack_data_source_t * data_source, uint16_t callbacks);
+void btstack_run_loop_enable_data_source_callbacks(btstack_data_source_t * data_source, uint16_t callbacks);
 
 /**
  * @brief Enable callbacks for a data source
  * @param data_source to remove
  * @param callback types to disable
  */
-void btstack_run_loop_disable_data_source_callback(btstack_data_source_t * data_source, uint16_t callbacks);
+void btstack_run_loop_disable_data_source_callbacks(btstack_data_source_t * data_source, uint16_t callbacks);
 
 /**
  * @brief Add data source to run loop