typedef struct {
  Lock *lock;
  int counter;
} Lightswitch;

Lightswitch *make_lightswitch ()
{
  Lightswitch *lightswitch = (Lightswitch *) mymalloc (sizeof(Lightswitch));
  lightswitch->lock = make_lock();
  lightswitch->counter = 0;
  return lightswitch;
}

void lightswitch_acquire (Lightswitch *lightswitch, Lock *lock)
{
  lock_acquire (lightswitch->lock);
  if (lightswitch->counter == 0) {
    lock_acquire(lock);
  }
  lightswitch->counter++;
  lock_release (lightswitch->lock);
}

void lightswitch_release (Lightswitch *lightswitch, Lock *lock)
{
  lock_acquire (lightswitch->lock);
  lightswitch->counter--;
  if (lightswitch->counter == 0) {
    lock_release(lock);
  }
  lock_release (lightswitch->lock);
}


