smObjLib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* smObjLib.h - shared memory object library header */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,03may02,mas  made global pointers volatile (SPR 68334)
  7. 01k,01aug94,dvs  backed out pme's changes for reserved fields in main data structures.
  8. 01j,20mar94,pme  added reserved fields in main data structures to allow 
  9.  compatibility between future versions.
  10. 01i,29jan93,pme  added little endian support
  11.  made smObjLibInit() return STATUS.
  12. 01h,15oct92,rrr  silenced warnings
  13. 01g,29sep92,pme  added version number
  14. 01f,22sep92,rrr  added support for c++
  15. 01e,11sep92,ajm  moved redundant define of DEFAULT_BEATS_TO_WAIT to smLib.h
  16. 01d,30jul92,pme  made SM_LOCK_GIVE() call smLockGive().
  17.                  added pre-declaration of smObjTasClearRoutine.
  18. 01c,24jul92,elh  added heartbeat to header.
  19. 01b,22jul92,pme  added S_smObjLib_NO_OBJECT_DESTROY status
  20. 01a,19jul92,pme  added DEFAULT_BEATS_TO_WAIT.
  21.                  written.
  22. */
  23. #ifndef __INCsmObjLibh
  24. #define __INCsmObjLibh
  25. #ifdef __cplusplus
  26. extern "C" {
  27. #endif
  28. #include "vwModNum.h"
  29. #include "smDllLib.h"
  30. #include "smLib.h"
  31. #include "netinet/in.h"
  32. #include "private/smFixBlkLibP.h"
  33. #include "private/smMemLibP.h"
  34. #include "private/smNameLibP.h"
  35. /* generic status codes */
  36. #define S_smObjLib_NOT_INITIALIZED        (M_smObjLib | 1)
  37. #define S_smObjLib_NOT_A_GLOBAL_ADRS      (M_smObjLib | 2)
  38. #define S_smObjLib_NOT_A_LOCAL_ADRS       (M_smObjLib | 3)
  39. #define S_smObjLib_SHARED_MEM_TOO_SMALL   (M_smObjLib | 4)
  40. #define S_smObjLib_TOO_MANY_CPU           (M_smObjLib | 5)
  41. #define S_smObjLib_LOCK_TIMEOUT           (M_smObjLib | 6)
  42. #define S_smObjLib_NO_OBJECT_DESTROY      (M_smObjLib | 7)
  43. #define SM_OBJ_MAX_CPU 20      /* absolute maximum number of CPU */
  44. /* useful shared memory object ids handling macros */
  45. #define ID_IS_LOCAL(id) ((((UINT32) id) & 1) == 0)
  46. #define ID_IS_SHARED(id) ((((UINT32) id) & 1) != 0)
  47. #define SM_OBJ_ID_TO_ADRS(id) (((int)(id)) + smObjPoolMinusOne)
  48. #define SM_OBJ_ADRS_TO_ID(adrs) (((int)(adrs)) - smObjPoolMinusOne)
  49. /* local to global and global to local address conversion; local NULL pointer */
  50. #define GLOB_TO_LOC_ADRS(adrs) (((int)(adrs)) + localToGlobalOffset)
  51. #define LOC_TO_GLOB_ADRS(adrs) (((int)(adrs)) - localToGlobalOffset)
  52. #define LOC_NULL ((void *)localToGlobalOffset)
  53. /*******************************************************************************
  54. *
  55. * SM_OBJ_VERIFY - check the validity of a shared memory object
  56. *
  57. * This macro verifies the validity of the specified shared memory object by
  58. * comparing the id and its verify field.
  59. *
  60. * RETURNS: OK or ERROR if invalid shared memory object
  61. *
  62. * ERRNO:
  63. *
  64. *   S_objLib_OBJ_ID_ERROR
  65. *
  66. * NOMANUAL
  67. */
  68. #define SM_OBJ_VERIFY(smObjId)     
  69. (    
  70. ((LOC_TO_GLOB_ADRS ((smObjId))) == ntohl ((smObjId->verify))) ? OK 
  71.            :    
  72.    (errno = S_objLib_OBJ_ID_ERROR, ERROR)    
  73.         )
  74. /*******************************************************************************
  75. *
  76. * SM_OBJ_LOCK_TAKE - acquire lock access on a shared ressource
  77. *
  78. * This macro tries to acquire exclusive access to a shared ressource
  79. * via a test-and-set on a long word memory location. It uses shMemLockTake
  80. * with smObjSpinTries tries to get lock using smObjTasRoutine test and
  81. * set routine (usually sysBusTas).
  82. *
  83. * NOMANUAL
  84. */
  85. #define SM_OBJ_LOCK_TAKE(lockLocalAdrs, pOldLvl) 
  86.                     (smLockTake ((int *) lockLocalAdrs, smObjTasRoutine, 
  87.                       smObjSpinTries, (int *) pOldLvl))
  88. /*******************************************************************************
  89. *
  90. * SM_OBJ_LOCK_GIVE - release lock access on a shared ressource
  91. *
  92. * This macro release exclusive access to a shared ressource by clearing
  93. * a long word memory location.
  94. *
  95. * NOMANUAL
  96. */
  97. #define SM_OBJ_LOCK_GIVE(lockLocalAdrs,oldLvl) 
  98.                     (smLockGive ((int *) lockLocalAdrs, smObjTasClearRoutine, 
  99.  oldLvl))
  100. /* typedefs */
  101. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  102. #pragma align 1                 /* tell gcc960 not to optimize alignments */
  103. #endif  /* CPU_FAMILY==I960 */
  104. /* shared memory object header located on top of shared memory pool */
  105. typedef struct sm_obj_mem_hdr      /* SM_OBJ_MEM_HDR - shared memory header */
  106.     {
  107.     UINT            heartBeat; /* incremented via smObjBeat() */
  108.     BOOL            initDone;  /* TRUE if initialization done */
  109.     UINT            version;   /* version number */
  110.     SM_FIX_BLK_PART smTcbPart; /* partition for shared TCB's */
  111.     SM_PARTITION    smSemPart; /* partition for shared semaphores */
  112.     SM_PARTITION    smNamePart;/* partition for shared names */
  113.     SM_PARTITION    smMsgQPart;/* partition for shared msgQ */
  114.     SM_PARTITION    smPartPart;/* partition for shared user partitions */
  115.     SM_PARTITION    smSysPart; /* default shared system partition */
  116.     SM_OBJ_NAME_DB  nameDtb;   /* name database header */
  117.     int             objCpuTbl; /* smObj descriptor table (offset) */
  118.     int maxSems;                /* max number of semaphores */
  119.     int maxMsgQueues;           /* max number of messages queues */
  120.     int maxTasks;               /* max number of tasks */
  121.     int maxMemParts;            /* max number of shared memory partitions */
  122.     int maxNames;               /* max number of name of shared objects */
  123.     int curNumSemB;             /* current number of binary semaphores */
  124.     int curNumSemC;             /* current number of counting semaphores */
  125.     int curNumMsgQ;             /* current number of messages queues */
  126.     int curNumTask;             /* current number of tasks */
  127.     int curNumPart;             /* current number of shared partitions */
  128.     int curNumName;             /* current number of names */
  129.     } SM_OBJ_MEM_HDR;
  130. #define smSemPartId    (&pSmObjHdr->smSemPart)
  131. #define smNamePartId   (&pSmObjHdr->smNamePart)
  132. #define smMsgQPartId   (&pSmObjHdr->smMsgQPart)
  133. #define smPartPartId   (&pSmObjHdr->smPartPart)
  134. #define smSystemPartId (&pSmObjHdr->smSysPart)
  135. typedef struct sm_obj_event_q     /* SM_OBJ_EVENT_Q - events input queue */
  136.     {
  137.     UINT32       lock;            /* multi processor lock */
  138.     SM_DL_LIST   eventList;       /* list of smObj events */
  139.     } SM_OBJ_EVENT_Q;
  140. /* per CPU shared memory object Descriptor */
  141. typedef struct sm_obj_cpu_desc     /* SM_OBJ_CPU_DESC */
  142.     {
  143.     int             status;        /* CPU status - attached/unattached */
  144.     SM_OBJ_EVENT_Q  smObjEventQ;   /* smObj CPU event queue */
  145.     } SM_OBJ_CPU_DESC;
  146. typedef struct sm_obj_desc   /* SM_OBJ_DESC - shared memory object descriptor */
  147.     {
  148.     int                 status;
  149.     SM_DESC             smDesc;         /* shared memory descriptor */
  150.     SM_OBJ_MEM_HDR *    hdrLocalAdrs;   /* smObj memory header local adrs */
  151.     SM_OBJ_CPU_DESC *   cpuLocalAdrs;   /* smObj cpu descriptor local adrs */
  152.     } SM_OBJ_DESC;
  153. typedef struct sm_obj_params /* setup parameters */
  154.     {
  155.     BOOL        allocatedPool;  /* TRUE if shared memory pool is malloced */
  156.     SM_ANCHOR * pAnchor;        /* shared memory anchor */
  157.     char *      smObjFreeAdrs;  /* start address of shared memory pool */
  158.     int         smObjMemSize;   /* memory size reserved for shared memory */
  159.     int         maxCpus;        /* max number of CPU in the system */
  160.     int         maxTasks;       /* max number of tasks using smObj */
  161.     int         maxSems;        /* max number of shared semaphores */
  162.     int         maxMsgQueues;   /* max number of shared message queues */
  163.     int         maxMemParts;    /* max number of shared memory partitions */
  164.     int         maxNames;       /* max number of name of shared objects */
  165.     } SM_OBJ_PARAMS;
  166. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  167. #pragma align 0                 /* turn off alignment requirement */
  168. #endif  /* CPU_FAMILY==I960 */
  169. /* variable declarations */
  170. extern int smObjProcNum; /* processor number */
  171. extern int smObjPoolMinusOne; /* smObj pool local address - 1 */
  172. extern int localToGlobalOffset; /* localAdrs - globalAdrs */
  173. extern FUNCPTR smObjTasRoutine; /* test and set routine */
  174. extern FUNCPTR  smObjTasClearRoutine;   /* clear routine */
  175. extern int smObjSpinTries; /* maximum retries for lock access */
  176. extern SM_HDR volatile *         pSmHdr;  /* pointer to shared memory header */
  177. extern SM_OBJ_MEM_HDR volatile * pSmObjHdr; /* pointer to sm objects header */
  178. extern SM_OBJ_DESC      smObjDesc; /* shared memory object descriptor */
  179. /* function declarations */
  180. #if defined(__STDC__) || defined(__cplusplus)
  181. extern STATUS smObjLibInit (void);
  182. extern STATUS smObjSetup (SM_OBJ_PARAMS * smObjParams);
  183. extern void   smObjInit (SM_OBJ_DESC * pSmObjDesc, SM_ANCHOR * pAnchor,
  184.  int ticksPerBeat, int smObjMaxTries, int intType,
  185.  int intArg1, int intArg2, int intArg3);
  186. extern STATUS smObjAttach (SM_OBJ_DESC * pSmObjDesc);
  187. extern void * smObjLocalToGlobal (void * localAdrs);
  188. extern void * smObjGlobalToLocal (void * globalAdrs);
  189. extern void   smObjTimeoutLogEnable (BOOL timeoutLogEnable);
  190. extern void   smObjShowInit (void);
  191. extern STATUS smObjShow (void);
  192. #else /* __STDC__ */
  193. extern STATUS smObjLibInit ();
  194. extern STATUS smObjSetup ();
  195. extern void   smObjInit ();
  196. extern STATUS smObjAttach ();
  197. extern void * smObjLocalToGlobal ();
  198. extern void * smObjGlobalToLocal ();
  199. extern void   smObjTimeoutLogEnable ();
  200. extern void   smObjShowInit ();
  201. extern STATUS smObjShow ();
  202. #endif /* __STDC__ */
  203. #ifdef __cplusplus
  204. }
  205. #endif
  206. #endif /* __INCsmObjLibh */