#include #include #include #include int threads = 1; mutex_t d_mutex = MUTEX_UNLOCKED; int d_pos = 0; int vgatxt = -1; void display_it(char k) { mutex_lock(&d_mutex); // just display some stuff on /.dev/vgatxt if (vgatxt == -1) { vgatxt = open("/.dev/vgatxt", FM_READ | FM_WRITE); } uint16_t c = k | (4 << 8); write(vgatxt, 2 * d_pos, 2, (char*)&c); d_pos++; mutex_unlock(&d_mutex); } void thread_cascade(void* d) { int n = (int)d; char *v = malloc(2048); if (!v) display_it('!'); if (d == 0) { //printk("{#} 0 cascade element started => end\n"); printk("*"); } else { if (n < 0) { //printk("{#} - cascade element started\n"); display_it('-'); n = 0 - n; } else { //printk("{#} + cascade element started\n"); display_it('+'); } //printk("{#} FORK + ...\n"); display_it('>'); threads += 2; thread_new(thread_cascade, (void*)(n - 1)); //printk("{#} FORK - ...\n"); display_it('<'); thread_new(thread_cascade, (void*)(1 - n)); //printk("{#} Thread cascade element finished.\n"); display_it('.'); } free(v); threads--; } void useless_thread(void* d) { while(1) { display_it('~'); schedule(); } } int main(int argc, char** args) { printk("(test) Creating thread cascade (total 2**7 = 128 threads)\n"); thread_new(useless_thread, 0); thread_new(thread_cascade, (void*)7); while (1) { schedule(); if (threads == 0) break; } printk("\n(test) Test process exiting. Press the super key to go to the home terminal.\n"); printf("(test) End.\n"); return 0; }