runloop: implement data source callbacks for posix - also support write ready

This commit is contained in:
Matthias Ringwald 2016-03-24 22:31:44 +01:00
parent b9f33ffe0c
commit 9120e843c2

View File

@ -120,11 +120,20 @@ static void btstack_run_loop_posix_dump_timer(void){
} }
} }
static void btstack_run_loop_posix_enable_data_source_callbacks(btstack_data_source_t * ds, uint16_t callback_types){
ds->flags |= callback_types;
}
static void btstack_run_loop_posix_disable_data_source_callbacks(btstack_data_source_t * ds, uint16_t callback_types){
ds->flags &= ~callback_types;
}
/** /**
* Execute run_loop * Execute run_loop
*/ */
static void btstack_run_loop_posix_execute(void) { static void btstack_run_loop_posix_execute(void) {
fd_set descriptors; fd_set descriptors_read;
fd_set descriptors_write;
btstack_timer_source_t *ts; btstack_timer_source_t *ts;
struct timeval current_tv; struct timeval current_tv;
@ -134,13 +143,21 @@ static void btstack_run_loop_posix_execute(void) {
while (1) { while (1) {
// collect FDs // collect FDs
FD_ZERO(&descriptors); FD_ZERO(&descriptors_read);
FD_ZERO(&descriptors_write);
int highest_fd = 0; int highest_fd = 0;
btstack_linked_list_iterator_init(&it, &data_sources); btstack_linked_list_iterator_init(&it, &data_sources);
while (btstack_linked_list_iterator_has_next(&it)){ while (btstack_linked_list_iterator_has_next(&it)){
btstack_data_source_t *ds = (btstack_data_source_t*) btstack_linked_list_iterator_next(&it); btstack_data_source_t *ds = (btstack_data_source_t*) btstack_linked_list_iterator_next(&it);
if (ds->fd >= 0) { if (ds->fd < 0) continue;
FD_SET(ds->fd, &descriptors); if (ds->flags & DATA_SOURCE_CALLBACK_READ){
FD_SET(ds->fd, &descriptors_read);
if (ds->fd > highest_fd) {
highest_fd = ds->fd;
}
}
if (ds->flags & DATA_SOURCE_CALLBACK_WRITE){
FD_SET(ds->fd, &descriptors_write);
if (ds->fd > highest_fd) { if (ds->fd > highest_fd) {
highest_fd = ds->fd; highest_fd = ds->fd;
} }
@ -167,7 +184,7 @@ static void btstack_run_loop_posix_execute(void) {
} }
// wait for ready FDs // wait for ready FDs
select( highest_fd+1 , &descriptors, NULL, NULL, timeout); select( highest_fd+1 , &descriptors_read, &descriptors_write, NULL, timeout);
// process data sources very carefully // process data sources very carefully
// bt_control.close() triggered from a client can remove a different data source // bt_control.close() triggered from a client can remove a different data source
@ -178,10 +195,14 @@ static void btstack_run_loop_posix_execute(void) {
while (btstack_linked_list_iterator_has_next(&it) && !data_sources_modified){ while (btstack_linked_list_iterator_has_next(&it) && !data_sources_modified){
btstack_data_source_t *ds = (btstack_data_source_t*) btstack_linked_list_iterator_next(&it); btstack_data_source_t *ds = (btstack_data_source_t*) btstack_linked_list_iterator_next(&it);
// log_info("btstack_run_loop_posix_execute: check %x with fd %u\n", (int) ds, ds->fd); // log_info("btstack_run_loop_posix_execute: check %x with fd %u\n", (int) ds, ds->fd);
if (FD_ISSET(ds->fd, &descriptors)) { if (FD_ISSET(ds->fd, &descriptors_read)) {
// log_info("btstack_run_loop_posix_execute: process %x with fd %u\n", (int) ds, ds->fd); // log_info("btstack_run_loop_posix_execute: process read %x with fd %u\n", (int) ds, ds->fd);
ds->process(ds, DATA_SOURCE_CALLBACK_READ); ds->process(ds, DATA_SOURCE_CALLBACK_READ);
} }
if (FD_ISSET(ds->fd, &descriptors_write)) {
// log_info("btstack_run_loop_posix_execute: process write %x with fd %u\n", (int) ds, ds->fd);
ds->process(ds, DATA_SOURCE_CALLBACK_WRITE);
}
} }
// log_info("btstack_run_loop_posix_execute: after ds check\n"); // log_info("btstack_run_loop_posix_execute: after ds check\n");
@ -267,8 +288,8 @@ static const btstack_run_loop_t btstack_run_loop_posix = {
&btstack_run_loop_posix_init, &btstack_run_loop_posix_init,
&btstack_run_loop_posix_add_data_source, &btstack_run_loop_posix_add_data_source,
&btstack_run_loop_posix_remove_data_source, &btstack_run_loop_posix_remove_data_source,
NULL, &btstack_run_loop_posix_enable_data_source_callbacks,
NULL, &btstack_run_loop_posix_disable_data_source_callbacks,
&btstack_run_loop_posix_set_timer, &btstack_run_loop_posix_set_timer,
&btstack_run_loop_posix_add_timer, &btstack_run_loop_posix_add_timer,
&btstack_run_loop_posix_remove_timer, &btstack_run_loop_posix_remove_timer,