Summary: Moves lldbsuite tests to lldb/test/API.
This is a largely mechanical change, moved with the following steps:
```
rm lldb/test/API/testcases
mkdir -p lldb/test/API/{test_runner/test,tools/lldb-{server,vscode}}
mv lldb/packages/Python/lldbsuite/test/test_runner/test lldb/test/API/test_runner
for d in $(find lldb/packages/Python/lldbsuite/test/* -maxdepth 0 -type d | egrep -v "make|plugins|test_runner|tools"); do mv $d lldb/test/API; done
for d in $(find lldb/packages/Python/lldbsuite/test/tools/lldb-vscode -maxdepth 1 -mindepth 1 | grep -v ".py"); do mv $d lldb/test/API/tools/lldb-vscode; done
for d in $(find lldb/packages/Python/lldbsuite/test/tools/lldb-server -maxdepth 1 -mindepth 1 | egrep -v "gdbremote_testcase.py|lldbgdbserverutils.py|socket_packet_pump.py"); do mv $d lldb/test/API/tools/lldb-server; done
```
lldb/packages/Python/lldbsuite/__init__.py and lldb/test/API/lit.cfg.py were also updated with the new directory structure.
Reviewers: labath, JDevlieghere
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D71151
138 lines
3.0 KiB
C++
138 lines
3.0 KiB
C++
//===-- main.c --------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#import <Foundation/Foundation.h>
|
|
#import <pthread.h>
|
|
|
|
long my_global;
|
|
|
|
void *Thread1(void *arg) {
|
|
my_global = 42;
|
|
return NULL;
|
|
}
|
|
|
|
void *Thread2(void *arg) {
|
|
my_global = 144;
|
|
return NULL;
|
|
}
|
|
|
|
void TestDataRace1() {
|
|
pthread_t t1, t2;
|
|
pthread_create(&t1, NULL, Thread1, NULL);
|
|
pthread_create(&t2, NULL, Thread2, NULL);
|
|
|
|
pthread_join(t1, NULL);
|
|
pthread_join(t2, NULL);
|
|
}
|
|
|
|
void TestInvalidMutex() {
|
|
pthread_mutex_t m = {0};
|
|
pthread_mutex_lock(&m);
|
|
|
|
pthread_mutex_init(&m, NULL);
|
|
pthread_mutex_lock(&m);
|
|
pthread_mutex_unlock(&m);
|
|
pthread_mutex_destroy(&m);
|
|
pthread_mutex_lock(&m);
|
|
}
|
|
|
|
void TestMutexWrongLock() {
|
|
pthread_mutex_t m = {0};
|
|
pthread_mutex_init(&m, NULL);
|
|
pthread_mutex_unlock(&m);
|
|
}
|
|
|
|
long some_global;
|
|
|
|
void TestDataRaceBlocks1() {
|
|
dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_CONCURRENT);
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
dispatch_async(q, ^{
|
|
some_global++; // race 1
|
|
|
|
usleep(100000); // force the blocks to be on different threads
|
|
});
|
|
}
|
|
|
|
usleep(100000);
|
|
dispatch_barrier_sync(q, ^{ });
|
|
}
|
|
|
|
void TestDataRaceBlocks2() {
|
|
dispatch_queue_t q = dispatch_queue_create("my.queue2", DISPATCH_QUEUE_CONCURRENT);
|
|
|
|
char *c;
|
|
|
|
c = malloc((rand() % 1000) + 10);
|
|
for (int i = 0; i < 2; i++) {
|
|
dispatch_async(q, ^{
|
|
c[0] = 'x'; // race 2
|
|
fprintf(stderr, "tid: %p\n", pthread_self());
|
|
usleep(100000); // force the blocks to be on different threads
|
|
});
|
|
}
|
|
dispatch_barrier_sync(q, ^{ });
|
|
|
|
free(c);
|
|
}
|
|
|
|
void TestUseAfterFree() {
|
|
char *c;
|
|
|
|
c = malloc((rand() % 1000) + 10);
|
|
free(c);
|
|
c[0] = 'x';
|
|
}
|
|
|
|
void TestRacePipe() {
|
|
dispatch_queue_t q = dispatch_queue_create("my.queue3", DISPATCH_QUEUE_CONCURRENT);
|
|
|
|
int a[2];
|
|
pipe(a);
|
|
int fd = a[0];
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
dispatch_async(q, ^{
|
|
write(fd, "abc", 3);
|
|
usleep(100000); // force the blocks to be on different threads
|
|
});
|
|
dispatch_async(q, ^{
|
|
close(fd);
|
|
usleep(100000);
|
|
});
|
|
}
|
|
|
|
dispatch_barrier_sync(q, ^{ });
|
|
}
|
|
|
|
void TestThreadLeak() {
|
|
pthread_t t1;
|
|
pthread_create(&t1, NULL, Thread1, NULL);
|
|
}
|
|
|
|
int main(int argc, const char * argv[]) {
|
|
TestDataRace1();
|
|
|
|
TestInvalidMutex();
|
|
|
|
TestMutexWrongLock();
|
|
|
|
TestDataRaceBlocks1();
|
|
|
|
TestDataRaceBlocks2();
|
|
|
|
TestUseAfterFree();
|
|
|
|
TestRacePipe();
|
|
|
|
TestThreadLeak();
|
|
|
|
return 0;
|
|
}
|