// SPDX-License-Identifier: GPL-2.0
#include <linux/kernel.h>
#include <linux/gfp.h>
#include <linux/slab.h>
#include <linux/radix-tree.h>
#include <linux/rcupdate.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <assert.h>
#include "regression.h"
static pthread_barrier_t worker_barrier;
static int obj0, obj1;
static RADIX_TREE(mt_tree, GFP_KERNEL);
static void *reader_fn(void *arg)
{
int i;
void *entry;
rcu_register_thread();
pthread_barrier_wait(&worker_barrier);
for (i = 0 ; i < 1000000 ; i++) {
rcu_read_lock();
entry = radix_tree_lookup(&mt_tree, 0 );
rcu_read_unlock();
if (entry != &obj0) {
printf("iteration %d bad entry = %p\n" , i, entry);
abort();
}
}
rcu_unregister_thread();
return NULL;
}
static void *writer_fn(void *arg)
{
int i;
rcu_register_thread();
pthread_barrier_wait(&worker_barrier);
for (i = 0 ; i < 1000000 ; i++) {
radix_tree_insert(&mt_tree, 1 , &obj1);
radix_tree_delete(&mt_tree, 1 );
}
rcu_unregister_thread();
return NULL;
}
void regression4_test(void )
{
pthread_t reader, writer;
printv(1 , "regression test 4 starting\n" );
radix_tree_insert(&mt_tree, 0 , &obj0);
pthread_barrier_init(&worker_barrier, NULL, 2 );
if (pthread_create(&reader, NULL, reader_fn, NULL) ||
pthread_create(&writer, NULL, writer_fn, NULL)) {
perror("pthread_create" );
exit (1 );
}
if (pthread_join(reader, NULL) || pthread_join(writer, NULL)) {
perror("pthread_join" );
exit (1 );
}
printv(1 , "regression test 4 passed\n" );
}
Messung V0.5 in Prozent C=98 H=92 G=94
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland