mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Upgrade of mingw in CI. Fix problems using reflection on interface types #1203. Improved debug information on defer. $foreach doesn't create an implicit syntactic scope. Error if `@if` depends on `@if`. Updated Linux stacktrace. Fix of default argument stacktrace. Allow linking libraries directly by file path. Improve inlining warning messages. Added `index_of_char_from`. Compiler crash using enum nameof from different module #1205. Removed unused fields in find_msvc. Use vswhere to find msvc. Update tests for LLVM 19
90 lines
1.3 KiB
Plaintext
90 lines
1.3 KiB
Plaintext
import std::thread;
|
|
import std::io;
|
|
|
|
int a;
|
|
|
|
fn void! testrun() @test
|
|
{
|
|
Thread t;
|
|
a = 0;
|
|
t.create(fn int(void* arg) { a++; return 0; }, null)!;
|
|
assert(t.join()! == 0);
|
|
assert(a == 1);
|
|
|
|
t.create(fn int(void* arg) { return 10; }, null)!;
|
|
assert(t.join()! == 10);
|
|
}
|
|
|
|
|
|
Mutex m_global;
|
|
|
|
fn void! testrun_mutex() @test
|
|
{
|
|
Thread[20] ts;
|
|
a = 0;
|
|
m_global.init()!;
|
|
foreach (&t : ts)
|
|
{
|
|
t.create(fn int(void* arg) {
|
|
m_global.lock()!!;
|
|
defer m_global.unlock()!!;
|
|
a += 10;
|
|
thread::sleep_ms(5);
|
|
a *= 10;
|
|
thread::sleep_ms(5);
|
|
a /= 10;
|
|
thread::sleep_ms(5);
|
|
a -= 10;
|
|
thread::sleep_ms(5);
|
|
a++;
|
|
return 0;
|
|
}, null)!;
|
|
}
|
|
foreach (&t : ts)
|
|
{
|
|
assert(t.join()! == 0);
|
|
}
|
|
assert(a == ts.len);
|
|
m_global.destroy()!;
|
|
}
|
|
|
|
fn void! testrun_mutex_try() @test
|
|
{
|
|
Mutex m;
|
|
m.init()!;
|
|
m.lock()!;
|
|
assert(m.try_lock() == false);
|
|
m.unlock()!;
|
|
assert(m.try_lock() == true);
|
|
m.unlock()!;
|
|
}
|
|
|
|
fn void! testrun_mutex_timeout() @test
|
|
{
|
|
TimedMutex m;
|
|
m.init()!;
|
|
m.lock()!;
|
|
if (try m.lock_timeout(20))
|
|
{
|
|
unreachable("lock_timeout should fail");
|
|
}
|
|
m.unlock()!;
|
|
m.lock_timeout(20)!;
|
|
m.unlock()!;
|
|
}
|
|
|
|
int x_once = 100;
|
|
|
|
fn void call_once()
|
|
{
|
|
x_once += 100;
|
|
}
|
|
|
|
fn void! testrun_once() @test
|
|
{
|
|
OnceFlag once;
|
|
once.call(&call_once);
|
|
assert(x_once == 200);
|
|
once.call(&call_once);
|
|
assert(x_once == 200);
|
|
} |