/[livstidsfanger]/trunk/livstidsfanger.c
ViewVC logotype

Diff of /trunk/livstidsfanger.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

  Revision 3 by trond, 2014-11-07T07:51:12Z
vs.
  Revision 4 by trond, 2014-11-07T07:56:17Z
*** trunk/livstidsfanger.c	2014/11/07 07:51:12	3
--- trunk/livstidsfanger.c	2014/11/07 07:56:17	4
***************
*** 14,20 ****
  #if __STDC_VERSION__ >= 201112L
  #include <stdnoreturn.h>
  #else
! #define noreturn /**/
  #endif
  
  #define ANTALL_LIVSTIDSFANGER 19U
--- 14,20 ----
  #if __STDC_VERSION__ >= 201112L
  #include <stdnoreturn.h>
  #else
! #define noreturn
  #endif
  
  #define ANTALL_LIVSTIDSFANGER 19U
***************
*** 26,43 ****
  
  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- 
- // Ingen må forandre på bryterne uten å ha låst mutex først.
  static unsigned brytere[2U];
  
  noreturn void *livstidsfange(void *arg);
  void visResultater(void);
  void signalhandler(int sig);
  
! noreturn int main (int argc, char **argv)
  {
    size_t i;
!   pthread_t tid = 0;
  
    atexit(visResultater);
    signal(SIGINT, signalhandler);
--- 26,41 ----
  
  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  static unsigned brytere[2U];
  
  noreturn void *livstidsfange(void *arg);
  void visResultater(void);
  void signalhandler(int sig);
  
! noreturn int main(int argc, char **argv)
  {
    size_t i;
!   pthread_t tid = pthread_self();
  
    atexit(visResultater);
    signal(SIGINT, signalhandler);
***************
*** 57,63 ****
    for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) {
      printf("maintråden oppretter livstidsfange %2zu\n", i + 1);
  
!     if ( ( errno = pthread_create(&tid, NULL, livstidsfange, (void *)i)) != 0) {
        fprintf(stderr,
                "%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n",
                argv[0], i, strerror(errno), errno);
--- 55,61 ----
    for (i = 0; i < ANTALL_LIVSTIDSFANGER; i++) {
      printf("maintråden oppretter livstidsfange %2zu\n", i + 1);
  
!     if ( (errno = pthread_create(&tid, NULL, livstidsfange, (void *)i)) != 0) {
        fprintf(stderr,
                "%s: pthread_create(&tid, NULL, livstidsfange, (void *)%2zu) = %s (%d)\n",
                argv[0], i, strerror(errno), errno);
***************
*** 113,119 ****
      if (i == tellendeLivstidsfange) {
        if (brytere[0] == 0U) {
          printf("livstidsfange %2zu ser at bryter 1 er nede og vipper opp bryter 1\n", i + 1);
! 	brytere[0] = 1U;
        } // if
        else {
          brytere[0] = !brytere[0];
--- 111,117 ----
      if (i == tellendeLivstidsfange) {
        if (brytere[0] == 0U) {
          printf("livstidsfange %2zu ser at bryter 1 er nede og vipper opp bryter 1\n", i + 1);
!         brytere[0] = 1U;
        } // if
        else {
          brytere[0] = !brytere[0];
***************
*** 127,133 ****
              printf("livstidsfange %2zu avslutter simuleringen\n", i + 1);
              exit(0);
            } // if
! 	} // if
  
          forrigeGangErGyldig = 1U;
          forrigeGang = brytere[0];
--- 125,131 ----
              printf("livstidsfange %2zu avslutter simuleringen\n", i + 1);
              exit(0);
            } // if
!         } // if
  
          forrigeGangErGyldig = 1U;
          forrigeGang = brytere[0];
***************
*** 149,170 ****
            printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == 1U ? "opp" : "ned");
  
            harVippetBryter1 = 1U;
! 	} // if
          else {
            brytere[1] = !brytere[1];
            printf("livstidsfange %2zu vipper %s bryter 2\n", i + 1, brytere[1] == 1U ? "opp" : "ned");
! 	} // else
        } // else
      } // else
  
!     // Signalere fengselsdirektøren (eller en vilkårlig livstidsfange).
      printf("livstidsfange %2zu låser opp mutex\n", i + 1);
      pthread_mutex_unlock(&mutex);
      printf("livstidsfange %2zu har låst opp mutex\n", i + 1);
- 
-     printf("livstidsfange %2zu signalerer de andre trådene\n", i + 1);
-     pthread_cond_signal(&cond);
-     printf("livstidsfange %2zu har gitt signal til de andre trådene\n", i + 1);
    } // while
  } // livstidsfange()
  
--- 147,164 ----
            printf("livstidsfange %2zu vipper %s bryter 1\n", i + 1, brytere[0] == 1U ? "opp" : "ned");
  
            harVippetBryter1 = 1U;
!         } // if
          else {
            brytere[1] = !brytere[1];
            printf("livstidsfange %2zu vipper %s bryter 2\n", i + 1, brytere[1] == 1U ? "opp" : "ned");
!         } // else
        } // else
      } // else
  
!     // Tusle ut av rommet.
      printf("livstidsfange %2zu låser opp mutex\n", i + 1);
      pthread_mutex_unlock(&mutex);
      printf("livstidsfange %2zu har låst opp mutex\n", i + 1);
    } // while
  } // livstidsfange()
  
***************
*** 191,198 ****
  void signalhandler(int sig)
  {
    if (sig == SIGINT) {
!     visResultater();
!     _exit(1);
    } // if
  } // signalhandler()
  
--- 185,191 ----
  void signalhandler(int sig)
  {
    if (sig == SIGINT) {
!     exit(1);
    } // if
  } // signalhandler()
  


 

svn@ximalas.info
ViewVC Help
Powered by ViewVC 1.3.0-beta1