[LTP] [PATCH 1/2] lib: Add timeout to TST_PROCESS_STATE_WAIT
Yang Xu
xuyang_jy_0410@163.com
Thu Jan 23 14:17:30 CET 2020
Hi Jorik
> Hi Yang, thanks for the review!
>
>>
>>> Add the possibility to add a timeout to TST_PROCESS_STATE_WAIT.
>>> Like checkpoints add TST_PROCESS_STATE_WAIT2()
>>> for specifying a timeout. The original TST_PROCESS_STATE_WAIT()
>>> works the same as before. Timeout can be specified in milliseconds.
>>>
>> Hi Jorik
>>
>> We have tst_process_state_wait2 since commit dbf270c5 ("lib: Add
>> tst_process_state_wait2()"), this api has same functions as
>> tst_process_state_wait but only return error instead of TBROK.
>>
>> I think using TST_PROCESS_STATE_WAIT2 is confused and we can only expand
>> tst_process_state_wait make it support sleep specifying in milliseconds.
>>
>> Best Regards
>> Yang Xu
>
> I don't think I quite understand what you mean. I can see that using
> TST_PROCESS_STATE_WAIT2 is confusing. But I didn't want to touch the
> existing TST_PROCESS_STATE_WAIT to ensure all older tests still run the
> same. Are you saying i should go through all tests that use
> TST_PROCESS_STATE_WAIT and specify that they use a timeout of 0(which
> according to a git grep doesn't seem too many, so it wouldn't be too
> much effort) and then change TST_PROCESS_STATE_WAIT to include a timeout
Yes.
> or should I just rename TST_PROCESS_STATE_WAIT2 to something that
> seperates it more from tst_process_state_wait2?
Also, I am fine with the second way. Let we listen cyril's advise.
@Cyril What do you think about it?
>
> regards,
> Jorik Cronenberg
>>> Signed-off-by: Jorik Cronenberg <jcronenberg@suse.de>
>>> ---
>>> include/tst_process_state.h | 12 ++++++++----
>>> lib/tst_process_state.c | 19 ++++++++++++++-----
>>> 2 files changed, 22 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/include/tst_process_state.h b/include/tst_process_state.h
>>> index fab0491d9..27a8ffc36 100644
>>> --- a/include/tst_process_state.h
>>> +++ b/include/tst_process_state.h
>>> @@ -47,9 +47,13 @@
>>> */
>>> #ifdef TST_TEST_H__
>>> +#define TST_PROCESS_STATE_WAIT2(pid, state, msec_timeout) \
>>> + tst_process_state_wait(__FILE__, __LINE__, NULL, \
>>> + (pid), (state), msec_timeout)
>>> +
>>> #define TST_PROCESS_STATE_WAIT(pid, state) \
>>> tst_process_state_wait(__FILE__, __LINE__, NULL, \
>>> - (pid), (state))
>>> + (pid), (state), 0)
>>> #else
>>> /*
>>> * The same as above but does not use tst_brkm() interface.
>>> @@ -65,8 +69,8 @@ int tst_process_state_wait2(pid_t pid, const char
>>> state);
>>> (pid), (state))
>>> #endif
>>> -void tst_process_state_wait(const char *file, const int lineno,
>>> - void (*cleanup_fn)(void),
>>> - pid_t pid, const char state);
>>> +int tst_process_state_wait(const char *file, const int lineno,
>>> + void (*cleanup_fn)(void), pid_t pid,
>>> + const char state, unsigned int msec_timeout);
>>> #endif /* TST_PROCESS_STATE__ */
>>> diff --git a/lib/tst_process_state.c b/lib/tst_process_state.c
>>> index 7a7824959..32b44992c 100644
>>> --- a/lib/tst_process_state.c
>>> +++ b/lib/tst_process_state.c
>>> @@ -28,11 +28,12 @@
>>> #include "test.h"
>>> #include "tst_process_state.h"
>>> -void tst_process_state_wait(const char *file, const int lineno,
>>> - void (*cleanup_fn)(void),
>>> - pid_t pid, const char state)
>>> +int tst_process_state_wait(const char *file, const int lineno,
>>> + void (*cleanup_fn)(void), pid_t pid,
>>> + const char state, unsigned int msec_timeout)
>>> {
>>> char proc_path[128], cur_state;
>>> + unsigned int msecs = 0;
>>> snprintf(proc_path, sizeof(proc_path), "/proc/%i/stat", pid);
>>> @@ -41,10 +42,18 @@ void tst_process_state_wait(const char *file,
>>> const int lineno,
>>> "%*i %*s %c", &cur_state);
>>> if (state == cur_state)
>>> - return;
>>> + break;
>>> - usleep(10000);
>>> + usleep(1000);
>>> + msecs += 1;
>>> +
>>> + if (msecs >= msec_timeout) {
>>> + errno = ETIMEDOUT;
>>> + return -1;
>>> + }
>>> }
>>> +
>>> + return 0;
>>> }
>>> int tst_process_state_wait2(pid_t pid, const char state)
>>>
>>
>>
>
More information about the ltp
mailing list