~kirkland/eucalyptus/label-metadata

« back to all changes in this revision

Viewing changes to util/test.c

  • Committer: graziano obertelli
  • Date: 2009-01-07 03:32:35 UTC
  • Revision ID: graziano@cs.ucsb.edu-20090107033235-oxhuexp18v8hg0pw
Tags: 1.4
from CVS

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
#include <stdlib.h>
 
3
#include <unistd.h> /* usleep */
 
4
#include <pthread.h>
 
5
#include "ipc.h"
 
6
#include "misc.h"
 
7
 
 
8
#define ITER 160*4
 
9
 
 
10
void test_sem_fork (void) 
 
11
{
 
12
    sem * s = sem_alloc (1, "eucalyptus-util-test");
 
13
    
 
14
    printf ("---> testing semaphores between processes\n");
 
15
    
 
16
    if (fork()) {
 
17
        char c = 'A';
 
18
        int i;
 
19
        sleep (1);
 
20
        printf ("A trying sem...\n");
 
21
        sem_p (s);
 
22
        printf ("A got sem!\n");
 
23
        sleep (1);
 
24
        printf ("A releasing sem...\n");
 
25
        sem_v (s);
 
26
        sleep (1);
 
27
        
 
28
        for (i=0; i<ITER; i++) {
 
29
            sem_p(s);
 
30
            if (i%16==0) printf ("\n");
 
31
            write (1, &c, 1);
 
32
            usleep (100);
 
33
            write (1, &c, 1);
 
34
            sem_v(s);
 
35
        }
 
36
        
 
37
    } else {
 
38
        char c = 'B';
 
39
        int i;
 
40
        
 
41
        printf ("B trying sem...\n");
 
42
        sem_p (s);
 
43
        printf ("B got sem!\n");
 
44
        sleep (2);
 
45
        printf ("B releasing sem...\n");
 
46
        sem_v (s);
 
47
        sleep (2);
 
48
        
 
49
        for (i=0; i<ITER; i++) {
 
50
            sem_p(s);
 
51
            write (1, &c, 1);
 
52
            usleep (100);
 
53
            write (1, &c, 1);
 
54
            sem_v(s);
 
55
        }
 
56
        exit (0); /* child quits */
 
57
    }
 
58
 
 
59
    sem_free (s);
 
60
    printf ("\n");
 
61
}
 
62
 
 
63
void * thread_a (void * arg)
 
64
{
 
65
    sem * s = (sem *)arg;
 
66
    char c = 'T';
 
67
    int i;
 
68
    sleep (1);
 
69
    printf ("T trying sem...\n");
 
70
    sem_p (s);
 
71
    printf ("T got sem!\n");
 
72
    sleep (1);
 
73
    printf ("T releasing sem...\n");
 
74
    sem_v (s);
 
75
    sleep (1);
 
76
    
 
77
    for (i=0; i<ITER; i++) {
 
78
        sem_p(s);
 
79
        if (i%16==0) printf ("\n");
 
80
        write (1, &c, 1);
 
81
        usleep (100);
 
82
        write (1, &c, 1);
 
83
        sem_v(s);
 
84
    }
 
85
    return NULL;
 
86
}
 
87
 
 
88
void * thread_b (void * arg)
 
89
{
 
90
    sem * s = (sem *)arg;
 
91
    char c = 'U';
 
92
    int i;
 
93
    
 
94
    printf ("U trying sem...\n");
 
95
    sem_p (s);
 
96
    printf ("U got sem!\n");
 
97
    sleep (2);
 
98
    printf ("U releasing sem...\n");
 
99
    sem_v (s);
 
100
    sleep (2);
 
101
    
 
102
    for (i=0; i<ITER; i++) {
 
103
        sem_p(s);
 
104
        write (1, &c, 1);
 
105
        usleep (100);
 
106
        write (1, &c, 1);
 
107
        sem_v(s);
 
108
    }
 
109
    return NULL;
 
110
}
 
111
 
 
112
void test_sem_pthreads (void) 
 
113
{
 
114
    sem * s = sem_alloc (1, "eucalyptus-util-test2");
 
115
    pthread_t ta, tb;
 
116
    void * status;
 
117
 
 
118
    printf ("---> testing semaphores between threads\n");
 
119
    pthread_create (&ta, NULL, thread_a, s);
 
120
    pthread_create (&tb, NULL, thread_b, s);
 
121
    pthread_join (ta, &status);
 
122
    pthread_join (tb, &status);
 
123
    printf ("\n");
 
124
 
 
125
    sem_free (s);
 
126
}
 
127
 
 
128
int main (int argc, char * argv[])
 
129
{
 
130
    if ( diff ("/etc/motd", "/etc/motd") != 0 ) return 1;
 
131
    if ( diff ("/etc/passwd", "/etc/motd") == 0 ) return 2;
 
132
 
 
133
    char * s = strdup("jolly old jolly old time...");
 
134
    char ** sp = &s;
 
135
    if ( strcmp ( replace_string ( sp, "old", "new"), "jolly new jolly new time..." ) ) return 3;
 
136
    if ( run ( "ls", "/", "/etc", ">/dev/null", NULL ) ) return 4;
 
137
 
 
138
    /* testing the semaphores */
 
139
    test_sem_fork ();
 
140
    test_sem_pthreads ();
 
141
 
 
142
    return 0;
 
143
}