/* * P2PFaaS - A framework for FaaS Load Balancing * Copyright (c) 2019 - 2022. Gabriele Proietti Mattia * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package utils /* * From http://www.golangpatterns.info/concurrency/semaphores */ type empty struct{} type Semaphore chan empty // P acquires n resources func (s Semaphore) P(n int) { e := empty{} for i := 0; i < n; i++ { s <- e } } // V releases n resources func (s Semaphore) V(n int) { for i := 0; i < n; i++ { <-s } } /* mutexes */ func (s Semaphore) Lock() { s.P(1) } func (s Semaphore) Unlock() { s.V(1) } /* signal-wait */ func (s Semaphore) Signal() { s.V(1) } func (s Semaphore) Wait(n int) { s.P(n) }