(defn sleep
  "Sleep the entire thread, not just a single fiber."
  [n]
  (os/sleep (* 0.1 n)))

(defn work [lock n]
  (ev/acquire-lock lock)
  (print "working " n "...")
  (sleep n)
  (print "done working...")
  (ev/release-lock lock))

(defn reader
  [rwlock n]
  (ev/acquire-rlock rwlock)
  (print "reading " n "...")
  (sleep n)
  (print "done reading " n "...")
  (ev/release-rlock rwlock))

(defn writer
  [rwlock n]
  (ev/acquire-wlock rwlock)
  (print "writing " n "...")
  (sleep n)
  (print "done writing...")
  (ev/release-wlock rwlock))

(defn test-lock
  []
  (def lock (ev/lock))
  (for i 3 7
    (ev/spawn-thread
      (work lock i))))

(defn test-rwlock
  []
  (def rwlock (ev/rwlock))
  (for i 0 20
    (if (> 0.1 (math/random))
      (ev/spawn-thread (writer rwlock i))
      (ev/spawn-thread (reader rwlock i)))))

(test-rwlock)
(test-lock)