home *** CD-ROM | disk | FTP | other *** search
/ Really Useful CD 1 / ReallyUsefulCD1.iso / extras / languages / smalltalk / _smalltalk / tests / phil < prev    next >
Encoding:
Text File  |  1987-12-30  |  1.9 KB  |  75 lines

  1. Class  Main
  2. [
  3.      main
  4.           ( DiningPhilosophers new: 5 ) dine: 4
  5. ]
  6.  
  7. Class  DiningPhilosophers
  8. | diners  forks  philosophers |
  9. [
  10.      new: aNumber
  11.          diners <- aNumber.
  12.          forks <- Array new: aNumber.
  13.          philosophers <- Array new: aNumber.
  14.          (1 to: diners) do:
  15.           [ :p | forks at: p put: (Semaphore new: 1).
  16.                  philosophers at: p put: (Philosopher new: p)]
  17.  
  18. |
  19.      dine: time
  20.          (1 to: diners) do:
  21.           [ :p | (philosophers at: p)
  22.                    leftFork: (forks at: p)
  23.                    rightFork: (forks at: ((p \\ diners) + 1))].
  24.          time timesRepeat:
  25.           [(1 to: diners) do: [ :p | (philosophers at: p) philosophize]].
  26.          (1 to: diners) do:
  27.           [ :p | (philosophers at: p) sleep]
  28. ]
  29.  
  30. Class  Philosopher
  31. | leftFork  rightFork  myName  myPhilosophy |
  32. [
  33.      new:  name
  34.          myName <- name.
  35.          myPhilosophy <- [[true] whileTrue:
  36.                     [self think.
  37.                      self getForks.
  38.                      self eat.
  39.                      self releaseForks.
  40.                      selfProcess suspend]
  41.                    ] newProcess
  42.  
  43. |
  44.      leftFork: lfork  rightFork: rfork
  45.          leftFork <- lfork.
  46.          rightFork <- rfork
  47. |
  48.      getForks
  49.          ((myName \\ 2) == 0)
  50.           ifTrue: [leftFork wait.  rightFork wait]
  51.           ifFalse: [rightFork wait.  leftFork wait]
  52. |
  53.      releaseForks
  54.          leftFork signal.
  55.          rightFork signal
  56.  
  57. |
  58.      think
  59.          ('Philosopher ',(myName asString),' is thinking.') print.
  60.          10 timesRepeat: [selfProcess yield]
  61. |
  62.      eat
  63.          ('Philosopher ',(myName asString),' is eating.') print.
  64.          10 timesRepeat: [selfProcess yield]
  65.  
  66. |
  67.      philosophize
  68.          myPhilosophy resume
  69. |
  70.      sleep
  71.          myPhilosophy terminate.
  72.          ('Philosopher ',(myName asString),' is sleeping.') print.
  73.          myPhilosophy <- nil
  74. ]
  75.