summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/src/objectlocaliterate.c
blob: e4b0f28de84a7c21c53fc71a6556d737533ef2a8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 *  object iterator
 *
 *
 *  COPYRIGHT (c) 2000.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in found in the file LICENSE in this distribution or at
 *  http://www.OARcorp.com/rtems/license.html.
 *
 *  $Id$
 */

#include <rtems/system.h>
#include <rtems/score/object.h>

/*PAGE
 *
 *  _Objects_Local_iterate
 *
 *  DESCRIPTION:
 *
 *  This function invokes the callback function for each existing object
 *  of the type specified by the information block pointer. Iteration
 *  continues until either all objects have been processed, or, if
 *  break_on_error is TRUE, until an invocation of the callback returns
 *  something other than 0.
 *
 *  Input parameters:
 *    information:
 *      A pointer to an Objects_Information block. Determines the type of
 *      object over which to iterate.
 *    callback:
 *      A pointer to a function with the indicated signature.
 *    arg: 
 *      A pointer to some arbitrary entity. Passed on to the callback.
 *    break_on_error
 *      If TRUE, stop iterating on error.
 *
 *  Output parameters: NONE
 *    But callback may write into space pointed to by arg.
 *
 *  Return value:
 *    0 if successful
 *    Value returned by the callback otherwise.
 */

unsigned32 _Objects_Local_iterate(
  Objects_Information  *information,
  unsigned32          (*callback)(Objects_Control *object, void * arg),
  void                 *arg,
  boolean               break_on_error
)
{
  unsigned32       result;
  unsigned32       i;
  Objects_Control *the_object;

  if ( !information )
    return 0;
    
  if ( !callback )
    return 0;   
    
  for( i = 1; i <= information->maximum; i++ ) {
    the_object = (Objects_Control *)information->local_table[i];
    if( the_object ) {
      result = (*callback)( the_object, arg );
      if ( result && break_on_error )
        return result;
    }
  }
    
  return 0;
}