[LTP] [PATCH] crypto/af_alg02: use pthread_tryjoin_np() instead of pthread_kill()

Alexey Kodanev aleksei.kodanev@bell-sw.com
Fri Jul 16 14:03:06 CEST 2021


Hi Li,
On 16.07.2021 10:06, Li Wang wrote:
> Hi Alexey,
> 
> On Thu, Jul 15, 2021 at 6:29 PM Alexey Kodanev <aleksei.kodanev@bell-sw.com <mailto:aleksei.kodanev@bell-sw.com>> wrote:
> 
>     musl doesn't return ESRCH for pthread_kill() if thread id is not found.
> 
>     POSIX only recommends to return ESRCH, and also says that pthread_kill()
>     produces undefined behavior if tid lifetime has ended [1].
> 
>     [1]: https://man7.org/linux/man-pages/man3/pthread_kill.3.html <https://man7.org/linux/man-pages/man3/pthread_kill.3.html>
> 
>     Signed-off-by: Alexey Kodanev <aleksei.kodanev@bell-sw.com <mailto:aleksei.kodanev@bell-sw.com>>
>     ---
>      testcases/kernel/crypto/af_alg02.c | 2 +-
>      1 file changed, 1 insertion(+), 1 deletion(-)
> 
>     diff --git a/testcases/kernel/crypto/af_alg02.c b/testcases/kernel/crypto/af_alg02.c
>     index 31d30777c..0f5793c16 100644
>     --- a/testcases/kernel/crypto/af_alg02.c
>     +++ b/testcases/kernel/crypto/af_alg02.c
>     @@ -60,7 +60,7 @@ static void run(void)
> 
>             TST_CHECKPOINT_WAIT(0);
> 
>     -       while (pthread_kill(thr, 0) != ESRCH) {
>     +       while (pthread_tryjoin_np(thr, NULL) == EBUSY) {
> 
> 
> I'm not sure ifsafeenough to use because it is nonstandard GNU extensions
> and the "_np" means nonportable.
> 
> Maybe another workaround is to define a volatile flag 'thread_complete', 
> initialize it to '0' when thread_B starts and reset to '1' while exit, and just
> do a value check in the while loop of thread_A should acquire thread_B status.
> Is this way a bit better? 

OK, why not, so something like this:

diff --git a/testcases/kernel/crypto/af_alg02.c b/testcases/kernel/crypto/af_alg02.c
index 0f5793c16..1fe0f3bf0 100644
--- a/testcases/kernel/crypto/af_alg02.c
+++ b/testcases/kernel/crypto/af_alg02.c
@@ -18,11 +18,13 @@
 #include "tst_test.h"
 #include "tst_af_alg.h"
 #include "tst_safe_pthread.h"
+#include "tst_atomic.h"
 #include <pthread.h>
 #include <errno.h>

 #define SALSA20_IV_SIZE       8
 #define SALSA20_MIN_KEY_SIZE  16
+static int completed;

 static void *verify_encrypt(void *arg)
 {
@@ -48,6 +50,8 @@ static void *verify_encrypt(void *arg)
                tst_res(TPASS, "Successfully \"encrypted\" an empty message");
        else
                tst_res(TFAIL, "read() didn't return 0");
+
+       tst_atomic_store(1, &completed);
        return arg;
 }

@@ -60,7 +64,7 @@ static void run(void)

        TST_CHECKPOINT_WAIT(0);

-       while (pthread_tryjoin_np(thr, NULL) == EBUSY) {
+       while (!tst_atomic_load(&completed)) {
                if (tst_timeout_remaining() <= 10) {
                        pthread_cancel(thr);
                        tst_brk(TBROK,


More information about the ltp mailing list