You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
2.2 KiB
C

#include "threads.h"
int main()
{
dbgln("main", 4);
int arg1 = 30;
int arg2 = 50;
struct optional_int t1 = spawn(thread, &arg1);
if (has_error(t1)) {
__asm__ ("ebreak");
return 1;
}
struct optional_int t2 = spawn(thread, &arg2);
if (has_error(t2)) {
__asm__ ("ebreak");
return 2;
}
t1 = join(t1.value, 1000);
if (has_error(t1)) {
return -1;
}
t2 = join(t2.value, 1000);
if (has_error(t2)) {
return -2;
}
dbgln("children exited!", 16);
return 0;
}
int thread(void* args)
{
// read value
int arg = *((int*) args);
//char buff[64] = "sleeping for ";
//char* end = itoa(arg, &buff[13], 10);
// print given number
//dbgln(buff, 13);
sleep(arg);
// return value as exit code
return arg;
}
/*
* Additional functions
*/
void dbgln(char* text, int len)
{
while (len > TEXT_IO_BUFLEN) {
dbgln(text, TEXT_IO_BUFLEN);
text += TEXT_IO_BUFLEN;
len -= TEXT_IO_BUFLEN;
}
char* ioaddr = (char*) TEXT_IO_ADDR + 4;
for (int i = 0; i < len; i++) {
if (*text == 0)
break;
*ioaddr++ = *text++;
}
if (len < TEXT_IO_BUFLEN)
*ioaddr = '\n';
// write a 1 to the start of the textIO to signal a buffer flush
*((char*) TEXT_IO_ADDR) = 1;
}
char alpha[16] = "0123456789abcdef";
char* itoa(int value, char* str, int base)
{
if (base > 16 || base < 2) {
*str++ = '?';
return str;
}
if (value < 0) {
*str++ = '-';
value *= -1;
}
int digits = 0;
int num = 0;
// reverse number
do {
num = num * base;
num += value % base;
value = value / base;
digits++;
} while (value > 0);
value = num;
do {
num = value % base;
value = value / base;
*str++ = alpha[num];
digits--;
}while (digits > 0);
return str;
}
void _start()
{
__asm__ __volatile__ (
".option push\n"
".option norelax\n"
" la gp, _gp\n"
".option pop\n"
);
main();
__asm__ __volatile__ (
"li a7, 5\n"
"ecall\n"
);
__builtin_unreachable();
}