git @ Cat's Eye Technologies Bhuna / master eg / prodcons.bhu
master

Tree @master (Download .tar.gz)

prodcons.bhu @masterraw · history · blame

Producer = ^ N, NP, Main {
  if N = 0 {
    // Print "Producer done w/", NP, EoL
    Send Main, [Self(), NP]
  } else {
    Msg = Recv(1000)
    // Print "Producing ", NP, EoL
    Send Msg[1], [data, NP]
    Producer N - 1, NP + 1, Main
  }
}

Consumer = ^ N, NC, P, Main {
  if N = 0 {
    // Print "Consumer done w/", NC, EoL
    Send Main, [Self(), NC]
  } else {
    // Print "Consumer wanting next", EoL
    Send P, [Self(), next]
    // Print "Consuming...", EoL
    Msg = Recv(1000)
    // Print "Consumer got ", Msg, EoL
    Consumer N - 1, NC + 1, P, Main
  }
}

N = 100000
Main = Self()
P = Spawn(^{ Producer N, 0, Main })
C = Spawn(^{ Consumer N, 0, P, Main })

NP = 0
NC = 0

while NP = 0 | NC = 0 {
  Msg = Recv(1000)
  if Msg[1] = P { NP = Msg[2] }
  if Msg[1] = C { NC = Msg[2] }
}

Print NP, " ", NC, EoL