📄 smobjlib.c
字号:
/* smObjLib.c - shared memory objects library (VxMP Option) *//* Copyright 1984-1999 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01p,16mar99,dat fixed declaration of smUtilTasClearRtn. (SPR 25804)01o,14mar99,jdi doc: removed refs to config.h and/or configAll.h (SPR 25663).01n,22feb99,wsl DOC: removed all reference to spurious error code.01l,05may93,caf tweaked for ansi.01l,17mar94,pme Added WindView level 2 event logging. Added comments about acknowledge of BUS interrupts (SPR# 2560).01k,13mar93,jdi code style fix for mangen.01j,14feb93,jdi documentation cleanup for 5.1.01i,29jan93,pme added little endian support. added smObjLibInit() manual. Made smObjLibInit() return ERROR if already initialized. suppressed ntohl() macros in smObjCpuInfoGet(). aligned partition addresses.01h,08dec92,jdi documentation cleanup.01g,02oct92,pme added SPARC support. documentation cleanup.01f,29sep92,pme fixed bug in smObjInit (objCpuTbl was not converted to local value in pSmObjHdr). Added version number. comments cleanup. set PART_OVH to 32 bytes.01e,23aug92,jcf cleanup.01d,30jul92,pme added SM_OBJ_SIZE(), cleaned up smObjSetup. changed parameter to smObjBeat. added smObjTasClearRoutine for use with smLockGive(). added shared memory layout chart.01c,24jul92,elh changed parameters to smIsAlive.01b,24jul92,gae fixed number of parameters to logMsg().01a,07feb92,pme written.*//*DESCRIPTIONThis library contains miscellaneous functions used by the shared memoryobjects facility. Shared memory objects provide high-speed synchronizationand communication among tasks running on separate CPUs that have accessto common shared memory. Shared memory objects are system objects (e.g.,semaphores and message queues) that can be used across processors.The main uses of shared memory objects are interprocessor synchronization,mutual exclusion on multiprocessor shared data structures, and high-speeddata exchange.Routines for displaying shared memory objects statistics are provided by smObjShow.SHARED MEMORY MASTER CPUOne CPU node acts as the shared memory objects master. This CPUinitializes the shared memory area and sets up the shared memory anchor.These steps are performed by the master calling smObjSetup(). Thisroutine should be called only once by the master CPU. Usually smObjSetup()is called from usrSmObjInit() (see "Configuration" below.)Once smObjSetup() has completed successfully, there is little functionaldifference between the master CPU and other CPUs using shared memory objects,except that the master is responsible for maintaining the heartbeat inthe shared memory header.ATTACHING TO SHARED MEMORYEach CPU, master or non-master, that will use shared memory objectsmust attach itself to the shared memory objects facility, whichmust already be initialized.Before it can attach to a shared memory region, each CPU must allocateand initialize a shared memory descriptor (SM_DESC), which describes theindividual CPU's attachment to the shared memory objects facility. Sincethe shared memory descriptor is used only by the local CPU, it is notnecessary for the descriptor itself to be located in shared memory. Infact, it is preferable for the descriptor to be allocated from the CPU'slocal memory, since local memory is usually more efficiently accessed.The shared memory descriptor is initialized by calling smObjInit(). Thisroutine takes a number of parameters which specify the characteristics ofthe calling CPU and its access to shared memory.Once the shared memory descriptor has been initialized, the CPU canattach itself to the shared memory region. This is done by callingsmObjAttach().When smObjAttach() is called, it verifies that the shared memory anchorcontains the value SM_READY and that the heartbeat located in the sharedmemory objects header is incrementing. If either of these conditions isnot met, the routine will check periodically until either SM_READY or anincrementing heartbeat is recognized or a time limit is reached. Thelimit is expressed in seconds, and 600 seconds (10 minutes) is thedefault. If the time limit is reached before SM_READY or a heartbeat isfound, ERROR is returned and `errno' is set to S_smLib_DOWN.ADDRESS CONVERSIONThis library also provides routines for converting between local andglobal shared memory addresses, smObjLocalToGlobal() andsmObjGlobalToLocal(). A local shared memory address is the addressrequired by the local CPU to reach a location in shared memory. A globalshared memory address is a value common to all CPUs in the system used toreference a shared memory location. A global shared memory address isalways an offset from the shared memory anchor.SPIN-LOCK MECHANISMThe shared memory objects facilities use a spin-lock mechanism based on anindivisible read-modify-write (RMW) which acts as a low-level mutual exclusiondevice. The spin-lock mechanism is called with a system-wide parameter,SM_OBJ_MAX_TRIES, defined in configAll.h, which specifies the maximumnumber of RMW tries on a spin-lock location.This parameter is set to 100 by default, but must be set to a higher valueas the number of CPUs increases or when high-speed processors are used.Care must be taken that the number of RMW tries on a spin-lock on aparticular CPU never reaches SM_OBJ_MAX_TRIES, otherwise systembehavior becomes unpredictable.The routine smObjTimeoutLogEnable() can be used to enable or disable theprinting of a message should a shared memory object call fail while tryingto take a spin-lock.RELATION TO BACKPLANE DRIVERShared memory objects and the shared memory network (backplane) driver use common underlying shared memory utilities. They also use the same anchor, the same shared memory header, and the same interrupt when they are used atthe same time.LIMITATIONSA maximum of twenty CPUs can be used concurrently with shared memoryobjects. Each CPU in the system must have a hardware test-and-setmechanism, which is called via the system-dependent routine sysBusTas().The use of shared memory objects raises interrupt latency, because internalmechanisms lock interrupts while manipulating critical shared datastructures. Interrupt latency does not depend on the number of objects orCPUs used.GETTING STATUS INFORMATIONThe routine smObjShow() displays useful information regarding the currentstatus of shared memory objects, including the number of tasks usingshared objects, shared semaphores, and shared message queues, the numberof names in the database, and also the maximum number of tries to getspin-lock access for the calling CPU.INTERNALRoutine structure smObjSetup smObjLocalToGlobal smObjGlobalToLocal smObjAttach smObjInit / \ / | | smSetup ------------------------ smAttach | smInit / \ | smMemPartInit smNameInit | | | | smObjEventSend-* smObjNotifyHandler-* | / | | / | | / \ smObjCpuInfoGet / smObjEventProcess | smObjTcbInit | ------------- -------- |smUtilIntGen \/ smUtilIntConnect | smDllConcat * * (o) | | | SM_OBJ_LOCK_TAKE SM_OBJ_LOCK_GIVE smMemPartAllocMemory layout Shared Memory Shared Memory Shared Memory Anchor Descriptor CPU Descriptors (SM_ANCHOR) (SM_HDR) (SM_CPU_DESC)-------------- ----->-------------- ------>--------------|readyValue | | | tasType | | | status || . | | | maxCpus | | | intType ||smHeader |---- | cpuTable |---- | intArg1 | CPU 0 | . | | . | | intArg2 | descriptor| . | | . | | intArg3 ||smPktHeader |---- | . | |------------|| . | | | . | | . | CPU 1|smObjHeader |-- | -------------- |------------|| . | | | | || . | | | ~ ~| . | | | | | CPU n-------------- | | -------------- | | Shared Memory Packet | | Memory Header | | (SM_PKT_MEM_HDR) | ----->-------------- Free Packets | | heartBeat | ---->------------- | | freeList |------------------------| | | | | pktCpuTbl |---- | | | | maxPktBytes| | | | | | . | | | | | -------------- | | | | | | | | | per CPU | | | | Packet Descriptor | | | | (SM_PKT_CPU_DESC) ------------- | ------>---------------- | | status | CPU 0 | | inputList | Packet Desc | | freeList | | |--------------| | | . | CPU 1 | | . | | |--------------| | | | | ~ ~ | | | CPU n | | | | ---------------- | Shared memory per CPU | objects header sm Objects Desc | (SM_OBJ_MEM_HDR) (SM_OBJ_CPU_DESC) ------->-------------- ------>---------------- | heartBeat | | | status | CPU 0 | initDone | | | smObjEventQ | Object Desc | Partitions | | |--------------| | . | | | . | CPU 1 | Name DTB | | | . | | objCpuTbl |---- |--------------| | . | | | | max values | | | | . | ~ ~ | statistics | | | CPU n -------------- ---------------- CONFIGURATIONWhen the configuration macro INCLUDE_SM_OBJ is defined, the init and setuproutines in this library are called automatically by usrSmObjInit() fromthe root task, usrRoot(), in usrConfig.c.AVAILABILITYThis module is distributed as a component of the unbundled shared memoryobjects support option, VxMP.INCLUDE FILES: smObjLib.hSEE ALSO: smObjShow, semSmLib, msgQSmLib, smMemLib, smNameLib, usrSmObjInit(),.pG "Shared Memory Objects"*//* includes */#include "vxWorks.h"#include "errno.h"#include "intLib.h"#include "logLib.h"#include "qFifoGLib.h"#include "smDllLib.h"#include "smLib.h"#include "smUtilLib.h"#include "semLib.h"#include "string.h"#include "stdlib.h"#include "sysLib.h"#include "wdLib.h"#include "private/smNameLibP.h"#include "private/smMemLibP.h"#include "private/smObjLibP.h"#include "private/smFixBlkLibP.h"#include "private/msgQSmLibP.h"#include "private/windLibP.h"#include "private/workQLibP.h"#include "private/funcBindP.h"#include "private/eventP.h"/* defines */#define PART_OVH 32 /* bytes overhead per partition */#define SM_OBJ_VERSION 1 /* version number *//* macro to calculate the size of a shared memory allocated object */#define SM_OBJ_SIZE(type) (ROUND_UP (sizeof (type), SM_ALIGN_BOUNDARY) \ + sizeof (SM_BLOCK_HDR))/* typedefs *//* cached CPU Information Structure */typedef struct sm_obj_cpu_info /* SM_OBJ_CPU_INFO */ { BOOL cached; /* TRUE if info for this CPU is cached */ SM_CPU_DESC smCpuDesc; /* cpu notification info */ SM_OBJ_EVENT_Q * pCpuEventQ;/* pointer to cpu event queue */ } SM_OBJ_CPU_INFO;/* globals */SM_HDR * pSmHdr; /* pointer to shared memory header */SM_OBJ_MEM_HDR * pSmObjHdr; /* pointer to shared memory objects header */SM_OBJ_DESC smObjDesc; /* shared memory object descriptor */FUNCPTR smObjTasRoutine; /* test and set routine */FUNCPTR smObjTasClearRoutine; /* clear routine */int smObjSpinTries; /* maximum # of tries to obtain lock access */int smObjProcNum; /* processor number */BOOL smObjTimeoutLog; /* TRUE : print message if lock take fails */int smObjInitialized = FALSE; /* smObj facility not initialized */SM_FIX_BLK_PART_ID smTcbPartId; /* shared TCB partition id *//* locals */LOCAL SM_DL_LIST eventList; /* event list to be processed */LOCAL SM_OBJ_EVENT_Q * pLocalEventQ; /* cached local event Q pointer */LOCAL SM_OBJ_CPU_INFO smObjCpuInfoTbl [SM_OBJ_MAX_CPU]; /* smObj cpu info table */ LOCAL int smObjHeartBeatRate; /* heartbeat incrementing rate */LOCAL WDOG_ID smObjWdog; /* watch dog for heartbeat *//* forward */LOCAL STATUS smObjNotifyHandler ();LOCAL STATUS smObjCpuInfoGet (SM_OBJ_DESC * pSmObjDesc, int cpuNum, SM_OBJ_CPU_INFO * pSmObjCpuInfo);LOCAL void smObjBeat (UINT * pHeartBeat); extern VOIDFUNCPTR smUtilTasClearRtn;/********************************************************************************* smObjLibInit - install the shared memory objects facility (VxMP Option)** This routine installs the shared memory objects facility. It is called* automatically when the configuration macro INCLUDE_SM_OBJ is defined.** AVAILABILITY* This routine is distributed as a component of the unbundled shared memory* objects support option, VxMP.* * RETURNS: OK, or ERROR if the shared memory objects facility has already been* installed. */STATUS smObjLibInit (void) { if (!smObjInitialized) { semSmLibInit (); /* initialize shared semaphore facility */ msgQSmLibInit (); /* initialize shared message queue facility */ smMemPartLibInit (); /* initialize shared memory manager facility */ smObjInitialized = TRUE; return (OK); } return (ERROR); }/********************************************************************************* smObjSetup - initialize the shared memory objects facility (VxMP Option)** This routine initializes the shared memory objects facility by filling the* shared memory header. It must be called only once by the shared memory* master CPU (processor number 0). It is called automatically only by the * master CPU, when the configuration macro INCLUDE_SM_OBJ is defined.** Any CPU on the system backplane can use the shared memory objects facility;* however, the facility must first be initialized on the master CPU. Then* before other CPUs are attached to the shared memory area by smObjAttach(), * each must initialize its own shared memory objects descriptor using* smObjInit(). This mechanism is similar to the one used by the shared memory* network driver.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -