Puede ser que precises un contador para saber cuando cambiar la variable hasCapacity a true.
Para hacer el V podés intentar hacer algo parecido pero evaluando la variable contador.
Me parece que está bien ese orden porque sino como es una zona crítica ese semáforo se tiene que inicializar en 1, entonces si no deja el recurso antes de bloquearse, nadie más puede entrar a la zona crítica porque la tiene retenida el proceso y se forma deadlock, el V que podría despertarlo precisa un recurso que tiene el P retenido.
Saludos