classLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* classLib.c - VxWorks object class management library */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01n,12mar99,c_c  Doc: fixed SPR #7353.
  8. 01m,21feb99,jdi  doc: listed errno for classDestroy().
  9. 01l,24jun96,sbs  made windview instrumentation conditionally compiled
  10. 01k,14dec93,smb  corrected initRtn of inst class to point to non-inst class
  11. 01j,10dec93,smb  added instrumentation
  12. 01i,04jul92,jcf  private header files.
  13. 01h,26may92,rrr  the tree shuffle
  14. 01g,04oct91,rrr  passed through the ansification filter
  15.                   -changed functions to ansi style
  16.   -changed includes to have absolute path from h/
  17.   -changed copyright notice
  18. 01f,28sep90,jcf   documentation.
  19. 01e,18jul90,jcf   validate partition in classMemPartIdSet().
  20. 01d,17jul90,dnw   changed to new objAlloc() call
  21. 01c,10jul90,jcf   documentation.
  22. 01b,26jun90,jcf   added objAlloc()/objFree().
  23.   added object create/delete/init/terminate counting.
  24.   fixed class object core initialization.
  25. 01a,14feb90,jcf   written.
  26. */
  27. /*
  28. DESCRIPTION
  29. This library contains class object management routines.  Classes of objects
  30. control object methods suchas creation, initialization, deletion, and
  31. termination.
  32. Many objects in VxWorks are managed with class organization.  These include
  33. tasks, semaphores, watchdogs, memory partitions, symbol tables, hash tables,
  34. message queues, and, recursively, classes themselves.
  35. INCLUDE FILE: classLib.h
  36. SEE ALSO: objLib(1).
  37. NOMANUAL
  38. */
  39. #include "vxWorks.h"
  40. #include "classLib.h"
  41. #include "objLib.h"
  42. #include "intLib.h"
  43. #include "errno.h"
  44. #include "private/memPartLibP.h"
  45. #include "private/eventP.h"
  46. /* locals */
  47. LOCAL OBJ_CLASS classClass;
  48. /* globals */
  49. CLASS_ID classClassId = &classClass;
  50. /*******************************************************************************
  51. *
  52. * classLibInit - initialize the class support library
  53. *
  54. * This routine initializes the class management package.
  55. *
  56. * NOMANUAL
  57. */
  58. STATUS classLibInit (void)
  59.     {
  60.     classInit (classClassId, sizeof (OBJ_CLASS), OFFSET (OBJ_CLASS, objCore),
  61.        (FUNCPTR) classCreate, (FUNCPTR) classInit,
  62.        (FUNCPTR) classDestroy);
  63.     return (OK);
  64.     }
  65. /*******************************************************************************
  66. *
  67. * classCreate - allocate and initialize an object class
  68. *
  69. * This routine allocates a OBJ_CLASS structure, and initializes it with
  70. * the specified parameters.
  71. *
  72. * RETURNS: Pointer to a class id, or NULL if allocation failed.
  73. */
  74. CLASS_ID classCreate
  75.     (
  76.     unsigned    objectSize,     /* size of object */
  77.     int         coreOffset,     /* offset from objCore to object start */
  78.     FUNCPTR     createRtn,      /* object creation routine */
  79.     FUNCPTR     initRtn,        /* object initialization routine */
  80.     FUNCPTR     destroyRtn      /* object destroy routine */
  81.     )
  82.     {
  83.     CLASS_ID classId = (CLASS_ID) objAlloc (classClassId);
  84.     if (classId != NULL)
  85. classInit (classId, objectSize, coreOffset, createRtn, initRtn,
  86.    destroyRtn);
  87.     return (classId); /* return initialized class */
  88.     }
  89. /*******************************************************************************
  90. *
  91. * classInit - initialize an object class
  92. *
  93. * This routine initializes the specified OBJ_CLASS structure with the
  94. * specified parameters.
  95. *
  96. * RETURNS: OK.
  97. */
  98. STATUS classInit
  99.     (
  100.     OBJ_CLASS   *pObjClass,     /* pointer to object class to initialize */
  101.     unsigned    objectSize,     /* size of object */
  102.     int         coreOffset,     /* offset from objCore to object start */
  103.     FUNCPTR     createRtn,      /* object creation routine */
  104.     FUNCPTR     initRtn,        /* object initialization routine */
  105.     FUNCPTR     destroyRtn      /* object destroy routine */
  106.     )
  107.     {
  108.     /* default memory partition is system partition */
  109.     pObjClass->objPartId = memSysPartId; /* partition to allocate from */
  110.     pObjClass->objSize = objectSize; /* record object size */
  111.     pObjClass->objAllocCnt = 0; /* initially no objects */
  112.     pObjClass->objFreeCnt = 0; /* initially no objects */
  113.     pObjClass->objInitCnt = 0; /* initially no objects */
  114.     pObjClass->objTerminateCnt = 0; /* initially no objects */
  115.     pObjClass->coreOffset = coreOffset; /* set offset from core */
  116.     /* initialize object methods */
  117.     pObjClass->createRtn = createRtn; /* object creation routine */
  118.     pObjClass->initRtn = initRtn; /* object init routine */
  119.     pObjClass->destroyRtn = destroyRtn; /* object destroy routine */
  120.     pObjClass->showRtn = NULL; /* object show routine */
  121.     pObjClass->instRtn = NULL; /* object inst routine */
  122.     /* initialize class as valid object */
  123.     objCoreInit (&pObjClass->objCore, classClassId);
  124.     return (OK);
  125.     }
  126. /*******************************************************************************
  127. *
  128. * classDestroy - destroy class
  129. *
  130. * Class destruction is not currently supported.
  131. *
  132. * RETURNS: ERROR always.
  133. *
  134. * ERRNO:
  135. * S_classLib_NO_CLASS_DESTROY
  136. *
  137. * ARGSUSED
  138. */
  139. STATUS classDestroy
  140.     (
  141.     CLASS_ID classId    /* object class to terminate */
  142.     )
  143.     {
  144.     errno = S_classLib_NO_CLASS_DESTROY;
  145.     return (ERROR);
  146.     }
  147. /*******************************************************************************
  148. *
  149. * classShowConnect - connect an arbitrary show routine to an object class
  150. *
  151. * This routine is used to attach an arbitrary show routine to an object class.
  152. * The specified routine will be invoked by objShow().
  153. *
  154. * RETURNS: OK, or ERROR if invalid class.
  155. */
  156. STATUS classShowConnect
  157.     (
  158.     CLASS_ID    classId,        /* object class to attach show routine to */
  159.     FUNCPTR     showRtn         /* object show routine */
  160.     )
  161.     {
  162.     if (OBJ_VERIFY (classId, classClassId) != OK)
  163. return (ERROR);
  164.     classId->showRtn = showRtn; /* attach inst routine */
  165. #ifdef WV_INSTRUMENTATION
  166.     /* windview
  167.      * Attach showRtn to instrumented class. If the classId is non-instrumented
  168.      * then initRtn will point to the instrumented class and vica versa. 
  169.      */
  170.     if ((wvInstIsOn) && (classId->initRtn != (FUNCPTR) NULL))
  171.     {
  172. ((CLASS_ID) (classId->initRtn))->showRtn = showRtn;
  173. }
  174. #endif
  175.     return (OK);
  176.     }
  177. #ifdef WV_INSTRUMENTATION
  178. /*******************************************************************************
  179. *
  180. * classInstConnect - connect an arbitrary instrument routine to an object class
  181. *
  182. * This routine is used to attach an instrument routine to an object 
  183. * class. 
  184. *
  185. * RETURNS: OK, or ERROR if invalid class.
  186. * NOMANUAL
  187. */
  188. STATUS classInstConnect
  189.     (
  190.     CLASS_ID    classId,        /* object class to attach inst routine to */
  191.     FUNCPTR     instRtn         /* object inst routine */
  192.     )
  193.     {
  194.     if (OBJ_VERIFY (classId, classClassId) != OK)
  195. return (ERROR);
  196.     classId->instRtn = instRtn; /* attach inst routine */
  197.     return (OK);
  198.     }
  199. #else
  200. /*******************************************************************************
  201. *
  202. * classHelpConnect - connect an arbitrary help routine to an object class
  203. *
  204. * This routine is used to attach an arbitrary help routine to an object class.
  205. * The specified routine will be invoked by objHelp().
  206. *
  207. * RETURNS: OK, or ERROR if invalid class.
  208. */
  209. STATUS classHelpConnect
  210.     (
  211.     CLASS_ID    classId,        /* object class to attach help routine to */
  212.     FUNCPTR     helpRtn         /* object help routine */
  213.     )
  214.     { 
  215.     if (OBJ_VERIFY (classId, classClassId) != OK)
  216. return (ERROR);
  217.     classId->instRtn = helpRtn;                 /* attach help routine */
  218.      
  219.     return (OK);
  220.     }
  221. #endif
  222. /*******************************************************************************
  223. *
  224. * classMemPartIdSet - set the object class memory allocation partition
  225. *
  226. * This routine is used to change an object class memory allocation partition
  227. * from its default of the system memory pool to the specified partition.  The
  228. * routine objAlloc() utilizes this partition as the basis for its allocation.
  229. *
  230. * RETURNS: OK, or ERROR if invalid class, or memory partition.
  231. */
  232. STATUS classMemPartIdSet
  233.     (
  234.     CLASS_ID    classId,        /* object class to set memory partition for */
  235.     PART_ID     memPartId       /* partition id to allocate objects from */
  236.     )
  237.     {
  238.     if ((OBJ_VERIFY (classId, classClassId) != OK) ||
  239.         (OBJ_VERIFY (memPartId, memPartClassId) != OK))
  240. return (ERROR);
  241.     classId->objPartId = memPartId; /* set partition id */
  242.     return (OK);
  243.     }
  244. #ifdef WV_INSTRUMENTATION
  245. /*******************************************************************************
  246. *
  247. * classInstrument - initialize the instrumented class 
  248. *
  249. * This routine initializes the instrumented class
  250. *
  251. * NOMANUAL
  252. */
  253. STATUS classInstrument 
  254.     (
  255.     OBJ_CLASS * pObjClass, 
  256.     OBJ_CLASS * pObjInstClass
  257.     )
  258.     {
  259.     if (OBJ_VERIFY (pObjClass, classClassId) != OK) 
  260. return (ERROR);
  261.     pObjInstClass->objPartId       = memSysPartId;
  262.     pObjInstClass->objSize         = pObjClass->objSize;
  263.     pObjInstClass->objAllocCnt     = 0;
  264.     pObjInstClass->objFreeCnt      = 0;
  265.     pObjInstClass->objInitCnt      = 0;
  266.     pObjInstClass->objTerminateCnt = 0;
  267.     pObjInstClass->coreOffset      = pObjClass->coreOffset;
  268.     /* initialize object methods */
  269.     pObjInstClass->createRtn       = pObjClass->createRtn;
  270.     pObjInstClass->initRtn         = pObjClass;
  271.     pObjInstClass->destroyRtn      = pObjClass->destroyRtn;
  272.     pObjInstClass->showRtn         = NULL;
  273.     pObjInstClass->instRtn         = (FUNCPTR) _func_evtLogOIntLock;
  274.     /* initialize class as valid object */
  275.     objCoreInit (&pObjInstClass->objCore, classClassId);
  276.     return (OK);
  277.     }
  278. #endif