diff --git a/src/usb_moded-modesetting.c b/src/usb_moded-modesetting.c index 00f111f..94137c6 100644 --- a/src/usb_moded-modesetting.c +++ b/src/usb_moded-modesetting.c @@ -223,7 +223,7 @@ umount: command = g_strconcat("mount | grep ", mountpath, NULL); if(try != 3) { try++; - sleep(1); + usb_moded_sleep(1); log_err("Umount failed. Retrying\n"); report_mass_storage_blocker(mount, 1); goto umount; @@ -243,7 +243,7 @@ umount: command = g_strconcat("mount | grep ", mountpath, NULL); } /* activate mounts after sleeping 1s to be sure enumeration happened and autoplay will work in windows*/ - sleep(1); + usb_moded_sleep(1); for(i=0 ; mounts[i] != NULL; i++) { @@ -482,7 +482,7 @@ int set_dynamic_mode(void) if(data->appsync && !ret) { /* let's sleep for a bit (350ms) to allow interfaces to settle before running postsync */ - usleep(350000); + usb_moded_msleep(350); activate_sync_post(data->mode_name); } diff --git a/src/usb_moded-modules.c b/src/usb_moded-modules.c index c6afae2..e028a47 100644 --- a/src/usb_moded-modules.c +++ b/src/usb_moded-modules.c @@ -201,7 +201,7 @@ int usb_moded_module_cleanup(const char *module) if(!strcmp(module, MODULE_NONE)) goto END; /* wait a bit for all components listening on dbus to clean up their act - sleep(2); */ + usb_moded_sleep(2); */ /* check if things were not reconnected in that timespan if(get_usb_connection_state()) return(0); @@ -224,7 +224,7 @@ int usb_moded_module_cleanup(const char *module) while(failure) { /* module did not get unloaded. We will wait a bit and try again */ - sleep(1); + usb_moded_sleep(1); /* send the REALLY disconnect message */ usb_moded_send_signal(USB_REALLY_DISCONNECT); failure = usb_moded_unload_module(module); diff --git a/src/usb_moded-network.c b/src/usb_moded-network.c index 36ed1fd..0b6f50d 100644 --- a/src/usb_moded-network.c +++ b/src/usb_moded-network.c @@ -491,10 +491,7 @@ gboolean connman_set_tethering(const char *path, gboolean on) { if (i>0) { - struct timespec tv; - tv.tv_sec = 0; - tv.tv_nsec = 200000000; - nanosleep(&tv, NULL); + usb_moded_msleep(200); } if (connman_try_set_tethering(connection, path, on)) { @@ -711,7 +708,7 @@ static int connman_set_cellular_online(DBusConnection *dbus_conn_connman, const /* we don't care for the reply, which is empty anyway if all goes well */ ret = !dbus_connection_send(dbus_conn_connman, msg, NULL); /* sleep for the connection to come up */ - sleep(5); + usb_moded_sleep(5); /* make sure the message is sent before cleaning up and closing the connection */ dbus_connection_flush(dbus_conn_connman); dbus_message_unref(msg); @@ -976,7 +973,7 @@ int usb_network_up(struct mode_list_elem *data) //usb_moded_system("/sbin/ifconfig rndis0 up"); log_debug("waiting for connman to pick up interface\n"); - sleep(1); + usb_moded_sleep(1); dbus_error_init(&error); if( (dbus_conn_connman = dbus_bus_get(DBUS_BUS_SYSTEM, &error)) == 0 ) diff --git a/src/usb_moded.c b/src/usb_moded.c index d982112..3d55ef0 100644 --- a/src/usb_moded.c +++ b/src/usb_moded.c @@ -191,7 +191,7 @@ void set_usb_connected(gboolean connected) static gboolean set_disconnected(gpointer data) { /* let usb settle */ - sleep(1); + usb_moded_sleep(1); /* only disconnect for real if we are actually still disconnected */ if(!get_usb_connection_state()) { @@ -1147,6 +1147,34 @@ usb_moded_system_(const char *file, int line, const char *func, return rc; } +/** Wrapper to give visibility to blocking sleeps usb-moded is making + */ +void +usb_moded_usleep_(const char *file, int line, const char *func, + useconds_t usec) +{ + struct timespec ts = { + .tv_sec = (usec / 1000000), + .tv_nsec = (usec % 1000000) * 1000 + }; + + long ms = (ts.tv_nsec + 1000000 - 1) / 1000000; + + if( !ms ) { + log_debug("SLEEP %ld seconds; from %s:%d: %s()", + (long)ts.tv_sec, file, line, func); + } + else if( ts.tv_sec ) { + log_debug("SLEEP %ld.%03ld seconds; from %s:%d: %s()", + (long)ts.tv_sec, ms, file, line, func); + } + else { + log_debug("SLEEP %ld milliseconds; from %s:%d: %s()", + ms, file, line, func); + } + + do { } while( nanosleep(&ts, &ts) == -1 && errno != EINTR ); +} int main(int argc, char* argv[]) { diff --git a/src/usb_moded.h b/src/usb_moded.h index c2cabbc..5ad30e9 100644 --- a/src/usb_moded.h +++ b/src/usb_moded.h @@ -99,4 +99,9 @@ void usb_moded_stop(int exitcode); int usb_moded_system_(const char *file, int line, const char *func, const char *command); #define usb_moded_system(command) usb_moded_system_(__FILE__,__LINE__,__FUNCTION__,(command)) +void usb_moded_usleep_(const char *file, int line, const char *func, useconds_t usec); +#define usb_moded_usleep(usec) usb_moded_usleep_(__FILE__,__LINE__,__FUNCTION__,(usec)) +#define usb_moded_msleep(msec) usb_moded_usleep_(__FILE__,__LINE__,__FUNCTION__,(msec)*1000) +#define usb_moded_sleep(sec) usb_moded_usleep_(__FILE__,__LINE__,__FUNCTION__,(sec)*1000000) + #endif /* USB_MODED_H */