14 #define DONE_SEM 0 // index of the semaphore on which to wait for children
17 #define HOME "/home/julia/coccinelle/tools/distributed/"
22 void inc_sem(int sem
, int sem_num
, int inc
) {
24 sops
.sem_num
= sem_num
;
30 void dec_sem(int sem
, int sem_num
) {
32 sops
.sem_num
= sem_num
;
38 void wait_sem(int sem
, int sem_num
) {
41 sops
.sem_num
= sem_num
;
44 err
= semop(sem
,&sops
,1);
45 if (err
< 0) {printf("error in %d\n",sem
);perror("wait_sem");}
48 void exit_sighandler(int x
) {
49 semctl(sem
,DONE_SEM
,IPC_RMID
);
53 void do_child(int sem
, int id
, unsigned int argc
, char **argv
, int max
,
59 char **new_args
= malloc(sizeof(char*) * (argc
+ 5));
60 char string1
[50],string2
[50];
61 for(i
=1; i
!=argc
; i
++) {
62 new_args
[i
+4] = argv
[i
];
65 new_args
[0] = "nothing";
66 new_args
[1] = new_args
[5]; // cocci file must be first
67 new_args
[2] = "-index";
68 sprintf(string1
, "%d", id
);
69 new_args
[3] = string1
; // processor number must be third
71 sprintf(string2
, "%d", max
);
72 new_args
[5] = string2
;
73 execvp(script
,new_args
);
74 printf("tried to execute %s\n",HOME
"spatch_linux_script");
75 perror("exec failure");
79 dec_sem(sem
,DONE_SEM
); // indicate that this child is done
82 void cleanup(char **argv
) {
83 char **new_args
= malloc(sizeof(char*) * 3);
84 new_args
[0] = "nothing";
85 new_args
[1] = argv
[1];
87 printf ("doing cleanup on %s\n",argv
[1]);
88 execvp(HOME
"cleanup_script",new_args
);
91 int main(unsigned int argc
, char **argv
) {
92 int pid
, i
, start
=0, max
;
94 // initialize the semaphore
95 sem
= semget(0,1/* only one sem */,(IPC_CREAT
|0666));
96 if (sem
< 0) { perror("semget"); exit(0); }
97 // set up signal handlers so we can delete the semaphore
98 signal(SIGTERM
,exit_sighandler
); // kill
99 signal(SIGHUP
,exit_sighandler
); // kill -HUP / xterm closed
100 signal(SIGINT
,exit_sighandler
); // Interrupt from keyboard
101 signal(SIGQUIT
,exit_sighandler
); // Quit from keyboard
102 // interpret the arguments
104 if (!strcmp(argv
[1],"-processes")) {max
= atoi(argv
[2]); start
= 2;}
105 if (!strcmp(argv
[1],"-script")) {
107 strcat(script
,argv
[2]);
109 } else strcpy(script
,HOME
"spatch_linux_script");
110 if (!strcmp(argv
[1],"--help")) {
111 printf("spatch_linux [-processes n] foo.cocci ...\n");
117 // run the child processes
118 for(i
=0;i
!=max
;i
++) {
121 do_child(sem
,i
,argc
-start
,&argv
[start
],max
,script
);
126 wait_sem(sem
,DONE_SEM
); // wait for the children to end
127 int err
= semctl(sem
,DONE_SEM
,IPC_RMID
);
128 if (err
< 0) perror ("couldn't remove");
129 cleanup(&argv
[start
]);