Annotation of sbbs/include/mozilla/nspr/prmwait.h, revision 1.1

1.1     ! root        1: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
        !             2: /* 
        !             3:  * The contents of this file are subject to the Mozilla Public
        !             4:  * License Version 1.1 (the "License"); you may not use this file
        !             5:  * except in compliance with the License. You may obtain a copy of
        !             6:  * the License at http://www.mozilla.org/MPL/
        !             7:  * 
        !             8:  * Software distributed under the License is distributed on an "AS
        !             9:  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
        !            10:  * implied. See the License for the specific language governing
        !            11:  * rights and limitations under the License.
        !            12:  * 
        !            13:  * The Original Code is the Netscape Portable Runtime (NSPR).
        !            14:  * 
        !            15:  * The Initial Developer of the Original Code is Netscape
        !            16:  * Communications Corporation.  Portions created by Netscape are 
        !            17:  * Copyright (C) 1998-2000 Netscape Communications Corporation.  All
        !            18:  * Rights Reserved.
        !            19:  * 
        !            20:  * Contributor(s):
        !            21:  * 
        !            22:  * Alternatively, the contents of this file may be used under the
        !            23:  * terms of the GNU General Public License Version 2 or later (the
        !            24:  * "GPL"), in which case the provisions of the GPL are applicable 
        !            25:  * instead of those above.  If you wish to allow use of your 
        !            26:  * version of this file only under the terms of the GPL and not to
        !            27:  * allow others to use your version of this file under the MPL,
        !            28:  * indicate your decision by deleting the provisions above and
        !            29:  * replace them with the notice and other provisions required by
        !            30:  * the GPL.  If you do not delete the provisions above, a recipient
        !            31:  * may use your version of this file under either the MPL or the
        !            32:  * GPL.
        !            33:  */
        !            34: 
        !            35: #if defined(_PRMWAIT_H)
        !            36: #else
        !            37: #define _PRMWAIT_H
        !            38: 
        !            39: #include "prio.h"
        !            40: #include "prtypes.h"
        !            41: #include "prclist.h"
        !            42: 
        !            43: PR_BEGIN_EXTERN_C
        !            44: 
        !            45: /********************************************************************************/
        !            46: /********************************************************************************/
        !            47: /********************************************************************************/
        !            48: /******************************       WARNING        ****************************/
        !            49: /********************************************************************************/
        !            50: /**************************** This is work in progress. *************************/
        !            51: /************************** Do not make any assumptions *************************/
        !            52: /************************** about the stability of this *************************/
        !            53: /************************** API or the underlying imple- ************************/
        !            54: /************************** mentation.                   ************************/
        !            55: /********************************************************************************/
        !            56: /********************************************************************************/
        !            57: 
        !            58: /*
        !            59: ** STRUCTURE:   PRWaitGroup
        !            60: ** DESCRIPTION:
        !            61: **      The client may define several wait groups in order to semantically
        !            62: **      tie a collection of file descriptors for a single purpose. This allows
        !            63: **      easier dispatching of threads that returned with active file descriptors
        !            64: **      from the wait function.
        !            65: */
        !            66: typedef struct PRWaitGroup PRWaitGroup;
        !            67: 
        !            68: /*
        !            69: ** ENUMERATION: PRMWStatus
        !            70: ** DESCRIPTION:
        !            71: **      This enumeration is used to indicate the completion status of
        !            72: **      a receive wait object. Generally stated, a positive value indicates
        !            73: **      that the operation is not yet complete. A zero value indicates
        !            74: **      success (similar to PR_SUCCESS) and any negative value is an
        !            75: **      indication of failure. The reason for the failure can be retrieved
        !            76: **      by calling PR_GetError().
        !            77: **
        !            78: **  PR_MW_PENDING       The operation is still pending. None of the other
        !            79: **                      fields of the object are currently valid.
        !            80: **  PR_MW_SUCCESS       The operation is complete and it was successful.
        !            81: **  PR_MW_FAILURE       The operation failed. The reason for the failure
        !            82: **                      can be retrieved by calling PR_GetError().
        !            83: **  PR_MW_TIMEOUT       The amount of time allowed for by the object's
        !            84: **                      'timeout' field has expired w/o the operation
        !            85: **                      otherwise coming to closure.
        !            86: **  PR_MW_INTERRUPT     The operation was cancelled, either by the client
        !            87: **                      calling PR_CancelWaitFileDesc() or destroying the
        !            88: **                      entire wait group (PR_DestroyWaitGroup()).
        !            89: */
        !            90: typedef enum PRMWStatus
        !            91: {
        !            92:     PR_MW_PENDING = 1,
        !            93:     PR_MW_SUCCESS = 0,
        !            94:     PR_MW_FAILURE = -1,
        !            95:     PR_MW_TIMEOUT = -2,
        !            96:     PR_MW_INTERRUPT = -3
        !            97: } PRMWStatus;
        !            98: 
        !            99: /*
        !           100: ** STRUCTURE:   PRMemoryDescriptor
        !           101: ** DESCRIPTION:
        !           102: **      THis is a descriptor for an interval of memory. It contains a
        !           103: **      pointer to the first byte of that memory and the length (in
        !           104: **      bytes) of the interval.
        !           105: */
        !           106: typedef struct PRMemoryDescriptor
        !           107: {
        !           108:     void *start;                /* pointer to first byte of memory */
        !           109:     PRSize length;              /* length (in bytes) of memory interval */
        !           110: } PRMemoryDescriptor;
        !           111: 
        !           112: /*
        !           113: ** STRUCTURE:   PRMWaitClientData
        !           114: ** DESCRIPTION:
        !           115: **      An opague stucture for which a client MAY give provide a concrete
        !           116: **      definition and associate with a receive descriptor. The NSPR runtime
        !           117: **      does not manage this field. It is completely up to the client.
        !           118: */
        !           119: typedef struct PRMWaitClientData PRMWaitClientData;
        !           120: 
        !           121: /*
        !           122: ** STRUCTURE:   PRRecvWait
        !           123: ** DESCRIPTION:
        !           124: **      A receive wait object contains the file descriptor that is subject
        !           125: **      to the wait and the amount of time (beginning epoch established
        !           126: **      when the object is presented to the runtime) the the channel should
        !           127: **      block before abandoning the process.
        !           128: **
        !           129: **      The success of the wait operation will be noted in the object's
        !           130: **      'outcome' field. The fields are not valid when the NSPR runtime
        !           131: **      is in possession of the object.
        !           132: **
        !           133: **      The memory descriptor describes an interval of writable memory
        !           134: **      in the caller's address space where data from an initial read
        !           135: **      can be placed. The description may indicate a null interval.
        !           136: */
        !           137: typedef struct PRRecvWait 
        !           138: {
        !           139:     PRCList internal;           /* internal runtime linkages */
        !           140: 
        !           141:     PRFileDesc *fd;             /* file descriptor associated w/ object */
        !           142:     PRMWStatus outcome;         /* outcome of the current/last operation */
        !           143:     PRIntervalTime timeout;     /* time allowed for entire operation */
        !           144: 
        !           145:     PRInt32 bytesRecv;          /* number of bytes transferred into buffer */
        !           146:     PRMemoryDescriptor buffer;  /* where to store first segment of input data */
        !           147:     PRMWaitClientData *client;  /* pointer to arbitrary client defined data */
        !           148: } PRRecvWait;
        !           149: 
        !           150: /*
        !           151: ** STRUCTURE:   PRMWaitEnumerator
        !           152: ** DESCRIPTION:
        !           153: **      An enumeration object is used to store the state of an existing
        !           154: **      enumeration over a wait group. The opaque object must be allocated
        !           155: **      by the client and the reference presented on each call to the
        !           156: **      pseudo-stateless enumerator. The enumeration objects are sharable
        !           157: **      only in serial fashion.
        !           158: */
        !           159: typedef struct PRMWaitEnumerator PRMWaitEnumerator;
        !           160: 
        !           161: 
        !           162: /*
        !           163: ** FUNCTION:    PR_AddWaitFileDesc
        !           164: ** DESCRIPTION:
        !           165: **      This function will effectively add a file descriptor to the
        !           166: **      list of those waiting for network receive. The new descriptor
        !           167: **      will be semantically tied to the wait group specified.
        !           168: **
        !           169: **      The ownership for the storage pointed to by 'desc' is temporarily
        !           170: **      passed over the the NSPR runtime. It will be handed back by the
        !           171: **      function PR_WaitRecvReady().
        !           172: **
        !           173: **  INPUTS
        !           174: **      group       A reference to a PRWaitGroup or NULL. Wait groups are
        !           175: **                  created by calling PR_CreateWaitGroup() and are used
        !           176: **                  to semantically group various file descriptors by the
        !           177: **                  client's application.
        !           178: **      desc        A reference to a valid PRRecvWait. The object of the
        !           179: **                  reference must be preserved and not be modified
        !           180: **                  until its ownership is returned to the client.
        !           181: **  RETURN
        !           182: **      PRStatus    An indication of success. If equal to PR_FAILUE details
        !           183: **                  of the failure are avaiable via PR_GetError().
        !           184: **
        !           185: **  ERRORS
        !           186: **      PR_INVALID_ARGUMENT_ERROR
        !           187: **                  Invalid 'group' identifier or duplicate 'desc' object.
        !           188: **      PR_OUT_OF_MEMORY_ERROR
        !           189: **                  Insuffient memory for internal data structures.
        !           190: **      PR_INVALID_STATE_ERROR
        !           191: **                  The group is being destroyed.
        !           192: */
        !           193: NSPR_API(PRStatus) PR_AddWaitFileDesc(PRWaitGroup *group, PRRecvWait *desc);
        !           194: 
        !           195: /*
        !           196: ** FUNCTION:    PR_WaitRecvReady
        !           197: ** DESCRIPTION:
        !           198: **      PR_WaitRecvReady will block the calling thread until one of the
        !           199: **      file descriptors that have been added via PR_AddWaitFileDesc is
        !           200: **      available for input I/O.
        !           201: **  INPUT
        !           202: **      group       A pointer to a valid PRWaitGroup or NULL (the null
        !           203: **                  group. The function will block the caller until a
        !           204: **                  channel from the wait group becomes ready for receive
        !           205: **                  or there is some sort of error.
        !           206: **  RETURN
        !           207: **      PRReciveWait
        !           208: **                  When the caller is resumed it is either returned a
        !           209: **                  valid pointer to a previously added receive wait or
        !           210: **                  a NULL. If the latter, the function has terminated
        !           211: **                  for a reason that can be determined by calling
        !           212: **                  PR_GetError().
        !           213: **                  If a valid pointer is returned, the reference is to the
        !           214: **                  file descriptor contained in the receive wait object.
        !           215: **                  The outcome of the wait operation may still fail, and
        !           216: **                  if it has, that fact will be noted in the object's
        !           217: **                  outcome field. Details can be retrieved from PR_GetError().
        !           218: **
        !           219: **  ERRORS
        !           220: **      PR_INVALID_ARGUMENT_ERROR
        !           221: **                  The 'group' is not known by the runtime.
        !           222: **      PR_PENDING_INTERRUPT_ERROR
        !           223:                     The thread was interrupted.
        !           224: **      PR_INVALID_STATE_ERROR
        !           225: **                  The group is being destroyed.
        !           226: */
        !           227: NSPR_API(PRRecvWait*) PR_WaitRecvReady(PRWaitGroup *group);
        !           228: 
        !           229: /*
        !           230: ** FUNCTION:    PR_CancelWaitFileDesc
        !           231: ** DESCRIPTION:
        !           232: **      PR_CancelWaitFileDesc is provided as a means for cancelling operations
        !           233: **      on objects previously submitted by use of PR_AddWaitFileDesc(). If
        !           234: **      the runtime knows of the object, it will be marked as having failed
        !           235: **      because it was interrupted (similar to PR_Interrupt()). The first
        !           236: **      available thread waiting on the group will be made to return the
        !           237: **      PRRecvWait object with the outcome noted.
        !           238: **
        !           239: **  INPUTS
        !           240: **      group       The wait group under which the wait receive object was
        !           241: **                  added.
        !           242: **      desc        A pointer to the wait receive object that is to be
        !           243: **                  cancelled.
        !           244: **  RETURN
        !           245: **      PRStatus    If the wait receive object was located and associated
        !           246: **                  with the specified wait group, the status returned will
        !           247: **                  be PR_SUCCESS. There is still a race condition that would
        !           248: **                  permit the offected object to complete normally, but it
        !           249: **                  is assured that it will complete in the near future.
        !           250: **                  If the receive object or wait group are invalid, the
        !           251: **                  function will return with a status of PR_FAILURE.
        !           252: **
        !           253: **  ERRORS
        !           254: **      PR_INVALID_ARGUMENT_ERROR
        !           255: **                  The 'group' argument is not recognized as a valid group.
        !           256: **      PR_COLLECTION_EMPTY_ERROR
        !           257: **                  There are no more receive wait objects in the group's
        !           258: **                  collection.
        !           259: **      PR_INVALID_STATE_ERROR
        !           260: **                  The group is being destroyed.
        !           261: */
        !           262: NSPR_API(PRStatus) PR_CancelWaitFileDesc(PRWaitGroup *group, PRRecvWait *desc);
        !           263: 
        !           264: /*
        !           265: ** FUNCTION:    PR_CancelWaitGroup
        !           266: ** DESCRIPTION:
        !           267: **      PR_CancelWaitGroup is provided as a means for cancelling operations
        !           268: **      on objects previously submitted by use of PR_AddWaitFileDesc(). Each
        !           269: **      successive call will return a pointer to a PRRecvWait object that
        !           270: **      was previously registered via PR_AddWaitFileDesc(). If no wait
        !           271: **      objects are associated with the wait group, a NULL will be returned.
        !           272: **      This function should be called in a loop until a NULL is returned
        !           273: **      to reclaim all the wait objects prior to calling PR_DestroyWaitGroup().
        !           274: **
        !           275: **  INPUTS
        !           276: **      group       The wait group under which the wait receive object was
        !           277: **                  added.
        !           278: **  RETURN
        !           279: **      PRRecvWait* If the wait group is valid and at least one receive wait
        !           280: **                  object is present in the group, that object will be
        !           281: **                  marked as PR_MW_INTERRUPT'd and removed from the group's
        !           282: **                  queues. Otherwise a NULL will be returned and the reason
        !           283: **                  for the NULL may be retrieved by calling PR_GetError().
        !           284: **
        !           285: **  ERRORS
        !           286: **      PR_INVALID_ARGUMENT_ERROR
        !           287: **      PR_GROUP_EMPTY_ERROR
        !           288: */
        !           289: NSPR_API(PRRecvWait*) PR_CancelWaitGroup(PRWaitGroup *group);
        !           290: 
        !           291: /*
        !           292: ** FUNCTION:    PR_CreateWaitGroup
        !           293: ** DESCRIPTION:
        !           294: **      A wait group is an opaque object that a client may create in order
        !           295: **      to semantically group various wait requests. Each wait group is
        !           296: **      unique, including the default wait group (NULL). A wait request
        !           297: **      that was added under a wait group will only be serviced by a caller
        !           298: **      that specified the same wait group.
        !           299: **
        !           300: **  INPUT
        !           301: **      size        The size of the hash table to be used to contain the
        !           302: **                  receive wait objects. This is just the initial size.
        !           303: **                  It will grow as it needs to, but to avoid that hassle
        !           304: **                  one can suggest a suitable size initially. It should
        !           305: **                  be ~30% larger than the maximum number of receive wait
        !           306: **                  objects expected.
        !           307: **  RETURN
        !           308: **      PRWaitGroup If successful, the function will return a pointer to an
        !           309: **                  object that was allocated by and owned by the runtime.
        !           310: **                  The reference remains valid until it is explicitly destroyed
        !           311: **                  by calling PR_DestroyWaitGroup().
        !           312: **
        !           313: **  ERRORS
        !           314: **      PR_OUT_OF_MEMORY_ERROR
        !           315: */
        !           316: NSPR_API(PRWaitGroup*) PR_CreateWaitGroup(PRInt32 size);
        !           317: 
        !           318: /*
        !           319: ** FUNCTION:    PR_DestroyWaitGroup
        !           320: ** DESCRIPTION:
        !           321: **      Undo the effects of PR_CreateWaitGroup(). Any receive wait operations
        !           322: **      on the group will be treated as if the each had been the target of a
        !           323: **      PR_CancelWaitFileDesc().
        !           324: **
        !           325: **  INPUT
        !           326: **      group       Reference to a wait group previously allocated using
        !           327: **                  PR_CreateWaitGroup().
        !           328: **  RETURN
        !           329: **      PRStatus    Will be PR_SUCCESS if the wait group was valid and there
        !           330: **                  are no receive wait objects in that group. Otherwise
        !           331: **                  will indicate PR_FAILURE.
        !           332: **
        !           333: **  ERRORS
        !           334: **      PR_INVALID_ARGUMENT_ERROR
        !           335: **                  The 'group' argument does not reference a known object.
        !           336: **      PR_INVALID_STATE_ERROR
        !           337: **                  The group still contains receive wait objects.
        !           338: */
        !           339: NSPR_API(PRStatus) PR_DestroyWaitGroup(PRWaitGroup *group);
        !           340: 
        !           341: /*
        !           342: ** FUNCTION:    PR_CreateMWaitEnumerator
        !           343: ** DESCRIPTION:
        !           344: **      The PR_CreateMWaitEnumerator() function returns a reference to an
        !           345: **      opaque PRMWaitEnumerator object. The enumerator object is required
        !           346: **      as an argument for each successive call in the stateless enumeration
        !           347: **      of the indicated wait group.
        !           348: **
        !           349: **      group       The wait group that the enumeration is intended to
        !           350: **                  process. It may be be the default wait group (NULL).
        !           351: ** RETURN
        !           352: **      PRMWaitEnumerator* group
        !           353: **                  A reference to an object that will be used to store
        !           354: **                  intermediate state of enumerations.
        !           355: ** ERRORS
        !           356: **      Errors are indicated by the function returning a NULL.
        !           357: **      PR_INVALID_ARGUMENT_ERROR
        !           358: **                  The 'group' argument does not reference a known object.
        !           359: **      PR_OUT_OF_MEMORY_ERROR
        !           360: */
        !           361: NSPR_API(PRMWaitEnumerator*) PR_CreateMWaitEnumerator(PRWaitGroup *group);
        !           362: 
        !           363: /*
        !           364: ** FUNCTION:    PR_DestroyMWaitEnumerator
        !           365: ** DESCRIPTION:
        !           366: **      Destroys the object created by PR_CreateMWaitEnumerator(). The reference
        !           367: **      used as an argument becomes invalid.
        !           368: **
        !           369: ** INPUT
        !           370: **      PRMWaitEnumerator* enumerator
        !           371: **          The PRMWaitEnumerator object to destroy.
        !           372: ** RETURN
        !           373: **      PRStatus
        !           374: **          PR_SUCCESS if successful, PR_FAILURE otherwise.
        !           375: ** ERRORS
        !           376: **      PR_INVALID_ARGUMENT_ERROR
        !           377: **                  The enumerator is invalid.
        !           378: */
        !           379: NSPR_API(PRStatus) PR_DestroyMWaitEnumerator(PRMWaitEnumerator* enumerator);
        !           380: 
        !           381: /*
        !           382: ** FUNCTION:    PR_EnumerateWaitGroup
        !           383: ** DESCRIPTION:
        !           384: **      PR_EnumerateWaitGroup is a thread safe enumerator over a wait group.
        !           385: **      Each call to the enumerator must present a valid PRMWaitEnumerator
        !           386: **      rererence and a pointer to the "previous" element returned from the
        !           387: **      enumeration process or a NULL.
        !           388: **
        !           389: **      An enumeration is started by passing a NULL as the "previous" value.
        !           390: **      Subsequent calls to the enumerator must pass in the result of the
        !           391: **      previous call. The enumeration end is signaled by the runtime returning
        !           392: **      a NULL as the result.
        !           393: **
        !           394: **      Modifications to the content of the wait group are allowed during
        !           395: **      an enumeration. The effect is that the enumeration may have to be
        !           396: **      "reset" and that may result in duplicates being returned from the
        !           397: **      enumeration.
        !           398: **
        !           399: **      An enumeration may be abandoned at any time. The runtime is not
        !           400: **      keeping any state, so there are no issues in that regard.
        !           401: */
        !           402: NSPR_API(PRRecvWait*) PR_EnumerateWaitGroup(
        !           403:     PRMWaitEnumerator *enumerator, const PRRecvWait *previous);
        !           404:    
        !           405: PR_END_EXTERN_C
        !           406: 
        !           407: #endif /* defined(_PRMWAIT_H) */
        !           408: 
        !           409: /* prmwait.h */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.