mirror of
https://github.com/neocturne/fastd.git
synced 2025-05-15 04:35:08 +02:00
Encapsulate semaphore handling
This commit is contained in:
parent
96a291d11f
commit
4f25bdd259
4 changed files with 65 additions and 8 deletions
|
@ -537,8 +537,7 @@ static inline void init(int argc, char *argv[]) {
|
|||
VECTOR_ALLOC(ctx.async_pids, 0);
|
||||
|
||||
#ifdef WITH_VERIFY
|
||||
if (sem_init(&ctx.verify_limit, 0, VERIFY_LIMIT))
|
||||
exit_errno("sem_init");
|
||||
fastd_sem_init(&ctx.verify_limit, VERIFY_LIMIT);
|
||||
#endif
|
||||
|
||||
if (pthread_attr_init(&ctx.detached_thread))
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include "dlist.h"
|
||||
#include "buffer.h"
|
||||
#include "log.h"
|
||||
#include "sem.h"
|
||||
#include "shell.h"
|
||||
#include "vector.h"
|
||||
|
||||
|
@ -244,7 +245,7 @@ struct fastd_context {
|
|||
uint64_t next_peer_id; /**< An monotonously increasing ID peers are identified with in some components */
|
||||
VECTOR(fastd_peer_t*) peers; /**< The currectly active peers */
|
||||
#ifdef WITH_VERIFY
|
||||
sem_t verify_limit; /**< Keeps track of the number of verifier threads */
|
||||
fastd_sem_t verify_limit; /**< Keeps track of the number of verifier threads */
|
||||
#endif
|
||||
|
||||
#ifdef USE_EPOLL
|
||||
|
|
59
src/sem.h
Normal file
59
src/sem.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
Copyright (c) 2012-2014, Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
\file
|
||||
|
||||
Portable semapores
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "log.h"
|
||||
|
||||
#include <semaphore.h>
|
||||
|
||||
|
||||
/** Generic semaphore type */
|
||||
typedef sem_t fastd_sem_t;
|
||||
|
||||
|
||||
/** Initializes a semaphore with a given value */
|
||||
static inline void fastd_sem_init(fastd_sem_t *sem, unsigned value) {
|
||||
if (sem_init(sem, 0, value))
|
||||
exit_errno("sem_init");
|
||||
}
|
||||
|
||||
/** Increments the semaphore */
|
||||
static inline void fastd_sem_post(fastd_sem_t *sem) {
|
||||
if (sem_post(sem))
|
||||
exit_errno("sem_post");
|
||||
}
|
||||
|
||||
/** Tries to decrement the semaphore */
|
||||
static inline bool fastd_sem_trywait(fastd_sem_t *sem) {
|
||||
return !sem_trywait(sem);
|
||||
}
|
|
@ -82,8 +82,7 @@ static void * do_verify_thread(void *p) {
|
|||
|
||||
free(arg);
|
||||
|
||||
if (sem_post(&ctx.verify_limit))
|
||||
exit_errno("sem_post");
|
||||
fastd_sem_post(&ctx.verify_limit);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -110,7 +109,7 @@ fastd_tristate_t fastd_verify_peer(fastd_peer_t *peer, fastd_socket_t *sock, con
|
|||
return ret ? fastd_tristate_true : fastd_tristate_false;
|
||||
}
|
||||
else {
|
||||
if (sem_trywait(&ctx.verify_limit)) {
|
||||
if (!fastd_sem_trywait(&ctx.verify_limit)) {
|
||||
pr_debug("maximum number of verification processes reached");
|
||||
return fastd_tristate_false;
|
||||
}
|
||||
|
@ -131,8 +130,7 @@ fastd_tristate_t fastd_verify_peer(fastd_peer_t *peer, fastd_socket_t *sock, con
|
|||
if ((errno = pthread_create(&thread, &ctx.detached_thread, do_verify_thread, arg)) != 0) {
|
||||
pr_error_errno("unable to create verify thread");
|
||||
|
||||
if (sem_post(&ctx.verify_limit))
|
||||
exit_errno("sem_post");
|
||||
fastd_sem_post(&ctx.verify_limit);
|
||||
|
||||
fastd_shell_env_free(env);
|
||||
free(arg);
|
||||
|
|
Loading…
Add table
Reference in a new issue