From df6fc2a1ce9f3a1778e9c8e14c800cd2ad96e96e Mon Sep 17 00:00:00 2001 From: Saya Sugiura Date: Tue, 8 Jan 2019 16:45:04 +0900 Subject: POSIX: Replace usleep with nanosleep Signed-off-by: Saya Sugiura --- src/console/dlt-control-common.h | 3 +++ src/console/dlt-control.c | 5 ++++- src/console/logstorage/dlt-logstorage-udev.c | 5 ++++- src/examples/dlt-example-user-common-api.c | 12 ++++++++---- src/examples/dlt-example-user-func.c | 12 ++++++++---- src/examples/dlt-example-user.c | 12 ++++++++---- src/kpi/dlt-kpi.c | 15 ++++++++++++--- src/kpi/dlt-kpi.h | 3 +++ src/lib/dlt_filetransfer.c | 8 +++++++- src/lib/dlt_user.c | 17 ++++++++++++++--- src/lib/dlt_user_cfg.h | 8 ++++---- src/tests/dlt-test-multi-process.c | 12 ++++++++---- src/tests/dlt-test-stress-user.c | 5 ++++- src/tests/dlt-test-stress.c | 24 +++++++++++++++++++----- 14 files changed, 106 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/console/dlt-control-common.h b/src/console/dlt-control-common.h index 0bd7deb..f2dc38f 100644 --- a/src/console/dlt-control-common.h +++ b/src/console/dlt-control-common.h @@ -50,6 +50,9 @@ #define DLT_CTRL_DEFAULT_ECUID "ECU1" +#define NANOSEC_PER_MILLISEC 1000000 +#define NANOSEC_PER_SEC 1000000000 + /* To be used as Dlt Message body when sending to DLT daemon */ typedef struct { diff --git a/src/console/dlt-control.c b/src/console/dlt-control.c index a1eb408..19e4b36 100644 --- a/src/console/dlt-control.c +++ b/src/console/dlt-control.c @@ -232,6 +232,7 @@ int main(int argc, char *argv[]) int c; int index; char *endptr = NULL; + struct timespec ts; /* Initialize dltdata */ dltdata.vflag = 0; @@ -641,7 +642,9 @@ int main(int argc, char *argv[]) /*dlt_client_main_loop(&dltclient, &dltdata, dltdata.vflag); */ /* Wait timeout */ - usleep(dltdata.tvalue * 1000); + ts.tv_sec = (dltdata.tvalue * NANOSEC_PER_MILLISEC) / NANOSEC_PER_SEC; + ts.tv_nsec = (dltdata.tvalue * NANOSEC_PER_MILLISEC) % NANOSEC_PER_SEC; + nanosleep(&ts, NULL); } /* Dlt Client Cleanup */ diff --git a/src/console/logstorage/dlt-logstorage-udev.c b/src/console/logstorage/dlt-logstorage-udev.c index 578f1fa..e50e660 100644 --- a/src/console/logstorage/dlt-logstorage-udev.c +++ b/src/console/logstorage/dlt-logstorage-udev.c @@ -207,6 +207,7 @@ static int logstorage_udev_udevd_callback(void) DltLogstorageCtrl *lctrl = get_logstorage_control(); LogstorageCtrlUdev *prvt = NULL; struct udev_device *partition = NULL; + struct timespec ts; if (!lctrl) { pr_error("Not able to get logstorage control instance.\n"); @@ -247,7 +248,9 @@ static int logstorage_udev_udevd_callback(void) * Then, udev is only interesting to simplify the check on new devices, * and/or for hot unplug (without unmount). */ - usleep(500 * 1000); + ts.tv_sec = 0; + ts.tv_nsec = 500 * NANOSEC_PER_MILLISEC; + nanosleep(&ts, NULL); ret = check_mountpoint_from_partition(EVENT_MOUNTED, partition); } else if (strncmp(action, "remove", sizeof("remove")) == 0) diff --git a/src/examples/dlt-example-user-common-api.c b/src/examples/dlt-example-user-common-api.c index 880ea97..65f3b3c 100644 --- a/src/examples/dlt-example-user-common-api.c +++ b/src/examples/dlt-example-user-common-api.c @@ -112,6 +112,7 @@ int main(int argc, char *argv[]) char *text; int num, maxnum; int delay; + struct timespec ts; int state = -1, newstate; @@ -199,9 +200,9 @@ int main(int argc, char *argv[]) maxnum = 10; if (dvalue) - delay = atoi(dvalue) * 1000; + delay = atoi(dvalue) * 1000000; else - delay = 500 * 1000; + delay = 500 * 1000000; if (gflag) { /* DLT messages to test Fibex non-verbose description: dlt-example-non-verbose.xml */ @@ -258,8 +259,11 @@ int main(int argc, char *argv[]) /* Verbose mode */ DLT_LOG2(mycontext, DLT_LOG_WARN, DLT_INT(num), DLT_STRING(text)); - if (delay > 0) - usleep(delay); + if (delay > 0) { + ts.tv_sec = delay / 1000000000; + ts.tv_nsec = delay % 1000000000; + nanosleep(&ts, NULL); + } } sleep(1); diff --git a/src/examples/dlt-example-user-func.c b/src/examples/dlt-example-user-func.c index b29ff9f..96f98c5 100644 --- a/src/examples/dlt-example-user-func.c +++ b/src/examples/dlt-example-user-func.c @@ -118,6 +118,7 @@ int main(int argc, char *argv[]) char *text; int num, maxnum; int delay; + struct timespec ts; opterr = 0; @@ -206,9 +207,9 @@ int main(int argc, char *argv[]) maxnum = 10; if (dvalue) - delay = atoi(dvalue) * 1000; + delay = atoi(dvalue) * 1000000; else - delay = 500 * 1000; + delay = 500 * 1000000; if (gflag) { /* DLT messages to test Fibex non-verbose description: dlt-example-non-verbose.xml */ @@ -257,8 +258,11 @@ int main(int argc, char *argv[]) dlt_user_log_write_finish(&mycontextdata); } - if (delay > 0) - usleep(delay); + if (delay > 0) { + ts.tv_sec = delay / 1000000000; + ts.tv_nsec = delay % 1000000000; + nanosleep(&ts, NULL); + } } dlt_unregister_context(&mycontext); diff --git a/src/examples/dlt-example-user.c b/src/examples/dlt-example-user.c index 19cf73f..45b9561 100644 --- a/src/examples/dlt-example-user.c +++ b/src/examples/dlt-example-user.c @@ -142,6 +142,7 @@ int main(int argc, char *argv[]) char *text; int num, maxnum; int delay; + struct timespec ts; int state = -1, newstate; @@ -311,9 +312,9 @@ int main(int argc, char *argv[]) maxnum = 10; if (dvalue) - delay = atoi(dvalue) * 1000; + delay = atoi(dvalue) * 1000000; else - delay = 500 * 1000; + delay = 500 * 1000000; if (tvalue) dlt_set_resend_timeout_atexit(atoi(tvalue)); @@ -378,8 +379,11 @@ int main(int argc, char *argv[]) DLT_LOG(mycontext1, lvalue, DLT_RAW(text, rvalue)); } - if (delay > 0) - usleep(delay); + if (delay > 0) { + ts.tv_sec = delay / 1000000000; + ts.tv_nsec = delay % 1000000000; + nanosleep(&ts, NULL); + } } sleep(1); diff --git a/src/kpi/dlt-kpi.c b/src/kpi/dlt-kpi.c index 0fbff3a..d9f9727 100644 --- a/src/kpi/dlt-kpi.c +++ b/src/kpi/dlt-kpi.c @@ -186,6 +186,7 @@ void *dlt_kpi_start_process_thread() DltReturnValue dlt_kpi_process_loop() { static unsigned long int old_millis, sleep_millis, dif_millis; + struct timespec ts; old_millis = get_millis(); @@ -201,7 +202,9 @@ DltReturnValue dlt_kpi_process_loop() else sleep_millis = config.process_log_interval - dif_millis; - usleep(sleep_millis * 1000); + ts.tv_sec = (sleep_millis * NANOSEC_PER_MILLISEC) / NANOSEC_PER_SEC; + ts.tv_nsec = (sleep_millis * NANOSEC_PER_MILLISEC) % NANOSEC_PER_SEC; + nanosleep(&ts, NULL); old_millis = get_millis(); } @@ -424,6 +427,7 @@ void *dlt_kpi_start_irq_thread() DltReturnValue dlt_kpi_irq_loop() { static unsigned long int old_millis, sleep_millis, dif_millis; + struct timespec ts; old_millis = get_millis(); @@ -439,7 +443,9 @@ DltReturnValue dlt_kpi_irq_loop() else sleep_millis = config.irq_log_interval - dif_millis; - usleep(sleep_millis * 1000); + ts.tv_sec = (sleep_millis * NANOSEC_PER_MILLISEC) / NANOSEC_PER_SEC; + ts.tv_nsec = (sleep_millis * NANOSEC_PER_MILLISEC) % NANOSEC_PER_SEC; + nanosleep(&ts, NULL); old_millis = get_millis(); } @@ -458,6 +464,7 @@ void *dlt_kpi_start_check_thread() DltReturnValue dlt_kpi_check_loop() { static unsigned long int old_millis, sleep_millis, dif_millis; + struct timespec ts; old_millis = get_millis(); @@ -473,7 +480,9 @@ DltReturnValue dlt_kpi_check_loop() else sleep_millis = config.check_log_interval - dif_millis; - usleep(sleep_millis * 1000); + ts.tv_sec = (sleep_millis * NANOSEC_PER_MILLISEC) / NANOSEC_PER_SEC; + ts.tv_nsec = (sleep_millis * NANOSEC_PER_MILLISEC) % NANOSEC_PER_SEC; + nanosleep(&ts, NULL); old_millis = get_millis(); } diff --git a/src/kpi/dlt-kpi.h b/src/kpi/dlt-kpi.h index ff647d4..4cefb73 100644 --- a/src/kpi/dlt-kpi.h +++ b/src/kpi/dlt-kpi.h @@ -40,6 +40,9 @@ #define COMMAND_LINE_SIZE 1024 +#define NANOSEC_PER_MILLISEC 1000000 +#define NANOSEC_PER_SEC 1000000000 + /* STRUCTURES */ typedef struct { diff --git a/src/lib/dlt_filetransfer.c b/src/lib/dlt_filetransfer.c index 7844de2..736a7d6 100644 --- a/src/lib/dlt_filetransfer.c +++ b/src/lib/dlt_filetransfer.c @@ -68,6 +68,9 @@ #define DLT_FILETRANSFER_TRANSFER_ALL_PACKAGES INT_MAX +#define NANOSEC_PER_MILLISEC 1000000 +#define NANOSEC_PER_SEC 1000000000 + /*!Buffer for dlt file transfer. The size is defined by BUFFER_SIZE */ unsigned char buffer[BUFFER_SIZE]; @@ -194,7 +197,10 @@ int isFile (const char *file) */ void doTimeout(int timeout) { - usleep(timeout * 1000); + struct timespec ts; + ts.tv_sec = (timeout * NANOSEC_PER_MILLISEC) / NANOSEC_PER_SEC; + ts.tv_nsec = (timeout * NANOSEC_PER_MILLISEC) % NANOSEC_PER_SEC; + nanosleep(&ts, NULL); } /*!Checks free space of the user buffer */ diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 1c1bbd8..1bddcfa 100644 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -733,6 +733,7 @@ int dlt_user_atexit_blow_out_user_buffer(void) { int count, ret; + struct timespec ts; uint32_t exitTime = dlt_uptime() + dlt_user.timeout_at_exit_handler; @@ -770,7 +771,9 @@ int dlt_user_atexit_blow_out_user_buffer(void) } } - usleep(DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP); + ts.tv_sec = 0; + ts.tv_nsec = DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP; + nanosleep(&ts, NULL); } DLT_SEM_LOCK(); @@ -2786,6 +2789,7 @@ DltReturnValue dlt_user_trace_network_segmented_segment(uint32_t id, void *payload) { int ret = DLT_RETURN_ERROR; + struct timespec ts; if ((nw_trace_type < DLT_NW_TRACE_IPC) || (nw_trace_type >= DLT_NW_TRACE_MAX)) { dlt_vlog(LOG_ERR, "Network trace type %d is outside valid range", nw_trace_type); @@ -2793,7 +2797,10 @@ DltReturnValue dlt_user_trace_network_segmented_segment(uint32_t id, } while (check_buffer() < 0) { - usleep(1000 * 50); /* Wait 50ms */ + /* Wait 50ms */ + ts.tv_sec = 0; + ts.tv_nsec = 1000000*50; + nanosleep(&ts, NULL); dlt_user_log_resend_buffer(); } @@ -3478,6 +3485,7 @@ DltReturnValue dlt_disable_local_print(void) void dlt_user_receiverthread_function(__attribute__((unused)) void *ptr) { + struct timespec ts; #ifdef linux prctl(PR_SET_NAME, "dlt_receiver", 0, 0, 0); #endif @@ -3488,7 +3496,10 @@ void dlt_user_receiverthread_function(__attribute__((unused)) void *ptr) /* Critical error */ dlt_log(LOG_CRIT, "Receiver thread encountered error condition\n"); - usleep(DLT_USER_RECEIVE_DELAY); /* delay */ + /* delay */ + ts.tv_sec = 0; + ts.tv_nsec = DLT_USER_RECEIVE_NDELAY; + nanosleep(&ts, NULL); } } diff --git a/src/lib/dlt_user_cfg.h b/src/lib/dlt_user_cfg.h index 5e43ee0..6d27ea0 100644 --- a/src/lib/dlt_user_cfg.h +++ b/src/lib/dlt_user_cfg.h @@ -128,8 +128,8 @@ /* default message id for non-verbose mode, if no message id was provided */ #define DLT_USER_DEFAULT_MSGID 0xffff -/* delay in receiver routine in usec (100000 usec = 100ms) */ -#define DLT_USER_RECEIVE_DELAY 100000 +/* delay for receiver thread (nsec) */ +#define DLT_USER_RECEIVE_NDELAY (100000000) /* Name of environment variable for local print mode */ #define DLT_USER_ENV_LOCAL_PRINT_MODE "DLT_LOCAL_PRINT_MODE" @@ -137,8 +137,8 @@ /* Timeout offset for resending user buffer at exit in 10th milliseconds (10000 = 1s)*/ #define DLT_USER_ATEXIT_RESEND_BUFFER_EXIT_TIMEOUT 100000 -/* Sleeps between resending user buffer at exit in usec (1000 usec = 1ms)*/ -#define DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP 100000 +/* Sleeps between resending user buffer at exit in nsec (1000000 nsec = 1ms)*/ +#define DLT_USER_ATEXIT_RESEND_BUFFER_SLEEP 100000000 /* Retry interval for mq error in usec */ #define DLT_USER_MQ_ERROR_RETRY_INTERVAL 100000 diff --git a/src/tests/dlt-test-multi-process.c b/src/tests/dlt-test-multi-process.c index 5b508f3..c5da2a6 100644 --- a/src/tests/dlt-test-multi-process.c +++ b/src/tests/dlt-test-multi-process.c @@ -292,9 +292,9 @@ void cleanup() time_t mksleep_time(int delay, int fudge) { if (!fudge) - return delay * 1000; + return delay*1000000; else - return (delay + rand() % fudge) * 1000; + return (delay+rand()%fudge)*1000000; } /** @@ -305,7 +305,8 @@ void do_logging(s_thread_data *data) DltContext mycontext; char ctid[5]; char ctid_name[256]; - + struct timespec ts; + time_t sleep_time; snprintf(ctid, 5, "%.2x", rand() & 0x0000ffff); snprintf(ctid_name, 256, "Child %s in dlt-test-multi-process", ctid); @@ -315,7 +316,10 @@ void do_logging(s_thread_data *data) while (msgs_left-- > 0) { DLT_LOG(mycontext, DLT_LOG_INFO, DLT_STRING(PAYLOAD_DATA)); - usleep(mksleep_time(data->params.delay, data->params.delay_fudge)); + sleep_time = mksleep_time(data->params.delay, data->params.delay_fudge); + ts.tv_sec = sleep_time / 1000000000; + ts.tv_nsec = sleep_time % 1000000000; + nanosleep(&ts, NULL); } DLT_UNREGISTER_CONTEXT(mycontext); diff --git a/src/tests/dlt-test-stress-user.c b/src/tests/dlt-test-stress-user.c index 5cd3a65..5b7047b 100644 --- a/src/tests/dlt-test-stress-user.c +++ b/src/tests/dlt-test-stress-user.c @@ -232,6 +232,7 @@ int testall(int count, int repeat, int delay, int size) { char buffer[size]; int num, rnum; + struct timespec ts; for (num = 0; num < size; num++) buffer[num] = num; @@ -243,7 +244,9 @@ int testall(int count, int repeat, int delay, int size) for (rnum = 0; rnum < repeat; rnum++) for (num = 1; num <= count; num++) { DLT_LOG(context_info, DLT_LOG_INFO, DLT_INT(num), DLT_RAW(buffer, size)); - usleep(delay); + ts.tv_sec = (delay * 1000) / 1000000000; + ts.tv_nsec = (delay * 1000) % 1000000000; + nanosleep(&ts, NULL); } /* wait 5 seconds after test */ diff --git a/src/tests/dlt-test-stress.c b/src/tests/dlt-test-stress.c index ddfe937..bb986da 100644 --- a/src/tests/dlt-test-stress.c +++ b/src/tests/dlt-test-stress.c @@ -227,6 +227,7 @@ void stress1(void) { int i, c; char ctid[5]; + struct timespec ts; printf("Starting stress test1... (press \"Enter\" to terminate test) \n"); @@ -240,7 +241,9 @@ void stress1(void) /*printf("%i: '%s' \n",i,ctid); */ dlt_register_context(&(mycontext[i]), ctid, ctid); - usleep(500); + ts.tv_sec = 0; + ts.tv_nsec = 500 * 1000; + nanosleep(&ts, NULL); } while (1) { @@ -255,7 +258,9 @@ void stress1(void) for (i = 0; i < STRESS1_NUM_CONTEXTS; i++) { DLT_UNREGISTER_CONTEXT(mycontext[i]); - usleep(500); + ts.tv_sec = 0; + ts.tv_nsec = 500 * 1000; + nanosleep(&ts, NULL); } printf("Finished stress test1 \n\n"); @@ -264,6 +269,7 @@ void stress1(void) void stress2(void) { int ret, index; + struct timespec ts; pthread_t thread[STRESS2_MAX_NUM_THREADS]; thread_data_t thread_data[STRESS2_MAX_NUM_THREADS]; @@ -282,7 +288,9 @@ void stress2(void) if (ret != 0) printf("Error creating thread %d: %s \n", index, strerror(errno)); - usleep(1000); + ts.tv_sec = 0; + ts.tv_nsec = 1000 * 1000; + nanosleep(&ts, NULL); } for (index = 0; index < STRESS2_MAX_NUM_THREADS; index++) @@ -296,6 +304,7 @@ void thread_function(void) /*thread_data_t *data; */ DLT_DECLARE_CONTEXT(context_thread1); char ctid[5]; + struct timespec ts; /*data = (thread_data_t *) ptr; */ @@ -304,7 +313,9 @@ void thread_function(void) /* Create random context id */ snprintf(ctid, 5, "%.2x", rand() & 0x0000ffff); - usleep(rand() / 1000); + ts.tv_sec = 0; + ts.tv_nsec = rand(); + nanosleep(&ts, NULL); DLT_REGISTER_CONTEXT(context_thread1, ctid, ctid); @@ -318,6 +329,7 @@ void stress3(void) DLT_DECLARE_CONTEXT(context_stress3); char buffer[STRESS3_MAX_NUM_MESSAGES]; int num; + struct timespec ts; /* Performance test */ DLT_REGISTER_CONTEXT(context_stress3, "TST3", "Stress Test 3 - Performance"); @@ -328,7 +340,9 @@ void stress3(void) for (num = 0; num < STRESS3_MAX_NUM_MESSAGES; num++) { buffer[num] = num; DLT_LOG(context_stress3, DLT_LOG_INFO, DLT_INT(num), DLT_RAW(buffer, num)); - usleep(10000); + ts.tv_sec = 0; + ts.tv_nsec = 10000 * 1000; + nanosleep(&ts, NULL); } printf("Finished stress test3 \n\n"); -- cgit v1.2.1