51 lines
958 B
C
51 lines
958 B
C
/*
|
|
* Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <pthread.h>
|
|
|
|
#include "metal-test.h"
|
|
#include <metal/log.h>
|
|
#include <metal/sys.h>
|
|
#include <metal/spinlock.h>
|
|
|
|
static const int spinlock_test_count = 1000;
|
|
static unsigned int total = 0;
|
|
|
|
static void *spinlock_thread(void *arg)
|
|
{
|
|
struct metal_spinlock *l = arg;
|
|
int i;
|
|
|
|
for (i = 0; i < spinlock_test_count; i++) {
|
|
metal_spinlock_acquire(l);
|
|
total++;
|
|
metal_spinlock_release(l);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static int spinlock(void)
|
|
{
|
|
struct metal_spinlock lock = METAL_SPINLOCK_INIT;
|
|
const int threads = 10;
|
|
int value, error;
|
|
|
|
error = metal_run(threads, spinlock_thread, &lock);
|
|
if (!error) {
|
|
value = total;
|
|
value -= spinlock_test_count * threads;
|
|
if (value) {
|
|
metal_log(METAL_LOG_DEBUG, "counter mismatch, delta = %d\n",
|
|
value);
|
|
error = -EINVAL;
|
|
}
|
|
}
|
|
|
|
return error;
|
|
}
|
|
METAL_ADD_TEST(spinlock);
|