/*
* Copyright (c) 2020 YuQing <384681@qq.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the Lesser GNU General Public License, version 3
* or later ("LGPL"), as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the Lesser GNU General Public License
* along with this program. If not, see .
*/
#ifndef PTHREAD_FUNC_H
#define PTHREAD_FUNC_H
#include
#include
#include
#include
#include
#include
#include "common_define.h"
#include "logger.h"
#include "sched_thread.h"
#ifdef __cplusplus
extern "C" {
#endif
int init_pthread_lock(pthread_mutex_t *pthread_lock);
int init_pthread_attr(pthread_attr_t *pattr, const int stack_size);
int init_pthread_lock_cond_pair(pthread_lock_cond_pair_t *lcp);
void destroy_pthread_lock_cond_pair(pthread_lock_cond_pair_t *lcp);
#define PTHREAD_MUTEX_LOCK(lock) \
do { \
int lock_res; \
if ((lock_res=pthread_mutex_lock(lock)) != 0) \
{ \
logWarning("file: "__FILE__", line: %d, " \
"call pthread_mutex_lock fail, " \
"errno: %d, error info: %s", \
__LINE__, lock_res, STRERROR(lock_res)); \
} \
} while (0)
#define PTHREAD_MUTEX_UNLOCK(lock) \
do { \
int unlock_res; \
if ((unlock_res=pthread_mutex_unlock(lock)) != 0) \
{ \
logWarning("file: "__FILE__", line: %d, " \
"call pthread_mutex_unlock fail, " \
"errno: %d, error info: %s", \
__LINE__, unlock_res, STRERROR(unlock_res)); \
} \
} while (0)
#define lcp_timedwait_sec(lcp, timeout) \
fc_timedwait_sec(&(lcp)->lock, &(lcp)->cond, timeout)
#define lcp_timedwait_ms(lcp, timeout_ms) \
fc_timedwait_ms(&(lcp)->lock, &(lcp)->cond, timeout_ms)
static inline void fc_timedwait_sec(pthread_mutex_t *lock,
pthread_cond_t *cond, const int timeout)
{
struct timespec ts;
PTHREAD_MUTEX_LOCK(lock);
ts.tv_sec = get_current_time() + timeout;
ts.tv_nsec = 0;
pthread_cond_timedwait(cond, lock, &ts);
PTHREAD_MUTEX_UNLOCK(lock);
}
static inline void fc_timedwait_ms(pthread_mutex_t *lock,
pthread_cond_t *cond, const int timeout_ms)
{
struct timespec ts;
PTHREAD_MUTEX_LOCK(lock);
ts.tv_sec = get_current_time() + timeout_ms / 1000;
ts.tv_nsec = (timeout_ms % 1000) * (1000 * 1000);
pthread_cond_timedwait(cond, lock, &ts);
PTHREAD_MUTEX_UNLOCK(lock);
}
int create_work_threads(int *count, void *(*start_func)(void *),
void **args, pthread_t *tids, const int stack_size);
int create_work_threads_ex(int *count, void *(*start_func)(void *),
void *args, const int elment_size, pthread_t *tids,
const int stack_size);
int kill_work_threads(pthread_t *tids, const int count);
int fc_create_thread(pthread_t *tid, void *(*start_func)(void *),
void *args, const int stack_size);
#ifdef __cplusplus
}
#endif
#endif