oracle.go 886 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package fs
  2. import (
  3. "os"
  4. )
  5. type MailFileRequest struct {
  6. respCh chan MailFile
  7. }
  8. func NewMailFileRequest() MailFileRequest {
  9. ch := make(chan MailFile)
  10. return MailFileRequest{respCh: ch}
  11. }
  12. func (r MailFileRequest) Response() MailFile {
  13. return <-r.respCh
  14. }
  15. func NewOracle() chan MailFileRequest {
  16. r := realClock{}
  17. return newOracle(r)
  18. }
  19. func newOracle(c clock) chan MailFileRequest {
  20. reqCh := make(chan MailFileRequest, 10)
  21. go spawnOracle(reqCh, c)
  22. return reqCh
  23. }
  24. func spawnOracle(reqCh <-chan MailFileRequest, c clock) {
  25. count := 0
  26. C := c.Ticker().getC()
  27. pid := os.Getpid()
  28. hostname, err := os.Hostname()
  29. if err != nil {
  30. hostname = "MISSING"
  31. }
  32. for {
  33. select {
  34. case <-C:
  35. count = 0
  36. case req := <-reqCh:
  37. req.respCh <- MailFile{
  38. timestamp: c.Now(),
  39. progressive: count,
  40. pid: pid,
  41. hostname: hostname,
  42. }
  43. count += 1
  44. }
  45. }
  46. }