fixed formatting
[tridge/junkcode.git] / malloc_threads.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6 #include <errno.h>
7 #include <string.h>
8
9 #if USE_THREADS
10 #include <pthread.h>
11
12 /*
13   create a thread with initial function fn(private)
14 */
15 static int proc_start(void *(*fn)(void *private))
16 {
17         pthread_t thread_id;
18         pthread_attr_t thread_attr;
19         int rc;
20
21         pthread_attr_init(&thread_attr);
22         pthread_attr_setdetachstate(&thread_attr, 0);
23         rc = pthread_create(&thread_id, &thread_attr, fn, NULL);
24         pthread_attr_destroy(&thread_attr);
25
26         return (int)thread_id;
27 }
28
29 /* wait for a thread to exit */
30 static int proc_join(int id)
31 {
32         return pthread_join(id, NULL);
33 }
34
35
36 #else
37
38 /*
39   create a thread with initial function fn(private)
40 */
41 static int proc_start(void *(*fn)(void *private))
42 {
43         pid_t pid;
44
45         pid = fork();
46         if (pid == 0) {
47                 fn(NULL);
48                 exit(0);
49         }
50         return pid;
51 }
52
53 static int proc_join(int id)
54 {
55         if (waitpid((pid_t)id, NULL, 0) != id) {
56                 return -1;
57         }
58         return 0;
59 }
60
61 #endif
62
63 /*
64   main child process fn
65 */
66 static void *proc_main(void *private)
67 {
68 #define NMALLOCS 3000
69         int i, j;
70         void *ptrs[NMALLOCS];
71         for (j=0;j<100;j++) {
72                 for (i=1;i<NMALLOCS;i++) {
73                         ptrs[i] = malloc(i);
74                         if (!ptrs[i]) {
75                                 printf("malloc(%d) failed!\n", i);
76                                 exit(1);
77                         }
78                 }
79                 for (i=1;i<NMALLOCS;i++) {
80                         free(ptrs[i]);
81                 }
82         }
83         return NULL;
84 }
85
86 /* lock a byte range in a open file */
87 int main(int argc, char *argv[])
88 {
89         int nthreads, i;
90         int *ids;
91
92         if (argc <= 1) {
93                 printf("malloc NPROCS\n");
94                 exit(1);
95         }
96
97         nthreads = atoi(argv[1]);
98
99         ids = malloc(sizeof(*ids) * nthreads);
100
101         for (i=0;i<nthreads;i++) {
102                 ids[i] = proc_start(proc_main);
103         }
104
105         for (i=0;i<nthreads;i++) {
106                 int rc;
107                 rc = proc_join(ids[i]);
108                 if (rc != 0) {
109                         printf("Thread %d failed : %s\n", i, strerror(errno));
110                         exit(1);
111                 }
112         }
113
114         return 0;
115 }