platform.h
来自「lustre 1.6.5 source code」· C头文件 代码 · 共 249 行
H
249 行
/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * * Copyright (C) 2002 Cluster File Systems, Inc. * * This file is part of Lustre, http://www.lustre.org. * * Lustre is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * Lustre 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 Lustre; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */#ifndef __LUSTRE_UTILS_PLATFORM_H#define __LUSTRE_UTILS_PLATFORM_H#ifdef __linux__#ifdef HAVE_LIBREADLINE#define READLINE_LIBRARY#include <readline/readline.h>/* completion_matches() is #if 0-ed out in modern glibc */#ifndef completion_matches# define completion_matches rl_completion_matches#endifextern void using_history(void);extern void stifle_history(int);extern void add_history(char *);#endif /* HAVE_LIBREADLINE */#include <errno.h>#include <string.h>#if HAVE_LIBPTHREAD#include <sys/ipc.h>#include <sys/shm.h>#include <pthread.h>typedef pthread_mutex_t l_mutex_t;typedef pthread_cond_t l_cond_t;#define l_mutex_init(s) pthread_mutex_init(s, NULL)#define l_mutex_lock(s) pthread_mutex_lock(s)#define l_mutex_unlock(s) pthread_mutex_unlock(s)#define l_cond_init(c) pthread_cond_init(c, NULL)#define l_cond_broadcast(c) pthread_cond_broadcast(c)#define l_cond_wait(c, s) pthread_cond_wait(c, s)#endif#elif __APPLE__#ifdef HAVE_LIBREADLINE#define READLINE_LIBRARY#include <readline/readline.h>typedef VFunction rl_vintfunc_t;typedef VFunction rl_voidfunc_t;#endif /* HAVE_LIBREADLINE */#include <stdlib.h>#include <errno.h>#include <sys/types.h>#include <fcntl.h>#include <stdio.h>#include <sys/shm.h>#include <sys/semaphore.h>/* * POSIX compliant inter-process synchronization aren't supported well * in Darwin, pthread_mutex_t and pthread_cond_t can only work as * inter-thread synchronization, they wouldn't work even being put in * shared memory for multi-process. PTHREAD_PROCESS_SHARED is not * supported by Darwin also (pthread_mutexattr_setpshared() with the * PTHREAD_PROCESS_SHARED attribute will return EINVAL). * * The only inter-process sychronization mechanism can be used in Darwin * is POSIX NAMED semaphores and file lock, here we use NAMED semaphore * to implement mutex and condition. * * XXX Liang: * They are just proto-type now, more tests are needed. */#define L_LOCK_DEBUG (0) #define L_SEM_NAMESIZE 32typedef struct { sem_t *s_sem;#if L_LOCK_DEBUG char s_name[L_SEM_NAMESIZE];#endif} l_sem_t;typedef l_sem_t l_mutex_t;typedef struct { l_mutex_t c_guard; int c_count; l_sem_t c_waiter;} l_cond_t;static inline int l_sem_init(l_sem_t *sem, int val){ char *s_name;#if L_LOCK_DEBUG s_name = sem->s_name;#else char buf[L_SEM_NAMESIZE]; s_name = buf;#endif /* get an unique name for named semaphore */ snprintf(s_name, L_SEM_NAMESIZE, "%d-%p", (int)getpid(), sem); sem->s_sem = sem_open(s_name, O_CREAT, 0600, val); if ((int)sem->s_sem == SEM_FAILED) { fprintf(stderr, "lock %s creating fail: %d, %d!\n", s_name, (int)sem->s_sem, errno); return -1; } else {#if L_LOCK_DEBUG printf("open lock: %s\n", s_name);#endif } return 0;}static inline void l_sem_done(l_sem_t *sem){#if L_LOCK_DEBUG printf("close lock: %s.\n", sem->s_name);#endif sem_close(sem->s_sem);}static inline void l_sem_down(l_sem_t *sem){#if L_LOCK_DEBUG printf("sem down :%s\n", sem->s_name);#endif sem_wait(sem->s_sem);}static inline void l_sem_up(l_sem_t *sem){#if L_LOCK_DEBUG printf("sem up :%s\n", sem->s_name);#endif sem_post(sem->s_sem);}static inline void l_mutex_init(l_mutex_t *mutex){ l_sem_init((l_sem_t *)mutex, 1);}static inline void l_mutex_init_locked(l_mutex_t *mutex){ l_sem_init((l_sem_t *)mutex, 0);}static inline void l_mutex_done(l_mutex_t *mutex){ l_sem_done((l_sem_t *)mutex);}static inline void l_mutex_lock(l_mutex_t *mutex){#if L_LOCK_DEBUG printf("lock mutex :%s\n", mutex->s_name);#endif sem_wait(mutex->s_sem);}static inline void l_mutex_unlock(l_mutex_t *mutex){#if L_LOCK_DEBUG printf("unlock mutex: %s\n", mutex->s_name);#endif sem_post(mutex->s_sem);}static inline void l_cond_init(l_cond_t *cond){ l_mutex_init(&cond->c_guard); l_sem_init(&cond->c_waiter, 0); cond->c_count = 0;}static inline void l_cond_done(l_cond_t *cond){ if (cond->c_count != 0) fprintf(stderr, "your waiter list is not empty: %d!\n", cond->c_count); l_mutex_done(&cond->c_guard); l_sem_done(&cond->c_waiter);}static inline void l_cond_wait(l_cond_t *cond, l_mutex_t *lock){ l_mutex_lock(&cond->c_guard); cond->c_count --; l_mutex_unlock(&cond->c_guard); l_mutex_unlock(lock); l_sem_down(&cond->c_waiter); l_mutex_lock(lock);}static inline void l_cond_broadcast(l_cond_t *cond){ l_mutex_lock(&cond->c_guard); while (cond->c_count < 0) { l_sem_up(&cond->c_waiter); cond->c_count ++; } l_mutex_unlock(&cond->c_guard);}#else /* other platform */#ifdef HAVE_LIBREADLINE#define READLINE_LIBRARY#include <readline/readline.h>#endif /* HAVE_LIBREADLINE */#include <errno.h>#include <string.h>#if HAVE_LIBPTHREAD#include <sys/ipc.h>#include <sys/shm.h>#include <pthread.h>typedef pthread_mutex_t l_mutex_t;typedef pthread_cond_t l_cond_t;#define l_mutex_init(s) pthread_mutex_init(s, NULL)#define l_mutex_lock(s) pthread_mutex_lock(s)#define l_mutex_unlock(s) pthread_mutex_unlock(s)#define l_cond_init(c) pthread_cond_init(c, NULL)#define l_cond_broadcast(c) pthread_cond_broadcast(c)#define l_cond_wait(c, s) pthread_cond_wait(c, s)#endif /* HAVE_LIBPTHREAD */#endif /* __linux__ */#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?