You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.0 KiB
153 lines
3.0 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
|
|
// This test looks for fails in updating the hash table
|
|
// Even with an intentional bug, it rarely fails
|
|
// Increase TRIES to make it run longer and more likely to find the bug
|
|
|
|
#define TRIES 1000
|
|
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include "../Utils/threadlib.h"
|
|
#if defined(__GNUC__)
|
|
# include <stdlib.h>
|
|
#endif
|
|
int a[100000];
|
|
int n = 10;
|
|
|
|
typedef int (*FUNPTR)();
|
|
|
|
#define FUN(n) int fun##n() { return n; }
|
|
#define FUN10(n) \
|
|
FUN(n##0) \
|
|
FUN(n##1) \
|
|
FUN(n##2) \
|
|
FUN(n##3) \
|
|
FUN(n##4) \
|
|
FUN(n##5) \
|
|
FUN(n##6) \
|
|
FUN(n##7) \
|
|
FUN(n##8) \
|
|
FUN(n##9)
|
|
|
|
#define FUN100(n) \
|
|
FUN10(n##0) \
|
|
FUN10(n##1) \
|
|
FUN10(n##2) \
|
|
FUN10(n##3) \
|
|
FUN10(n##4) \
|
|
FUN10(n##5) \
|
|
FUN10(n##6) \
|
|
FUN10(n##7) \
|
|
FUN10(n##8) \
|
|
FUN10(n##9)
|
|
|
|
FUN100(1)
|
|
FUN100(2)
|
|
FUN100(3)
|
|
FUN100(4)
|
|
FUN100(5)
|
|
FUN100(6)
|
|
FUN100(7)
|
|
FUN100(8)
|
|
FUN100(9)
|
|
FUN100(10)
|
|
FUN100(11)
|
|
FUN100(12)
|
|
FUN100(13)
|
|
|
|
#define FUNINIT10(n) fun##n##0,fun##n##1,fun##n##2,fun##n##3,fun##n##4,fun##n##5,fun##n##6,fun##n##7,fun##n##8,fun##n##9
|
|
#define FUNINIT100(n) FUNINIT10(n##0),FUNINIT10(n##1),FUNINIT10(n##2),FUNINIT10(n##3),FUNINIT10(n##4),FUNINIT10(n##5),FUNINIT10(n##6),FUNINIT10(n##7),FUNINIT10(n##8),FUNINIT10(n##9)
|
|
|
|
FUNPTR funs[] =
|
|
{
|
|
FUNINIT100(1),
|
|
FUNINIT100(2),
|
|
FUNINIT100(3),
|
|
FUNINIT100(4),
|
|
FUNINIT100(5),
|
|
FUNINIT100(6),
|
|
FUNINIT100(7),
|
|
FUNINIT100(8),
|
|
FUNINIT100(9),
|
|
FUNINIT100(10),
|
|
FUNINIT100(11),
|
|
FUNINIT100(12),
|
|
FUNINIT100(13)
|
|
};
|
|
|
|
|
|
void * hello(void * arg)
|
|
{
|
|
int i;
|
|
int j;
|
|
|
|
for (j = 0; j < TRIES; j++)
|
|
{
|
|
for (i = 0; i < 1300; i++)
|
|
{
|
|
int res = funs[i]();
|
|
int expect = i + 100;
|
|
|
|
|
|
if (res != expect)
|
|
{
|
|
printf("Expected %d, got %d\n",expect, res);
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
THREAD_HANDLE threads[MAXTHREADS];
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int numthreads = 0;
|
|
int i;
|
|
|
|
numthreads = 2;
|
|
assert(numthreads < MAXTHREADS);
|
|
|
|
for (i = 0; i < numthreads; i++)
|
|
{
|
|
printf("Creating thread\n");
|
|
fflush(stdout);
|
|
CreateOneThread(&threads[i], hello, 0);
|
|
fflush(stdout);
|
|
}
|
|
|
|
for (i=0; i<numthreads; i++)
|
|
{
|
|
BOOL success;
|
|
success = JoinOneThread (threads[i]);
|
|
if (!success)
|
|
{
|
|
fprintf(stdout, "JoinOneThread failed\n");
|
|
}
|
|
else
|
|
{
|
|
fprintf(stdout, "Joined %d\n", i);
|
|
}
|
|
fflush (stdout);
|
|
}
|
|
|
|
printf("All threads joined\n");
|
|
fflush(stdout);
|
|
|
|
return 0;
|
|
}
|