pprivate.h
来自「eCos操作系统源码」· C头文件 代码 · 共 272 行
H
272 行
#ifndef CYGONCE_PPRIVATE_H#define CYGONCE_PPRIVATE_H//=============================================================================//// pprivate.h//// POSIX types header////=============================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos 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 2 or (at your option) any later version.//// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): nickg// Contributors: nickg// Date: 2000-03-17// Purpose: POSIX private header// Description: This header contains various POSIX type definitions that are// shared between the various parts of the POSIX package.// // Usage: #include <pprivate.h>// ////####DESCRIPTIONEND####////=============================================================================#include <pkgconf/hal.h>#include <pkgconf/kernel.h>#include <pkgconf/posix.h>#include <stddef.h> // NULL, size_t#include <sys/types.h>#include <sched.h>#include <pthread.h>#include <errno.h> // error codes#include <signal.h> // sigset_t#include <limits.h> // PTHREAD_KEYS_MAX#include <cyg/posix/export.h> // POSIX exports header#include <cyg/kernel/thread.hxx> // thread definitions#include <cyg/kernel/mutex.hxx> // mutex definitions//=============================================================================// Constructor prioritization// Prioritization for POSIX library support objects#define CYGBLD_POSIX_INIT CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_COMPAT)// Prioritization for POSIX library startup initialization. This must// come after CYGBLD_POSIX_INIT constructors.#define CYGBLD_POSIX_START CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_COMPAT+5)//=============================================================================// Thread control data structure// Per-thread information needed by POSIX// This is pointed to by the CYGNUM_KERNEL_THREADS_DATA_POSIX entry of the// per-thread data.#ifdef CYGPKG_POSIX_PTHREADtypedef struct{ unsigned int state:4, // Thread state cancelstate:2, // Cancel state of thread canceltype:2, // Cancel type of thread cancelpending:1, // pending cancel flag freestack:1; // stack malloced, must be freed pthread_t id; // My thread ID Cyg_Thread *thread; // pointer to eCos thread object pthread_attr_t attr; // Current thread attributes void *retval; // return value void *(*start_routine)(void *); // start routine void *start_arg; // argument to start routine char name[20]; // name string for debugging Cyg_Condition_Variable *joiner; // joining threads wait here CYG_ADDRWORD stackmem; // base of stack memory area // only valid if freestack == true struct pthread_cleanup_buffer *cancelbuffer; // stack of cleanup buffers#ifdef CYGPKG_POSIX_SIGNALS sigset_t sigpending; // Set of pending signals sigset_t sigmask; // Thread's signal mask#endif // The following is space for the eCos thread object that underlies // this POSIX thread. It is allocated like this to avoid constructing // it on startup. cyg_uint8 thread_obj[sizeof(Cyg_Thread)]; // And the same for the joiner condition variable. cyg_uint8 joiner_obj[sizeof(Cyg_Condition_Variable)]; // Per-thread data table pointer void **thread_data; } pthread_info;// Values for the state field. These are solely concerned with the// states visible to POSIX. The thread's run state is stored in the// eCos thread object.// Note: numerical order here is important, do not rearrange.#define PTHREAD_STATE_FREE 0 // This structure is free for reuse#define PTHREAD_STATE_DETACHED 1 // The thread is running but detached#define PTHREAD_STATE_RUNNING 2 // The thread is running and will wait // to join when it exits#define PTHREAD_STATE_JOIN 3 // The thread has exited and is waiting // to be joined#define PTHREAD_STATE_EXITED 4 // The thread has exited and is ready to // be reaped#endif // ifdef CYGPKG_POSIX_PTHREAD//-----------------------------------------------------------------------------// Internal definitions// Handle entry to a pthread package function. #define PTHREAD_ENTRY() CYG_REPORT_FUNCTYPE( "returning %d" )// Handle entry to a pthread package function with no args. #define PTHREAD_ENTRY_VOID() CYG_REPORT_FUNCTION()// Do a pthread package defined return. This requires the error code to be// returned as the result of the function. This also gives us a place to// put any generic tidyup handling needed for things like signal delivery// and cancellation.#define PTHREAD_RETURN(err) \CYG_MACRO_START \ CYG_REPORT_RETVAL( err ); \ return err; \CYG_MACRO_END// A void variant of the above.#define PTHREAD_RETURN_VOID \CYG_MACRO_START \ CYG_REPORT_RETURN(); \ return; \CYG_MACRO_END// Check that a pointer passed in as an argument is valid and return// EINVAL if it is not. This should be used to check pointers that are// required to be valid. Pointers that may optionally be NULL should// be checked within the function.#define PTHREAD_CHECK(ptr) if( (ptr) == NULL ) PTHREAD_RETURN(EINVAL);#ifdef CYGPKG_POSIX_PTHREAD# define PTHREAD_TESTCANCEL() pthread_testcancel()#else# define PTHREAD_TESTCANCEL()#endif//-----------------------------------------------------------------------------// Priority translation.// eCos priorities run from 0 as the highest to 31 as the lowest. POSIX priorities// run in the opposite direction. The following macros translate between the two// priority ranges.#define PTHREAD_ECOS_PRIORITY(pri) (CYG_THREAD_MIN_PRIORITY-(pri))#define PTHREAD_POSIX_PRIORITY(pri) (CYG_THREAD_MIN_PRIORITY-(pri))//-----------------------------------------------------------------------------// Global data structures// Mutex for locking access to pthread_info structuresextern Cyg_Mutex pthread_mutex;//-----------------------------------------------------------------------------// Functions exported by pthread.cxx to the other parts of the POSIX subsystem.#ifdef CYGPKG_POSIX_PTHREADexternC void cyg_posix_pthread_start( void );externC pthread_info *pthread_self_info(void);externC pthread_info *pthread_info_id( pthread_t id );# ifdef CYGPKG_POSIX_SIGNALSexternC void cyg_posix_pthread_release_thread( sigset_t *mask );# endif#endif//-----------------------------------------------------------------------------// Functions exported by signal.cxx to the other parts of the POSIX subsystem.#ifdef CYGPKG_POSIX_SIGNALSexternC void cyg_posix_signal_start();externC void cyg_posix_signal_asr(pthread_info *self);externC cyg_bool cyg_sigqueue( const struct sigevent *sev, int code, pthread_info *thread = NULL );externC cyg_bool cyg_deliver_signals();externC void cyg_posix_signal_sigwait();externC void cyg_posix_thread_siginit( pthread_info *thread, pthread_info *parentthread );externC void cyg_posix_thread_sigdestroy( pthread_info *thread );#endif//-----------------------------------------------------------------------------// Functions exported by time.cxx to other parts of the POSIX subsystem.#ifdef CYGPKG_POSIX_CLOCKSexternC void cyg_posix_clock_start();externC cyg_tick_count cyg_timespec_to_ticks( const struct timespec *tp, cyg_bool roundup = false);externC void cyg_ticks_to_timespec( cyg_tick_count ticks, struct timespec *tp );#endif#ifdef CYGPKG_POSIX_TIMERSexternC void cyg_posix_timer_asr( pthread_info *self );#endif//-----------------------------------------------------------------------------// Functions exported by except.cxx#ifdef CYGPKG_POSIX_SIGNALSexternC void cyg_posix_exception_start();externC void cyg_pthread_exception_init(pthread_info *thread);externC void cyg_pthread_exception_destroy(pthread_info *thread);#endif//-----------------------------------------------------------------------------#endif // ifndef CYGONCE_PPRIVATE_H// End of pprivate.h
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?