home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / rom / utility / remnamedobject.c < prev    next >
C/C++ Source or Header  |  1997-01-27  |  3KB  |  133 lines

  1. /*
  2.     $Id: remnamedobject.c,v 1.3 1997/01/27 13:17:14 digulla Exp $
  3.     $Log: remnamedobject.c,v $
  4.     Revision 1.3  1997/01/27 13:17:14  digulla
  5.     Added #include <proto/exec.h>
  6.  
  7.     Revision 1.2  1997/01/27 00:32:32  ldp
  8.     Polish
  9.  
  10.     Revision 1.1  1996/12/18 01:27:36  iaint
  11.     NamedObjects
  12.  
  13.     Desc: RemNamedObject() - Remove a NamedObject from a NameSpace.
  14.     Lang: english
  15. */
  16. #include <proto/exec.h>
  17. #include "utility_intern.h"
  18.  
  19. /*****************************************************************************
  20.  
  21.     NAME */
  22.     #include <proto/utility.h>
  23.  
  24.     AROS_LH2(void, RemNamedObject,
  25.  
  26. /*  SYNOPSIS */
  27.     AROS_LHA(struct NamedObject *, object, A0),
  28.     AROS_LHA(struct Message     *, message, A1),
  29.  
  30. /*  LOCATION */
  31.     struct UtilityBase *, UtilityBase, 44, Utility)
  32.  
  33. /*  FUNCTION
  34.     Removes a NamedObject from a NameSpace. If the NamedObject cannot
  35.     be removed at the time of this call, then the call will return
  36.     without removing the NamedObject. However it will mark the
  37.     NamedObject as "waiting for removal", and when the number of users
  38.     of a NamedObject = 0, it will ReplyMsg() the message which is
  39.     supplied as a parameter. When the message is replied it will have
  40.     either the address of the object if it was removed, or NULL if it
  41.     was not removed, or removed by another method stored in the
  42.     message->mn_Node.ln_Name field of the message structure.
  43.  
  44.     INPUTS
  45.     object        -    The NamedObject to attempt to remove.
  46.     message     -    The message to send. This message is a standard
  47.             Exec Message, which MUST have the mn_ReplyPort
  48.             field correctly set. The mn_Node.ln_Name field
  49.             will contain the address of the NamedObject or NULL
  50.             upon arrival at your port.
  51.  
  52.     RESULT
  53.     The NamedObject will be removed if possible, or marked for removal
  54.     at the next best moment.
  55.  
  56.     NOTES
  57.     Since this function effectively does a ReleaseNamedObject(), you
  58.     must have found this object first.
  59.  
  60.     EXAMPLE
  61.  
  62.     BUGS
  63.  
  64.     SEE ALSO
  65.     utility/name.h, AttemptRemNamedObject(), AddNamedObject()
  66.  
  67.     INTERNALS
  68.     AttemptRemNamedObject() calls this function with a NULL message,
  69.     expecting that we remove the object if possible, or just return.
  70.  
  71.     HISTORY
  72.     29-10-95    digulla automatically created from
  73.                 utility_lib.fd and clib/utility_protos.h
  74.     11-08-96    iaint   Adapted for AROS for stuff I did earlier.
  75.  
  76. *****************************************************************************/
  77. {
  78.     AROS_LIBFUNC_INIT
  79.  
  80.     struct NameSpace       *ns;
  81.     struct IntNamedObject *no;
  82.  
  83.     if(object)
  84.     {
  85.     Forbid();
  86.  
  87.     no = GetIntNamedObject( object );
  88.     ns = no->no_ParentSpace;
  89.  
  90.     /* If ns == 0, then this node hasn't been added to anywhere */
  91.     if( ns )
  92.     {
  93.         /* If the UseCount > 1, then we can't remove at the moment.
  94.            It must be greater than 1, since the user should have
  95.            called FindNamedObject() on this object first.
  96.         */
  97.         if( no->no_UseCount > 1)
  98.         {
  99.         /* If we have a message, attach it, otherwise return */
  100.         if( message )
  101.         {
  102.             message->mn_Node.ln_Name = (STRPTR)object;
  103.             no->no_FreeMessage = message;
  104.         }
  105.  
  106.         Permit();
  107.         return;
  108.         }
  109.  
  110.         /* Ok, so we can remove the NamedObject */
  111.         ObtainSemaphore( &ns->ns_Lock );
  112.  
  113.         Remove( (struct Node *)no );
  114.         no->no_UseCount = 0;
  115.  
  116.         if( message )
  117.         {
  118.         message->mn_Node.ln_Name = (STRPTR)object;
  119.         no->no_FreeMessage = message;
  120.         ReplyMsg( message );
  121.         }
  122.         ReleaseSemaphore( &ns->ns_Lock );
  123.  
  124.     } /* if ( ns ) */
  125.  
  126.     Permit();
  127.  
  128.     } /* if( object ) */
  129.  
  130.     AROS_LIBFUNC_EXIT
  131.  
  132. } /* RemNamedObject */
  133.