public:
   Throttle(int64_t m = 0) : count(0), max(m), waiting(0),
-                         lock("Throttle::lock") {}
+                         lock("Throttle::lock") {
+    assert(m >= 0);
+}
 
 private:
   void _reset_max(int64_t m) {
 
   bool wait(int64_t m = 0) {
     Mutex::Locker l(lock);
-    if (m)
+    if (m) {
+      assert(m > 0);
       _reset_max(m);
+    }
     return _wait(0);
   }
 
   int64_t take(int64_t c = 1) {
+    assert(c > 0);
     Mutex::Locker l(lock);
     count += c;
     return count;
   }
 
   bool get(int64_t c = 1, int64_t m = 0) {
+    assert(c > 0);
     Mutex::Locker l(lock);
-    if (m)
+    if (m) {
+      assert(m > 0);
       _reset_max(m);
+    }
     bool waited = _wait(c);
     count += c;
     return waited;
   }
 
   int64_t put(int64_t c = 1) {
+    assert(c > 0);
     Mutex::Locker l(lock);
     cond.SignalOne();
     count -= c;