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

VxWorks

开发平台:

C/C++

  1. /* smNameLib.c - shared memory objects name database library (VxMP Option) */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01k,03may02,mas  cache flush and volatile fix (SPR 68334); bridge flush fix
  7.  (SPR 68844)
  8. 01j,24oct01,mas  fixed gnu warnings (SPR 71113) and diab warnings (SPR 71120);
  9.  doc update (SPR 71149)
  10. 01i,30mar99,jdi  doc: fixed bad table style that refgen can't cope with.
  11. 01h,14mar99,jdi  doc: removed refs to config.h and/or configAll.h (SPR 25663).
  12. 01g,12mar99,p_m  Fixed SPR 20159 by adding missing parameters in examples.
  13. 01f,14feb93,jdi  documentation cleanup for 5.1.
  14. 01e,29jan93,pme  added little endian support.
  15.  modified name facility initialized test.
  16.  changed name copying to use strcpy().
  17. 01d,21nov92,jdi  documentation cleanup.
  18. 01c,02oct92,pme  added SPARC support. documentation cleanup.
  19. 01b,29sep92,pme  changed function names for coherency. 
  20.  cleanup.
  21.                  changed previous release number to 01a.
  22. 01a,19jul92,pme  moved smNameInfoGet() and smNameShow to smNameShow.c
  23.                  code review cleanup.
  24.                  added smNameInfoGet ().
  25.                  written.
  26. */
  27. /*
  28. DESCRIPTION
  29. This library provides facilities for managing the shared memory objects
  30. name database.  The shared memory objects name database associates a name
  31. and object type with a value and makes that information available to all 
  32. CPUs.  A name is an arbitrary, null-terminated string.  An object 
  33. type is a small integer, and its value is a global (shared) ID or
  34. a global shared memory address.
  35. Names are added to the shared memory name database with smNameAdd().  They
  36. are removed by smNameRemove().
  37. Objects in the database can be accessed by either name or value.  The
  38. routine smNameFind() searches the shared memory name database for an
  39. object of a specified name.  The routine smNameFindByValue() searches the
  40. shared memory name database for an object of a specified identifier or
  41. address.
  42. Name database contents can be viewed using smNameShow().
  43. The maximum number of names to be entered in the database is defined in the
  44. configuration parameter SM_OBJ_MAX_NAME .  This  value is used to determine
  45. the size of a dedicated shared memory partition from which name database
  46. fields are allocated. 
  47. The estimated memory size required for the name database can be calculated as 
  48. follows:
  49.  
  50. cs
  51.     name database pool size = SM_OBJ_MAX_NAME * 40 (bytes)
  52. ce
  53. The display facility for the shared memory objects name database is provided by
  54. the smNameShow module.
  55. EXAMPLE
  56. The following code fragment allows a task on one CPU to enter the
  57. name, associated ID, and type of a created shared semaphore into
  58. the name database.  Note that CPU numbers can belong to any CPU using the
  59. shared memory objects facility.
  60. On CPU 1 :
  61. cs
  62.     #include "vxWorks.h"
  63.     #include "semLib.h"
  64.     #include "smNameLib.h"
  65.     #include "semSmLib.h"
  66.     #include "stdio.h"
  67.     testSmSem1 (void)
  68.         {
  69.         SEM_ID smSemId;
  70. /@ create a shared semaphore @/
  71.         if ((smSemId = semBSmCreate(SEM_Q_FIFO, SEM_EMPTY)) == NULL)
  72.             {
  73.             printf ("Shared semaphore creation error.");
  74.             return (ERROR);
  75.             }
  76.         /@ 
  77.          * make created semaphore Id available to all CPUs in 
  78.          * the system by entering its name in shared name database.
  79.          @/
  80.         if (smNameAdd ("smSem", smSemId, T_SM_SEM_B) != OK )
  81.             {
  82.             printf ("Cannot add smSem into shared database.");
  83.             return (ERROR);
  84.             }
  85.     ...
  86.         /@ now use the semaphore @/
  87.         semGive (smSemId);
  88.     ...
  89.         }
  90. ce
  91. On CPU 2 :
  92. cs
  93.     #include "vxWorks.h"
  94.     #include "semLib.h"
  95.     #include "smNameLib.h"
  96.     #include "stdio.h"
  97.     testSmSem2 (void)
  98.         {
  99.         SEM_ID smSemId;
  100. int    objType; /@ place holder for smNameFind() object type @/
  101.         /@ get semaphore ID from name database @/ 
  102.     
  103.         smNameFind ("smSem", (void **) &smSemId, &objType, WAIT_FOREVER);
  104.     ...
  105.         /@ now that we have the shared semaphore ID, take it @/
  106.     
  107.         semTake (smSemId, WAIT_FOREVER);
  108.     ...
  109.         }
  110. ce
  111. INTERNAL
  112. The data base is protected against concurrent access by a shared binary
  113. semaphore.  Each routine in this library provides task deletion safety
  114. while holding the database semaphore to prevent database access lock.
  115. Shared name database is based on a doubly linked list created during
  116. shared memory objects initialization.  A doubly linked list is used to allow
  117. future extensions like alphabeticaly ordered database and global management
  118. speed up.  Each database field requires 44 bytes and is allocated from the
  119. shared memory name database pool using smMemPartAlloc().  Names are added in
  120. FIFO order to the list.  The search for a name or a value is done by scanning
  121. the list from first to last node.
  122. CONFIGURATION
  123. Before routines in this library can be called, the shared memory object
  124. facility must be initialized by calling usrSmObjInit().
  125. This is done automatically during VxWorks initialization when the component
  126. INCLUDE_SM_OBJ is included.
  127. AVAILABILITY
  128. This module is distributed as a component of the unbundled shared memory
  129. objects support option, VxMP.
  130. INCLUDE FILES: smNameLib.h
  131. SEE ALSO: smNameShow, smObjLib, smObjShow, usrSmObjInit(),
  132. tb VxWorks Programmer's Guide: Shared Memory Objects
  133. */
  134. #include "vxWorks.h"
  135. #include "errno.h"
  136. #include "semLib.h"
  137. #include "string.h"
  138. #include "taskLib.h"
  139. #include "cacheLib.h"
  140. #include "smDllLib.h"
  141. #include "smObjLib.h"
  142. #include "smMemLib.h"
  143. #include "netinet/in.h"
  144. #include "private/smNameLibP.h"
  145. #include "private/smMemLibP.h"
  146. /* forward declarations */
  147. LOCAL STATUS smNameFindOnce (char * name, void ** pValue, int * pType);
  148. /* globals */
  149. SM_OBJ_NAME_DB volatile * pSmNameDb; /* pointer to name database header */
  150. /******************************************************************************
  151. *
  152. * smNameLibInit - dummy function to drag in smNameLib
  153. *
  154. * This routine is required to reference the shared name library 
  155. * during linking.
  156. *
  157. * NOMANUAL
  158. */
  159. void smNameLibInit(void)
  160.     {
  161.     }
  162. /******************************************************************************
  163. *
  164. * smNameInit - initialize the shared memory objects name database
  165. *
  166. * This routine initializes the shared memory objects name facility by filling
  167. * reserved fields in the shared memory header. 
  168. *
  169. * It is called during shared memory objects setup if the configuration
  170. * macro INCLUDE_SM_OBJ is defined.
  171. *
  172. * RETURNS: OK, or ERROR if database cannot be initialized.
  173. *
  174. * ERRNO:
  175. *  S_smObjLib_NOT_INITIALIZED
  176. *
  177. * SEE ALSO: smNameLib
  178. *
  179. * NOMANUAL
  180. */
  181. STATUS smNameInit 
  182.     (
  183.     int maxNames /* max # of names in database */
  184.     )
  185.     {
  186.     if ((pSmObjHdr == NULL) || !(pSmObjHdr->initDone)) /* smObj initialized?*/
  187. {
  188. errno = S_smObjLib_NOT_INITIALIZED;
  189. return (ERROR);
  190. }
  191.     pSmNameDb = &pSmObjHdr->nameDtb; /* get name database header */ 
  192.     /* initialize name data base shared semaphore */
  193.     semSmBInit ((SM_SEM_ID)&pSmNameDb->sem, SEM_Q_FIFO, SEM_FULL);
  194.     smDllInit ((SM_DL_LIST *)&pSmNameDb->nameList); /* initialise name list */
  195.     pSmNameDb->maxName    = htonl (maxNames);  /* fill header */
  196.     pSmNameDb->curNumName = 0;
  197.     pSmNameDb->initDone   = htonl (TRUE);  /* name facility initialized*/
  198.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  199.     maxNames = pSmNameDb->maxName; /* BRIDGE FLUSH  [SPR 68334] */
  200.     return (OK);
  201.     }
  202. /******************************************************************************
  203. *
  204. * smNameAdd - add a name to the shared memory name database (VxMP Option)
  205. *
  206. * This routine adds a name of specified object type and value to the shared 
  207. * memory objects name database.
  208. *
  209. * The <name> parameter is an arbitrary null-terminated string with a 
  210. * maximum of 20 characters, including EOS.
  211. *
  212. * By convention, <type> values of less than 0x1000 are reserved by VxWorks;
  213. * all other values are user definable.  The following types are predefined
  214. * in smNameLib.h :
  215. *
  216. * ts
  217. * Name         | Value | Type
  218. * -------------+-------+-------------------------------
  219. * T_SM_SEM_B   | =  0  | shared binary semaphore
  220. * T_SM_SEM_C   | =  1  | shared counting semaphore 
  221. * T_SM_MSG_Q   | =  2  | shared message queue 
  222. * T_SM_PART_ID | =  3  | shared memory Partition 
  223. * T_SM_BLOCK   | =  4  | shared memory allocated block 
  224. * te
  225. *
  226. * A name can be entered only once in the database, but there can be more
  227. * than one name associated with an object ID. 
  228. *
  229. * AVAILABILITY
  230. * This routine is distributed as a component of the unbundled shared memory
  231. * objects support option, VxMP.
  232. * RETURNS: OK, or ERROR if there is insufficient memory for <name> to be 
  233. * allocated, if <name> is already in the database, or if the database is 
  234. * already full.
  235. *
  236. * ERRNO: 
  237. *  S_smNameLib_NOT_INITIALIZED  
  238. *  S_smNameLib_NAME_TOO_LONG  
  239. *  S_smNameLib_NAME_ALREADY_EXIST 
  240. *  S_smNameLib_DATABASE_FULL 
  241. *  S_smObjLib_LOCK_TIMEOUT
  242. *
  243. * SEE ALSO: smNameShow
  244. *
  245. * INTERNAL
  246. * Database fields are allocated from a dedicated shared memory partition
  247. * called smNamePartId.
  248. */
  249. STATUS smNameAdd
  250.     (
  251.     char * name, /* name string to enter in database */
  252.     void * value, /* value associated with name */
  253.     int type /* type associated with name */
  254.     )
  255.     {
  256.     SM_OBJ_NAME volatile * smName; /* name database field pointer */
  257.     void *    dummyValue; /* dummy value to call smNameFindOnce*/
  258.     int    dummyType; /* dummy type to call smNameFindOnce */
  259.     int                    tmp;         /* temp storage */
  260.     if (pSmNameDb == NULL) /* name facility initialized ? */
  261. {
  262. errno = S_smNameLib_NOT_INITIALIZED;
  263. return (ERROR);
  264. }
  265.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  266.     tmp = pSmNameDb->maxName; /* PCI bug       [SPR 68844] */
  267.     if (pSmNameDb->maxName == pSmNameDb->curNumName)  /* database full ? */
  268. {
  269. errno = S_smNameLib_DATABASE_FULL;
  270. return (ERROR);
  271. }
  272.     if (strlen (name) > MAX_NAME_LENGTH) /* name too long */
  273. {
  274. errno = S_smNameLib_NAME_TOO_LONG;
  275. return (ERROR);
  276. }
  277.     /* check if name already in database */
  278.     
  279.     if (smNameFindOnce (name, &dummyValue, &dummyType) == OK)
  280.         {
  281. errno = S_smNameLib_NAME_ALREADY_EXIST;
  282. return (ERROR);
  283. }
  284.     /* get exclusive access to DB */
  285.     TASK_SAFE ();
  286.     if (semSmTake ((SM_SEM_ID)&pSmNameDb->sem, WAIT_FOREVER) != OK)
  287. {
  288. TASK_UNSAFE ();
  289. return (ERROR);
  290. }
  291.     /* allocate space for name in dedicated shared memory partition */
  292.     smName = (SM_OBJ_NAME volatile *) smMemPartAlloc ((SM_PART_ID)smNamePartId,
  293.       sizeof(SM_OBJ_NAME));
  294.     if (smName == NULL)
  295. {
  296.      semSmGive ((SM_SEM_ID)&pSmNameDb->sem);  /* release access */
  297. TASK_UNSAFE ();
  298. return (ERROR);
  299. }
  300.     bzero ((char *) smName, sizeof(SM_OBJ_NAME)); /* clear element */
  301.     smName->value = (void *) htonl ((int) value); /* fill element */
  302.     strcpy ((char *) smName->name, name);
  303.     smName->type = htonl (type);
  304.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  305.     dummyType = smName->type; /* BRIDGE FLUSH  [SPR 68334] */
  306.     smDllAdd ((SM_DL_LIST *) &pSmNameDb->nameList, (SM_DL_NODE *) smName);
  307. /* add element to list */
  308.    
  309.      /* update element number */
  310.     pSmNameDb->curNumName = htonl (ntohl (pSmNameDb->curNumName) + 1);
  311.      /* update shared infos data */
  312.     pSmObjHdr->curNumName = htonl (ntohl (pSmObjHdr->curNumName) + 1);
  313.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  314.     dummyType = smName->type; /* BRIDGE FLUSH  [SPR 68334] */
  315.     if (semSmGive ((SM_SEM_ID)&pSmNameDb->sem) != OK)  /* release access */
  316. {
  317. TASK_UNSAFE ();
  318. return (ERROR);
  319. }
  320.     TASK_UNSAFE ();
  321.     return (OK);
  322.     }
  323. /******************************************************************************
  324. *
  325. * smNameFindOnce - look up a shared symbol by name one time
  326. *
  327. * This routine searches the shared name database for an object matching a
  328. * specified name <name>.  If the object is found, its value and type are copied
  329. * to <pValue> and <pType>. 
  330. *
  331. * RETURNS: OK, or ERROR if the object is not found.
  332. *
  333. * ERRNO: 
  334. *  S_smNameLib_NAME_NOT_FOUND 
  335. *  S_smObjLib_LOCK_TIMEOUT
  336. *
  337. * NOMANUAL
  338. */
  339. LOCAL STATUS smNameFindOnce 
  340.     (
  341.     char *  name, /* name to search for */ 
  342.     void ** pValue, /* pointer where to return value */
  343.     int  *  pType /* pointer where to return object type */
  344.     )
  345.     {
  346.     SM_OBJ_NAME volatile * smName; /* name database field pointer */
  347.     TASK_SAFE ();
  348.     if (semSmTake ((SM_SEM_ID)&pSmNameDb->sem, WAIT_FOREVER) != OK)
  349. { /* get exclusive access */
  350. TASK_UNSAFE ();
  351. return (ERROR);
  352. }
  353.     /* get first name in database */
  354.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  355.     smName = (SM_OBJ_NAME volatile *) SM_DL_FIRST (&pSmNameDb->nameList);
  356.     /* scan name list until name is found or end of list is reached */
  357.     while (smName != LOC_NULL) 
  358. {
  359. if (strcmp((char *)smName->name, name) == 0) /* name found */
  360.    {
  361.    *pValue = (void *) ntohl ((int) smName->value);/* return value */
  362.    *pType  = ntohl (smName->type); /* return object type */
  363.         if (semSmGive ((SM_SEM_ID)&pSmNameDb->sem) != OK)
  364.         { /* release access */
  365. TASK_UNSAFE ();
  366. return (ERROR);
  367. }
  368.    TASK_UNSAFE ();
  369.    return (OK);
  370.    }
  371.         /* get next name in list */
  372.         CACHE_PIPE_FLUSH ();                    /* CACHE FLUSH   [SPR 68334] */
  373. smName = (SM_OBJ_NAME volatile *) SM_DL_NEXT (smName);
  374. }
  375.     if (semSmGive ((SM_SEM_ID)&pSmNameDb->sem) != OK)  /* release access */
  376. {
  377. TASK_UNSAFE ();
  378. return (ERROR);
  379. }
  380.     TASK_UNSAFE ();
  381.     errno = S_smNameLib_NAME_NOT_FOUND;
  382.     return (ERROR);
  383.     }
  384. /******************************************************************************
  385. *
  386. * smNameFind - look up a shared memory object by name (VxMP Option)
  387. *
  388. * This routine searches the shared memory objects name database for an object
  389. * matching a specified <name>.  If the object is found, its value and type
  390. * are copied to the addresses pointed to by <pValue> and <pType>.  The value of 
  391. * <waitType> can be one of the following:
  392. * is
  393. * i `NO_WAIT (0)'
  394. * The call returns immediately, even if <name> is not in the database.
  395. * i `WAIT_FOREVER (-1)'
  396. * The call returns only when <name> is available in the database.  If <name>
  397. * is not already in, the database is scanned periodically as the routine
  398. * waits for <name> to be entered.
  399. * ie
  400. *
  401. * AVAILABILITY
  402. * This routine is distributed as a component of the unbundled shared memory
  403. * objects support option, VxMP.
  404. * RETURNS: OK, or ERROR if the object is not found, if <name> is too long, or
  405. * the wait type is invalid.
  406. *
  407. * ERRNO: 
  408. *  S_smNameLib_NOT_INITIALIZED  
  409. *  S_smNameLib_NAME_TOO_LONG 
  410. *  S_smNameLib_NAME_NOT_FOUND 
  411. *  S_smNameLib_INVALID_WAIT_TYPE 
  412. *  S_smObjLib_LOCK_TIMEOUT
  413. *
  414. * SEE ALSO: smNameShow
  415. */
  416. STATUS smNameFind 
  417.     (
  418.     char * name, /* name to search for */ 
  419.     void ** pValue, /* pointer where to return value */
  420.     int  * pType, /* pointer where to return object type */
  421.     int waitType /* NO_WAIT or WAIT_FOREVER */
  422.     )
  423.     {
  424.     BOOL        found;
  425.     if (pSmNameDb == NULL) /* name facility initialized ? */
  426.         {
  427.         errno = S_smNameLib_NOT_INITIALIZED;
  428.         return (ERROR);
  429.         }
  430.     if (strlen (name) > MAX_NAME_LENGTH) /* name too long */
  431.         {
  432.         errno = S_smNameLib_NAME_TOO_LONG;
  433.         return (ERROR);
  434.         }
  435.  
  436.     /* 
  437.      * Now if waitType is NO_WAIT, look for name in database once
  438.      * an return OK if name is found or ERROR if not found.
  439.      * if waitType is WAIT_FOREVER, do a loop until name is entered
  440.      * in the database by another task.
  441.      * In order to avoid CPU and BUS over use we use taskDelay (1) to
  442.      * delay and reschedule between each loop.
  443.      */
  444.     switch (waitType)
  445. {
  446. case NO_WAIT : 
  447.     {
  448.     return (smNameFindOnce (name, pValue, pType));
  449.     }
  450. case WAIT_FOREVER :
  451.     {
  452.          do
  453.                 {
  454.                 found = smNameFindOnce (name, pValue, pType);
  455.                                             /* look for name in database */
  456.                 /* ERROR not because name is not in database */
  457.         if ((found == ERROR) && (errno != S_smNameLib_NAME_NOT_FOUND)) 
  458.     {
  459.     return (ERROR);
  460.     }
  461.                 taskDelay (1);              /* force reschedule */
  462.                 } while (found != OK);
  463.             return (found);    
  464.     }
  465. default : 
  466.     {
  467.     errno = S_smNameLib_INVALID_WAIT_TYPE;
  468.     return (ERROR);
  469.             }
  470. }
  471.     }
  472. /******************************************************************************
  473. *
  474. * smNameFindByValueOnce - look up a shared symbol by value one time
  475. *
  476. * This routine searches the shared name database for an object matching a
  477. * specified identifier.  If the object is found, its name and type are copied
  478. * to <name> and <pType>. 
  479. *
  480. * RETURNS: OK, or ERROR if the object is not found.
  481. *
  482. * ERRNO: 
  483. *  S_smNameLib_VALUE_NOT_FOUND  
  484. *  S_smObjLib_LOCK_TIMEOUT
  485. *
  486. * NOMANUAL
  487. */
  488. LOCAL STATUS smNameFindByValueOnce 
  489.     (
  490.     void * value, /* value to search for */
  491.     char * name, /* pointer where to return name */ 
  492.     int  * pType /* pointer where to return object type */
  493.     )
  494.     {
  495.     SM_OBJ_NAME volatile * smName;
  496.     TASK_SAFE ();
  497.     if (semSmTake ((SM_SEM_ID)&pSmNameDb->sem, WAIT_FOREVER) != OK)
  498. { /* get exclusive access */
  499. TASK_UNSAFE ();
  500. return (ERROR);
  501. }
  502.     /* get first name in list */
  503.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  504.     smName = (SM_OBJ_NAME volatile *) SM_DL_FIRST (&pSmNameDb->nameList);
  505.     /* scan name list until id is found or end of list reached */
  506.     while (smName != LOC_NULL) 
  507. {
  508. if ((void *) ntohl ((int) smName->value) == value)/* value found */
  509.    {
  510.    /* copy name and type */
  511.    strcpy (name, (char *) smName->name);
  512.    *pType = ntohl (smName->type);
  513.         if (semSmGive ((SM_SEM_ID)&pSmNameDb->sem) != OK) 
  514.         { /* release access */
  515. TASK_UNSAFE ();
  516. return (ERROR);
  517. }
  518.    TASK_UNSAFE ();
  519.    return (OK);
  520.    }
  521. /* get next name in list */
  522.         CACHE_PIPE_FLUSH ();                    /* CACHE FLUSH   [SPR 68334] */
  523. smName = (SM_OBJ_NAME volatile *) SM_DL_NEXT (smName);
  524. }
  525.     if (semSmGive ((SM_SEM_ID)&pSmNameDb->sem) != OK)  /* release access */
  526. {
  527. TASK_UNSAFE ();
  528. return (ERROR);
  529. }
  530.     TASK_UNSAFE ();
  531.     errno = S_smNameLib_VALUE_NOT_FOUND;
  532.     return (ERROR);
  533.     }
  534. /******************************************************************************
  535. *
  536. * smNameFindByValue - look up a shared memory object by value (VxMP Option)
  537. *
  538. * This routine searches the shared memory name database for an object matching
  539. * a specified value.  If the object is found, its name and type are copied
  540. * to the addresses pointed to by <name> and <pType>.  The value of <waitType> 
  541. * can be one of the following:
  542. *
  543. * is
  544. * i `NO_WAIT (0)'
  545. * The call returns immediately, even if the object value is not in the database.
  546. * i `WAIT_FOREVER (-1)'
  547. * The call returns only when the object value is available in the database.
  548. * ie
  549. *
  550. * AVAILABILITY
  551. * This routine is distributed as a component of the unbundled shared memory
  552. * objects support option, VxMP.
  553. * RETURNS: OK, or ERROR if <value> is not found or if the wait type is invalid.
  554. *
  555. * ERRNO: 
  556. *  S_smNameLib_NOT_INITIALIZED 
  557. *  S_smNameLib_VALUE_NOT_FOUND 
  558. *  S_smNameLib_INVALID_WAIT_TYPE  
  559. *  S_smObjLib_LOCK_TIMEOUT
  560. *
  561. * SEE ALSO: smNameShow
  562. */
  563. STATUS smNameFindByValue 
  564.     (
  565.     void * value, /* value to search for */
  566.     char * name, /* pointer where to return name */ 
  567.     int  * pType, /* pointer where to return object type */
  568.     int waitType /* NO_WAIT or WAIT_FOREVER */
  569.     )
  570.     {
  571.     BOOL found;
  572.     if (pSmNameDb == NULL) /* name facility initialized ? */
  573. {
  574. errno = S_smNameLib_NOT_INITIALIZED;
  575. return (ERROR);
  576. }
  577.     /* 
  578.      * Now if waitType is NO_WAIT, look for id in database once
  579.      * an return OK if id is found or ERROR if not found.
  580.      * if waitType is WAIT_FOREVER, do a loop until id is entered
  581.      * in the database by another task.
  582.      * In order to avoid CPU and BUS over use we use taskDelay (1) to
  583.      * delay and reschedule between each loop.
  584.      */
  585.     switch (waitType)
  586. {
  587. case NO_WAIT : 
  588.     {
  589.     return (smNameFindByValueOnce (value, name, pType));
  590.     }
  591. case WAIT_FOREVER :
  592.     {
  593.          do
  594.                 {
  595.                 found = smNameFindByValueOnce (value, name, pType);
  596.                                             /* look for name in database */
  597.                 /* ERROR not because id is not in database */
  598.         if ((found == ERROR) && (errno != S_smNameLib_VALUE_NOT_FOUND)) 
  599.     {
  600.     return (ERROR);
  601.     }
  602.                 taskDelay (1);              /* force reschedule */
  603.                 }while (found != OK);
  604.             return (found);    
  605.     }
  606. default : 
  607.     {
  608.     errno = S_smNameLib_INVALID_WAIT_TYPE;
  609.     return (ERROR);
  610.             }
  611. }
  612.     }
  613. /******************************************************************************
  614. *
  615. * smNameRemove - remove an object from the shared memory objects name database (VxMP Option)
  616. *
  617. * This routine removes an object called <name> from the shared memory objects
  618. * name database. 
  619. * AVAILABILITY
  620. * This routine is distributed as a component of the unbundled shared memory
  621. * objects support option, VxMP.
  622. * RETURNS: OK, or ERROR if the object name is not in the database or if
  623. * <name> is too long.
  624. *
  625. * ERRNO: 
  626. *  S_smNameLib_NOT_INITIALIZED  
  627. *  S_smNameLib_NAME_TOO_LONG 
  628. *  S_smNameLib_NAME_NOT_FOUND 
  629. *  S_smObjLib_LOCK_TIMEOUT
  630. *
  631. * SEE ALSO: smNameShow
  632. */
  633. STATUS smNameRemove
  634.     (
  635.     char * name /* name of object to remove */
  636.     )
  637.     {
  638.     SM_OBJ_NAME volatile * smName;
  639.     int    temp; /* value for bus bridge flush */
  640.     if (pSmNameDb == NULL) /* name facility initialized ? */
  641. {
  642. errno = S_smNameLib_NOT_INITIALIZED;
  643. return (ERROR);
  644. }
  645.     if (strlen (name) > MAX_NAME_LENGTH) /* name too long */
  646. {
  647. errno = S_smNameLib_NAME_TOO_LONG;
  648. return (ERROR);
  649. }
  650.     TASK_SAFE (); /* get exclusive access */
  651.     if (semSmTake ((SM_SEM_ID)&pSmNameDb->sem, WAIT_FOREVER) != OK)
  652. {
  653. TASK_UNSAFE ();
  654. return (ERROR);
  655. }
  656.     /* get first name in list */
  657.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  658.     smName = (SM_OBJ_NAME volatile *) SM_DL_FIRST (&pSmNameDb->nameList);
  659.     /* loop until name is found or end of list */
  660.     while (smName != LOC_NULL) 
  661. {
  662. if (strcmp((char *)smName->name, name) == 0) /* name found */
  663.     {
  664.     smDllRemove ((SM_DL_LIST *)&pSmNameDb->nameList,
  665.                  (SM_DL_NODE *)smName);
  666.     smMemPartFree ((SM_PART_ID)smNamePartId, (char *) smName);
  667.          /* update element number */
  668.          pSmNameDb->curNumName = htonl (ntohl (pSmNameDb->curNumName) - 1);
  669.             /* update shared infos data */
  670.             pSmObjHdr->curNumName = htonl (ntohl (pSmObjHdr->curNumName) - 1);
  671.             CACHE_PIPE_FLUSH ();                /* CACHE FLUSH   [SPR 68334] */
  672.             temp = pSmNameDb->curNumName; /* BRIDGE FLUSH  [SPR 68334] */
  673.          if (semSmGive ((SM_SEM_ID)&pSmNameDb->sem) != OK)
  674.         { /* release access */
  675. TASK_UNSAFE ();
  676. return (ERROR);
  677. }
  678.     TASK_UNSAFE ();
  679.     return (OK);
  680.     }
  681. /* get next name in list */
  682.         CACHE_PIPE_FLUSH ();                    /* CACHE FLUSH   [SPR 68334] */
  683. smName = (SM_OBJ_NAME volatile *) SM_DL_NEXT (smName);
  684. }
  685.     
  686.     if (semSmGive ((SM_SEM_ID)&pSmNameDb->sem) != OK)  /* release access */
  687. {
  688. TASK_UNSAFE ();
  689. return (ERROR);
  690. }
  691.     TASK_UNSAFE ();
  692.     errno = S_smNameLib_NAME_NOT_FOUND;
  693.     return (ERROR);
  694.     }