Warning, cross-references for /kernel/tests/test6.c need to be fixed.
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include "syscall.h"
0019
0020 void
0021 putx (unsigned long l)
0022 {
0023
0024 int i, li;
0025
0026 for (i = 7; i >= 0; i--)
0027 if ((li = (l >> (i << 2)) & 0x0F) > 9)
0028 putchar ('A' + li - 0x0A);
0029 else
0030 putchar ('0' + li);
0031 }
0032
0033 void
0034 print (char *s)
0035 {
0036 while (*s) {
0037 putchar (*s++);
0038 }
0039 }
0040
0041 void
0042 _start ()
0043 {
0044 int pid;
0045 int info = meminfo ();
0046 unsigned shared_id;
0047 int *shared_mem;
0048 int i;
0049
0050 print ("MEMINFO: ");
0051 putx (info);
0052 print ("\n");
0053
0054 shared_id = shared_mem_alloc ();
0055 if (shared_id < 0) {
0056 _exit (1);
0057 }
0058 print ("shared_id = ");
0059 putx (shared_id);
0060 print ("\n");
0061
0062
0063
0064 #define ITERATIONS 1000000
0065 if ((pid = fork ())) {
0066
0067
0068 shared_mem = shared_mem_attach (shared_id);
0069 if ((unsigned) shared_mem == -1) {
0070 shared_mem_free (shared_id);
0071 _exit (1);
0072 }
0073 print ("parent shared_mem = ");
0074 putx ((unsigned) shared_mem);
0075 print ("\n");
0076
0077 for (i = 0; i < ITERATIONS; i++) {
0078 int ebx, j;
0079
0080 asm ("cpuid": "=b" (ebx):"a" (1));
0081
0082 for (j = 0; j < (ebx >> 24); j++)
0083 asm volatile ("lock decl %0":"=m" (*shared_mem):);
0084 }
0085
0086
0087 if (waitpid (pid) < 0) {
0088 print ("waitpid returned -1\n");
0089 }
0090
0091 print ("value = ");
0092 putx (*shared_mem);
0093 print ("\n");
0094
0095 shared_mem_detach (shared_mem);
0096
0097 shared_mem_free (shared_id);
0098 _exit (0);
0099
0100 } else {
0101
0102 shared_mem = shared_mem_attach (shared_id);
0103 if ((unsigned) shared_mem == -1) {
0104 shared_mem_free (shared_id);
0105 _exit (1);
0106 }
0107 print ("child shared_mem = ");
0108 putx ((unsigned) shared_mem);
0109 print ("\n");
0110
0111 for (i = 0; i < ITERATIONS; i++) {
0112 int ebx, j;
0113
0114 asm ("cpuid": "=b" (ebx):"a" (1));
0115
0116 for (j = 0; j < (ebx >> 24); j++)
0117 asm volatile ("lock incl %0":"=m" (*shared_mem):);
0118 }
0119
0120 shared_mem_detach (shared_mem);
0121
0122 _exit (0);
0123 }
0124 }
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135