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

VxWorks

开发平台:

C/C++

  1. /* objLib.c - generic object management library */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01n,24jun96,sbs  made windview instrumentation conditionally compiled
  8. 01m,10dec93,smb  added instrumentation details CLASS_RESOLVE
  9. 01l,23aug92,jcf  commented out unused routines to conserve space.
  10. 01k,18jul92,smb  Changed errno.h to errnoLib.h.
  11. 01j,04jul92,jcf  private header files; removed printf calls
  12. 01i,26may92,rrr  the tree shuffle
  13. 01h,04dec91,rrr  removed VARARG_OK, no longer needed with ansi c.
  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.   -fixed #else and #endif
  18.   -changed VOID to void
  19.   -changed copyright notice
  20. 01f,18may91,gae  fixed varargs for 960 with conditional VARARG_OK,
  21.  namely: objCreate() & objInit().
  22. 01e,29sep90,jcf  documentation.
  23. 01d,15jul90,dnw  changed objAlloc() to return (void *) instead of (char *)
  24.  deleted 'extra' arg from objAlloc() and added objAllocExtra()
  25. 01c,03jul90,jcf  fixed NULL pointer reference in objTerminate.
  26. 01b,26jun90,jcf  added objAlloc()/objFree ().
  27.  added object alloc count/free count.
  28. 01a,09dec89,jcf  written.
  29. */
  30. /*
  31. DESCRIPTION
  32. This library contains class object management routines.  Classes of objects
  33. control object methods suchas creation, initialization, deletion, and
  34. termination.
  35. Many objects in VxWorks are managed with class organization.  These include
  36. tasks, semaphores, watchdogs, memory partitions, symbol tables, hash tables,
  37. message queues, and, recursively, classes themselves.
  38. INCLUDE FILE: objLib.h
  39. NOMANUAL
  40. */
  41. #include "vxWorks.h"
  42. #include "objLib.h"
  43. #include "classLib.h"
  44. #include "taskLib.h"
  45. #include "memLib.h"
  46. #include "intLib.h"
  47. #include "errnoLib.h"
  48. #include "stdarg.h"
  49. #include "stdio.h"
  50. #define OBJ_MAX_ARGS 16 /* max number of variable arguments */
  51. #define CLASS_OBJ_TO_TID(pObj) ((OBJ_ID)((int)pObj + taskClassId->coreOffset))
  52. #ifdef WV_INSTRUMENTATION
  53. /* This macro was modified to reflect changes for windview */
  54. #define CLASS_RESOLVE(pObj) 
  55. (((CLASS_OBJ_TO_TID(pObj)->pObjClass == taskClassId) ||  
  56.  (CLASS_OBJ_TO_TID(pObj)->pObjClass ==                  
  57.  (CLASS_ID)(((struct obj_class *)(taskClassId))->initRtn))) ? 
  58.          (taskClassId) : (((OBJ_ID)pObj)->pObjClass))
  59. #else
  60. #define CLASS_RESOLVE(pObj) 
  61. ((CLASS_OBJ_TO_TID(pObj)->pObjClass == taskClassId) ? 
  62.          (taskClassId) : (((OBJ_ID)pObj)->pObjClass))
  63. #endif
  64. #if FALSE       /* may utilize someday */
  65. /*******************************************************************************
  66. *
  67. * objCreate - allocate and initialize an object
  68. *
  69. * This routine creates an object of the specified class via the classes create
  70. * method.
  71. *
  72. * RETURNS: object id, or NULL if object couldn't be created.
  73. *
  74. * VARARGS1
  75. */
  76. OBJ_ID objCreate
  77.     (
  78.     CLASS_ID classId,   /* object class of object to create */
  79.     ...              /* optional arguments to create routine */
  80.     )
  81.     {
  82.     va_list pArg; /* traverses argument list */
  83.     int ix; /* handy index */
  84.     int a[OBJ_MAX_ARGS];/* indigenous variables */
  85.     if (OBJ_VERIFY (classId, classClassId) != OK)
  86. return (NULL);
  87.     va_start (pArg, classId);
  88.     for (ix = 0; ix < OBJ_MAX_ARGS; ++ix)
  89. a[ix] = va_arg (pArg, int); /* varargs into indigenous variables */
  90.     va_end (pArg);
  91.     return ((OBJ_ID)((* classId->createRtn) (a[0], a[1], a[2], a[3], a[4],
  92.      a[5], a[6], a[7], a[8], a[9],
  93.      a[10], a[11], a[12], a[13],
  94.      a[14], a[15]))); /* XXX MAX_ARGS */
  95.     }
  96. /*******************************************************************************
  97. *
  98. * objInit - initialize an object
  99. *
  100. * This routine initializes an object to the specified class via the class
  101. * initialization method.
  102. *
  103. * RETURNS: OK, or ERROR if object could not be initialized.
  104. *
  105. * VARARGS2
  106. */
  107. STATUS objInit
  108.     (
  109.     CLASS_ID classId,   /* object class of object to create */
  110.     OBJ_ID   objId,     /* pointer to object to initialize */
  111.     ...              /* optional arguments to create routine */
  112.     )
  113.     {
  114.     va_list pArg; /* traverses argument list */
  115.     int ix; /* handy index */
  116.     int a[OBJ_MAX_ARGS];/* indigenous variables */
  117.     if (OBJ_VERIFY (classId, classClassId) != OK)
  118. return (ERROR);
  119.     va_start (pArg, objId);
  120.     for (ix = 0; ix < OBJ_MAX_ARGS; ++ix)
  121. a[ix] = va_arg (pArg, int); /* varargs into indigenous variables */
  122.     va_end (pArg);
  123.     return ((* classId->initRtn) (objId, a[0], a[1], a[2], a[3], a[4], a[5],
  124.   a[6], a[7], a[8], a[9], a[10], a[11], a[12],
  125.   a[13], a[14], a[15])); /* XXX MAX_ARGS */
  126.     }
  127. /*******************************************************************************
  128. *
  129. * objDelete - delete object and deallocate all associated memory
  130. *
  131. * Deallocate memory associated with an object.
  132. *
  133. * RETURNS: OK, or ERROR if object could not be deleted.
  134. */
  135. STATUS objDelete
  136.     (
  137.     OBJ_ID objId        /* object to delete */
  138.     )
  139.     {
  140.     return (objDestroy (objId, TRUE, WAIT_FOREVER));
  141.     }
  142. /*******************************************************************************
  143. *
  144. * objTerminate - terminate object
  145. *
  146. * Terminate an object.
  147. *
  148. * RETURNS: OK, or ERROR if object could not be terminated.
  149. */
  150. STATUS objTerminate
  151.     (
  152.     OBJ_ID objId        /* object to terminate */
  153.     )
  154.     {
  155.     return (objDestroy (objId, FALSE, WAIT_FOREVER));
  156.     }
  157. /*******************************************************************************
  158. *
  159. * objDestroy - destroy an object
  160. *
  161. * Destroy an object, and optionally deallocate associated memory.
  162. *
  163. * RETURNS: OK, or ERROR if object could not be destroyed.
  164. */
  165. STATUS objDestroy
  166.     (
  167.     OBJ_ID objId,       /* object to terminate */
  168.     BOOL   dealloc,     /* deallocate memory associated with memory */
  169.     int    timeout      /* timeout */
  170.     )
  171.     {
  172.     CLASS_ID pObjClass = CLASS_RESOLVE (objId);
  173.     if (OBJ_VERIFY (&pObjClass->objCore, classClassId) != OK)
  174. return (ERROR);
  175.     return ((* pObjClass->destroyRtn) (objId, dealloc, timeout));
  176.     }
  177. #endif /* may utilize someday */
  178. /*******************************************************************************
  179. *
  180. * objShow - show information on an object
  181. *
  182. * Call class attached show routine for an object.
  183. *
  184. * RETURNS: OK, or ERROR if information could not be shown.
  185. */
  186. STATUS objShow
  187.     (
  188.     OBJ_ID objId,       /* object to show information on */
  189.     int    showType     /* show type */
  190.     )
  191.     {
  192.     CLASS_ID pObjClass = CLASS_RESOLVE (objId);
  193.     if (OBJ_VERIFY (&pObjClass->objCore, classClassId) != OK)
  194. return (ERROR);
  195.     if (pObjClass->showRtn == NULL)
  196. {
  197. errnoSet (S_objLib_OBJ_NO_METHOD);
  198. return (ERROR);
  199. }
  200.     return ((* pObjClass->showRtn) (objId, showType));
  201.     }
  202. #if FALSE       /* may utilize someday */
  203. /*******************************************************************************
  204. *
  205. * objHelp - provide help for an object
  206. *
  207. * Call class attached help routine for an object.
  208. *
  209. * RETURNS: OK, or ERROR if help could not be provided.
  210. */
  211. STATUS objHelp
  212.     (
  213.     OBJ_ID objId,       /* object to get help with */
  214.     int    helpType     /* help type */
  215.     )
  216.     {
  217.     CLASS_ID    pObjClass = CLASS_RESOLVE (objId);
  218.     if (OBJ_VERIFY (&pObjClass->objCore, classClassId) != OK)
  219.         return (ERROR);
  220.     if (pObjClass->helpRtn == NULL)
  221. {
  222. errnoSet (S_objLib_OBJ_NO_METHOD);
  223. return (ERROR);
  224. }
  225.     return ((* pObjClass->helpRtn) (objId, helpType));
  226.     }
  227. #endif
  228. /*******************************************************************************
  229. *
  230. * objAllocExtra - allocate an object from the object's partition with extra
  231. *
  232. * Allocate memory from a class memory partition, for an object.  Extra bytes
  233. * may be requested.
  234. *
  235. * RETURNS: pointer to object, or NULL if object could not allocated.
  236. */
  237. void *objAllocExtra
  238.     (
  239.     FAST CLASS_ID classId,      /* object class id */
  240.     unsigned nExtraBytes,       /* additional bytes needed beyond object size */
  241.     void ** ppExtra             /* where to return ptr to extra bytes */
  242.                                 /*   (NULL == don't return ptr) */
  243.     )
  244.     {
  245.     void *pObj;
  246.     /* return NULL if called from ISR or classId is invalid */
  247.     if ((INT_RESTRICT () != OK) || (OBJ_VERIFY (classId, classClassId) != OK))
  248. return (NULL);
  249.     pObj = memPartAlloc (classId->objPartId, classId->objSize + nExtraBytes);
  250.     if (pObj != NULL)
  251. {
  252. classId->objAllocCnt ++; /* keep track of allocation count */
  253. if (ppExtra != NULL)
  254.     *ppExtra = (void *) (((char *) pObj) + classId->objSize);
  255. }
  256.     return (pObj);
  257.     }
  258. /*******************************************************************************
  259. *
  260. * objAlloc - allocate an object from the object's partition
  261. *
  262. * Allocate memory from a class memory partition, for an object.
  263. *
  264. * RETURNS: pointer to object, or NULL if object could not allocated.
  265. */
  266. void *objAlloc
  267.     (
  268.     FAST CLASS_ID classId       /* object class id */
  269.     )
  270.     {
  271.     return (objAllocExtra (classId, 0, (void **) NULL));
  272.     }
  273. /*******************************************************************************
  274. *
  275. * objFree - deallocate an object from the object's partition
  276. *
  277. * Deallocate memory from a class memory partition associated with an object.
  278. * RETURNS: OK, or ERROR if object could not deallocated.
  279. */
  280. STATUS objFree
  281.     (
  282.     CLASS_ID classId,   /* class id of object */
  283.     char     *pObject   /* point to object memory to free */
  284.     )
  285.     {
  286.     if ((OBJ_VERIFY (classId, classClassId) != OK) ||
  287.         (memPartFree (classId->objPartId, pObject) != OK))
  288. return (ERROR);
  289.     classId->objFreeCnt ++; /* keep track of free count */
  290.     return (OK);
  291.     }
  292. /*******************************************************************************
  293. *
  294. * objCoreInit - initialize object core
  295. *
  296. * Initialize and validate object core.
  297. */
  298. void objCoreInit
  299.     (
  300.     OBJ_CORE    *pObjCore,      /* pointer to object core to initialize */
  301.     OBJ_CLASS   *pObjClass      /* pointer to object class */
  302.     )
  303.     {
  304.     pObjCore->pObjClass = pObjClass; /* validate object */
  305.     pObjClass->objInitCnt ++; /* keep track of object count */
  306.     }
  307. /*******************************************************************************
  308. *
  309. * objCoreTerminate - terminate object core
  310. *
  311. * This routine terminates and invalidates an object.
  312. */
  313. void objCoreTerminate
  314.     (
  315.     OBJ_CORE *pObjCore          /* pointer to object to invalidate */
  316.     )
  317.     {
  318.     pObjCore->pObjClass->objTerminateCnt ++; /* keep track of terminates */
  319.     pObjCore->pObjClass = NULL; /* invalidate object */
  320.     }