mirror of
https://github.com/neocturne/fastd.git
synced 2025-05-15 12:45:09 +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);
|
VECTOR_ALLOC(ctx.async_pids, 0);
|
||||||
|
|
||||||
#ifdef WITH_VERIFY
|
#ifdef WITH_VERIFY
|
||||||
if (sem_init(&ctx.verify_limit, 0, VERIFY_LIMIT))
|
fastd_sem_init(&ctx.verify_limit, VERIFY_LIMIT);
|
||||||
exit_errno("sem_init");
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pthread_attr_init(&ctx.detached_thread))
|
if (pthread_attr_init(&ctx.detached_thread))
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "dlist.h"
|
#include "dlist.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "sem.h"
|
||||||
#include "shell.h"
|
#include "shell.h"
|
||||||
#include "vector.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 */
|
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 */
|
VECTOR(fastd_peer_t*) peers; /**< The currectly active peers */
|
||||||
#ifdef WITH_VERIFY
|
#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
|
#endif
|
||||||
|
|
||||||
#ifdef USE_EPOLL
|
#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);
|
free(arg);
|
||||||
|
|
||||||
if (sem_post(&ctx.verify_limit))
|
fastd_sem_post(&ctx.verify_limit);
|
||||||
exit_errno("sem_post");
|
|
||||||
|
|
||||||
return NULL;
|
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;
|
return ret ? fastd_tristate_true : fastd_tristate_false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (sem_trywait(&ctx.verify_limit)) {
|
if (!fastd_sem_trywait(&ctx.verify_limit)) {
|
||||||
pr_debug("maximum number of verification processes reached");
|
pr_debug("maximum number of verification processes reached");
|
||||||
return fastd_tristate_false;
|
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) {
|
if ((errno = pthread_create(&thread, &ctx.detached_thread, do_verify_thread, arg)) != 0) {
|
||||||
pr_error_errno("unable to create verify thread");
|
pr_error_errno("unable to create verify thread");
|
||||||
|
|
||||||
if (sem_post(&ctx.verify_limit))
|
fastd_sem_post(&ctx.verify_limit);
|
||||||
exit_errno("sem_post");
|
|
||||||
|
|
||||||
fastd_shell_env_free(env);
|
fastd_shell_env_free(env);
|
||||||
free(arg);
|
free(arg);
|
||||||
|
|
Loading…
Add table
Reference in a new issue