Skip to content
Snippets Groups Projects
mutest2.c 1.14 KiB
#include "kernel/types.h"
#include "kernel/fcntl.h"
#include "user/user.h"

char fname[] = "moncompteur";

#define MAXLEN 20

int freadint(){
  int res = -1;
  char buf[MAXLEN];
  int fd = open(fname, O_RDONLY);
  if(read(fd, buf, MAXLEN) > 0){
    res = atoi(buf);
  }
  close(fd);
  return res;
}

void fwriteint(int i){
  int fd = open(fname, O_CREATE | O_RDWR);
  fprintf(fd, "%d\n", i);
  close(fd);
}

#define NITER 100

void inc(int mut){
  for(int i = 0; i < NITER; i++){
    acquire_mutex(mut);
    int val = freadint();
    fwriteint(val+1);
    release_mutex(mut);
  }
}

void dec(int mut){
  for(int i = 0; i < NITER; i++){
    acquire_mutex(mut);
    int val = freadint();
    fwriteint(val-1);
    release_mutex(mut);
  }
}


int main(){
  fwriteint(100);
  int mut = create_mutex();
  int pid = fork();
  if(pid < 0){
    printf("error fork\n");
    exit(1);
  } else if (pid == 0){
    inc(mut);
    exit(0);
  } else {
    pid = fork();
    if(pid < 0){
      printf("error fork\n");
      exit(1);
    } else if (pid == 0){
      dec(mut);
      exit(0);
    }
    wait(0);
    wait(0);
    printf("Result = %d\n", freadint());
    exit(0);
  }
}