mirror of https://github.com/flysand7/ciabatta.git
Fix %I64d not loading correct int sizes
This commit is contained in:
parent
5453813e39
commit
8c5c5adeca
4
build.py
4
build.py
|
@ -155,6 +155,8 @@ cc_defines_pop()
|
||||||
cc_flags_pop()
|
cc_flags_pop()
|
||||||
|
|
||||||
# Build the ciabatta
|
# Build the ciabatta
|
||||||
|
cc_flags_push()
|
||||||
|
cc_flags.append('-Wno-format'); # until i find way to disable clang warning on %I64d
|
||||||
print_step("Building lib/cia.a\n")
|
print_step("Building lib/cia.a\n")
|
||||||
assemble_obj('bin/thread-entry.o', [f'arch/{target_abi}_{target_arch}/thread-entry.asm'], ['-f "elf64"'])
|
assemble_obj('bin/thread-entry.o', [f'arch/{target_abi}_{target_arch}/thread-entry.asm'], ['-f "elf64"'])
|
||||||
compile_obj('bin/cia.o', ['cia.c'])
|
compile_obj('bin/cia.o', ['cia.c'])
|
||||||
|
@ -163,3 +165,5 @@ archive('lib/cia.a', ['bin/cia.o', 'bin/thread-entry.o'])
|
||||||
# Build the test
|
# Build the test
|
||||||
if test_file != None:
|
if test_file != None:
|
||||||
compile_exe('a', [test_file, 'lib/cia.a'], ['-Wl,-dynamic-linker,lib/ld-cia.so'])
|
compile_exe('a', [test_file, 'lib/cia.a'], ['-Wl,-dynamic-linker,lib/ld-cia.so'])
|
||||||
|
|
||||||
|
cc_flags_pop()
|
|
@ -108,14 +108,43 @@ int printf(const char *restrict fmt, ...) {
|
||||||
}
|
}
|
||||||
// fmt[i] == '%'
|
// fmt[i] == '%'
|
||||||
i += 1;
|
i += 1;
|
||||||
|
// Check int sizes
|
||||||
|
int int_arg_size = 32;
|
||||||
|
if(fmt[i] == 'I') {
|
||||||
|
if(fmt[i+1] == '3' && fmt[i+2] == '2') {
|
||||||
|
int_arg_size = 32;
|
||||||
|
}
|
||||||
|
else if(fmt[i+1] == '6' && fmt[i+2] == '4') {
|
||||||
|
int_arg_size = 64;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
int arg_chars;
|
int arg_chars;
|
||||||
if(fmt[i] == 'd') {
|
if(fmt[i] == 'd') {
|
||||||
int arg = va_arg(args, int);
|
i64 arg;
|
||||||
arg_chars = print_int((i64)arg);
|
if(int_arg_size == 32) {
|
||||||
|
arg = (i64)va_arg(args, i32);
|
||||||
|
}
|
||||||
|
else if(int_arg_size == 64) {
|
||||||
|
arg = va_arg(args, i64);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
arg_chars = print_int(arg);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(fmt[i] == 'u') {
|
else if(fmt[i] == 'u') {
|
||||||
unsigned int arg = va_arg(args, unsigned int);
|
u32 arg;
|
||||||
|
if(int_arg_size == 32) {
|
||||||
|
arg = va_arg(args, u32);
|
||||||
|
}
|
||||||
|
else if(int_arg_size == 64) {
|
||||||
|
arg = va_arg(args, u64);
|
||||||
|
}
|
||||||
arg_chars = print_uint((u64)arg);
|
arg_chars = print_uint((u64)arg);
|
||||||
}
|
}
|
||||||
else if(fmt[i] == 'p') {
|
else if(fmt[i] == 'p') {
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
enum memory_order store_memory_order = memory_order_acquire;
|
enum memory_order store_memory_order = memory_order_release;
|
||||||
enum memory_order load_memory_order = memory_order_release;
|
enum memory_order load_memory_order = memory_order_acquire;
|
||||||
#else
|
#else
|
||||||
enum memory_order store_memory_order = memory_order_seq_cst;
|
enum memory_order store_memory_order = memory_order_seq_cst;
|
||||||
enum memory_order load_memory_order = memory_order_seq_cst;
|
enum memory_order load_memory_order = memory_order_seq_cst;
|
||||||
|
@ -35,8 +35,7 @@ static Shared_State g_shared_state = {0};
|
||||||
int tx(void *ctx) {
|
int tx(void *ctx) {
|
||||||
arbitrary_delay(delay_that_works);
|
arbitrary_delay(delay_that_works);
|
||||||
Shared_State *ss = ctx;
|
Shared_State *ss = ctx;
|
||||||
char msg[] = "Thread tx running\n";
|
printf("Thread %s running\n", "tx");
|
||||||
fwrite(msg, 1, sizeof msg, stdout);
|
|
||||||
atomic_store_explicit(&ss->x, 1, store_memory_order);
|
atomic_store_explicit(&ss->x, 1, store_memory_order);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -45,8 +44,7 @@ int tx(void *ctx) {
|
||||||
int ty(void *ctx) {
|
int ty(void *ctx) {
|
||||||
arbitrary_delay(delay_that_works);
|
arbitrary_delay(delay_that_works);
|
||||||
Shared_State *ss = ctx;
|
Shared_State *ss = ctx;
|
||||||
char msg[] = "Thread ty running\n";
|
printf("Thread %s running\n", "ty");
|
||||||
fwrite(msg, 1, sizeof msg, stdout);
|
|
||||||
atomic_store_explicit(&ss->y, 1, store_memory_order);
|
atomic_store_explicit(&ss->y, 1, store_memory_order);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -55,8 +53,7 @@ int ty(void *ctx) {
|
||||||
int t1(void *ctx) {
|
int t1(void *ctx) {
|
||||||
arbitrary_delay(delay_that_works);
|
arbitrary_delay(delay_that_works);
|
||||||
Shared_State *ss = ctx;
|
Shared_State *ss = ctx;
|
||||||
char msg[] = "Thread t1 running\n";
|
printf("Thread %s running\n", "t1");
|
||||||
fwrite(msg, 1, sizeof msg, stdout);
|
|
||||||
while(atomic_load_explicit(&ss->x, load_memory_order) == 0)
|
while(atomic_load_explicit(&ss->x, load_memory_order) == 0)
|
||||||
;
|
;
|
||||||
if(atomic_load_explicit(&ss->y, load_memory_order) == 1) {
|
if(atomic_load_explicit(&ss->y, load_memory_order) == 1) {
|
||||||
|
@ -69,8 +66,7 @@ int t1(void *ctx) {
|
||||||
int t2(void *ctx) {
|
int t2(void *ctx) {
|
||||||
arbitrary_delay(delay_that_works);
|
arbitrary_delay(delay_that_works);
|
||||||
Shared_State *ss = ctx;
|
Shared_State *ss = ctx;
|
||||||
char msg[] = "Thread t2 running\n";
|
printf("Thread %s running\n", "t2");
|
||||||
fwrite(msg, 1, sizeof msg, stdout);
|
|
||||||
while(atomic_load_explicit(&ss->y, load_memory_order) == 0)
|
while(atomic_load_explicit(&ss->y, load_memory_order) == 0)
|
||||||
;
|
;
|
||||||
if(atomic_load_explicit(&ss->x, load_memory_order) == 1) {
|
if(atomic_load_explicit(&ss->x, load_memory_order) == 1) {
|
||||||
|
@ -88,8 +84,8 @@ int main() {
|
||||||
for(int i = 0; i < 4; ++i) {
|
for(int i = 0; i < 4; ++i) {
|
||||||
int status = thrd_create(&threads[i], thread_funcs[i], &g_shared_state);
|
int status = thrd_create(&threads[i], thread_funcs[i], &g_shared_state);
|
||||||
if(status != thrd_success) {
|
if(status != thrd_success) {
|
||||||
char msg[] = "Thread unable to start\n";
|
printf("Thread unable to start\n");
|
||||||
fwrite(msg, 1, sizeof msg, stdout);
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Wait for threads to complete
|
// Wait for threads to complete
|
||||||
|
@ -99,9 +95,6 @@ int main() {
|
||||||
}
|
}
|
||||||
// Check to see the cnt variable
|
// Check to see the cnt variable
|
||||||
int result = atomic_load_explicit(&g_shared_state.cnt, memory_order_relaxed);
|
int result = atomic_load_explicit(&g_shared_state.cnt, memory_order_relaxed);
|
||||||
if(result == 0) {
|
printf("result: %d\n", result);
|
||||||
char msg[] = "This shouldn't happen in sequentially-consistent model!\n";
|
|
||||||
fwrite(msg, 1, sizeof msg, stdout);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,65 +5,30 @@
|
||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
#include <cia/sync.h>
|
#include <cia/sync.h>
|
||||||
|
|
||||||
static void print_string_n(char *str, u64 len) {
|
|
||||||
fwrite(str, 1, len, stdout);
|
|
||||||
}
|
|
||||||
static void print_char(char c) {
|
|
||||||
print_string_n(&c, 1);
|
|
||||||
}
|
|
||||||
static void print_string(char *str) {
|
|
||||||
int str_len = 0;
|
|
||||||
while(str[str_len] != 0) {
|
|
||||||
str_len += 1;
|
|
||||||
}
|
|
||||||
print_string_n(str, str_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_int(i64 number) {
|
|
||||||
if(number < 0) {
|
|
||||||
print_char('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
char buf[20];
|
|
||||||
buf[19] = 0;
|
|
||||||
char *p = buf + sizeof buf - 1;
|
|
||||||
do {
|
|
||||||
*--p = (number%10) + '0';
|
|
||||||
number /= 10;
|
|
||||||
} while(number > 0);
|
|
||||||
print_string(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Cia_Mutex g_print_mutex;
|
|
||||||
static Cia_Mutex g_mutex;
|
static Cia_Mutex g_mutex;
|
||||||
static volatile i64 counter = 0;
|
static volatile i64 counter = 0;
|
||||||
|
|
||||||
int thrd_func(void *arg) {
|
int thrd_func(void *arg) {
|
||||||
print_string("child thread: ok!\n");
|
printf("child thread: ok!\n");
|
||||||
for(int i = 0; i < 100000; ++i) {
|
for(int i = 0; i < 100000; ++i) {
|
||||||
cia_mutex_lock(&g_mutex);
|
cia_mutex_lock(&g_mutex);
|
||||||
counter += 1;
|
counter += 1;
|
||||||
cia_mutex_unlock(&g_mutex);
|
cia_mutex_unlock(&g_mutex);
|
||||||
}
|
}
|
||||||
cia_mutex_lock(&g_print_mutex);
|
printf("child thread: counter = %I64d\n", counter);
|
||||||
print_string("child thread: counter = ");
|
|
||||||
print_int(counter);
|
|
||||||
print_char('\n');
|
|
||||||
cia_mutex_unlock(&g_print_mutex);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
print_string("main thread: before\n");
|
printf("main thread: before\n");
|
||||||
cia_mutex_init(&g_mutex);
|
cia_mutex_init(&g_mutex);
|
||||||
cia_mutex_init(&g_print_mutex);
|
|
||||||
thrd_t thrd;
|
thrd_t thrd;
|
||||||
int status = thrd_create(&thrd, thrd_func, NULL);
|
int status = thrd_create(&thrd, thrd_func, NULL);
|
||||||
if(status == thrd_error) {
|
if(status == thrd_error) {
|
||||||
print_string("main thread: error creating child thread\n");
|
printf("main thread: error creating child thread\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
print_string("main thread: after!\n");
|
printf("main thread: after!\n");
|
||||||
for(int i = 0; i < 100000; ++i) {
|
for(int i = 0; i < 100000; ++i) {
|
||||||
cia_mutex_lock(&g_mutex);
|
cia_mutex_lock(&g_mutex);
|
||||||
counter += 1;
|
counter += 1;
|
||||||
|
@ -71,10 +36,6 @@ int main() {
|
||||||
}
|
}
|
||||||
int exit_code;
|
int exit_code;
|
||||||
thrd_join(thrd, &exit_code);
|
thrd_join(thrd, &exit_code);
|
||||||
cia_mutex_lock(&g_print_mutex);
|
printf("main thread: counter = %I64d\n", counter);
|
||||||
print_string("main thread: counter = ");
|
|
||||||
print_int(counter);
|
|
||||||
print_char('\n');
|
|
||||||
cia_mutex_unlock(&g_print_mutex);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue