Functonal webserver with supporting code changes. WIP COMMIT
[akaros.git] / user / apps / parlib / lock_test.c
1 #include <parlib.h>
2 #include <ros/mman.h>
3 #include <ros/resource.h>
4 #include <stdio.h>
5 #include <hart.h>
6
7 #include <pthread.h>
8
9 pthread_mutex_t lock;
10
11 // ghetto udelay, put in a lib somewhere and export the tsc freq
12 #include <arch/arch.h>
13 void udelay(uint64_t usec, uint64_t tsc_freq)
14 {
15         uint64_t start, end, now;
16
17         start = read_tsc();
18     end = start + (tsc_freq * usec) / 1000000;
19         if (end == 0) printf("This is terribly wrong \n");
20         do {
21         cpu_relax();
22         now = read_tsc();
23         } while (now < end || (now > start && end < start));
24         return;
25 }
26
27 __thread int temp;
28
29 void startup(void *arg)
30 {
31         uint32_t vcoreid = hart_self();
32         temp = 0xcafebabe;
33         while(1)
34         {
35                 pthread_mutex_lock(&lock);
36                 printf("Hello from hart_entry in vcore %d with temp addr %p and temp %p\n",
37                         vcoreid, &temp, temp);
38                 pthread_mutex_unlock(&lock);
39         }
40 }
41
42
43 int main(int argc, char** argv)
44 {
45         uint32_t vcoreid;
46         error_t retval;
47
48         pthread_mutex_init(&lock, NULL);
49
50         if ((vcoreid = hart_self())) {
51                 printf("Should never see me! (from vcore %d)\n", vcoreid);
52         } else { // core 0
53                 temp = 0xdeadbeef;
54                 printf("Hello from vcore %d with temp addr = %p and temp = %p\n",
55                        vcoreid, &temp, temp);
56                 printf("Multi-Goodbye, world, from PID: %d!\n", sys_getpid());
57
58                 extern void *hart_startup_arg;
59                 extern void (*hart_startup)();
60                 hart_startup_arg = NULL;
61                 hart_startup = startup;         
62                 retval = hart_request(6);
63
64         }
65         printf("Vcore %d Done!\n", vcoreid);
66         while (1);
67         return 0;
68 }