Home ⌂Doc Index ◂Up ▴
Intel(R) Threading Building Blocks Doxygen Documentation  version 4.2.3
tbb::flow::interface10::graph Class Reference

The graph class. More...

#include <_flow_graph_impl.h>

Inheritance diagram for tbb::flow::interface10::graph:
Collaboration diagram for tbb::flow::interface10::graph:

Classes

class  run_and_put_task
 
class  run_task
 
class  spawn_functor
 A functor that spawns a task. More...
 
class  wait_functor
 

Public Types

typedef tbb::flow::interface11::graph_iterator< graph, tbb::flow::interface11::graph_nodeiterator
 
typedef tbb::flow::interface11::graph_iterator< const graph, const tbb::flow::interface11::graph_nodeconst_iterator
 

Public Member Functions

 graph ()
 Constructs a graph with isolated task_group_context. More...
 
 graph (tbb::task_group_context &use_this_context)
 Constructs a graph with use_this_context as context. More...
 
 ~graph ()
 Destroys the graph. More...
 
__TBB_DEPRECATED void increment_wait_count ()
 
__TBB_DEPRECATED void decrement_wait_count ()
 
void reserve_wait () __TBB_override
 Used to register that an external entity may still interact with the graph. More...
 
void release_wait () __TBB_override
 Deregisters an external entity that may have interacted with the graph. More...
 
template<typename Receiver , typename Body >
__TBB_DEPRECATED void run (Receiver &r, Body body)
 Spawns a task that runs a body and puts its output to a specific receiver. More...
 
template<typename Body >
__TBB_DEPRECATED void run (Body body)
 Spawns a task that runs a function object. More...
 
void wait_for_all ()
 Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls. More...
 
__TBB_DEPRECATED tbb::taskroot_task ()
 Returns the root task of the graph. More...
 
iterator begin ()
 start iterator More...
 
iterator end ()
 end iterator More...
 
const_iterator begin () const
 start const iterator More...
 
const_iterator end () const
 end const iterator More...
 
const_iterator cbegin () const
 start const iterator More...
 
const_iterator cend () const
 end const iterator More...
 
bool is_cancelled ()
 return status of graph execution More...
 
bool exception_thrown ()
 
void reset (tbb::flow::interface11::reset_flags f=tbb::flow::interface11::rf_reset_protocol)
 
- Public Member Functions inherited from tbb::flow::interface11::graph_proxy
virtual ~graph_proxy ()
 

Private Types

typedef std::list< tbb::task * > task_list_type
 

Private Member Functions

void prepare_task_arena (bool reinit=false)
 
void register_node (tbb::flow::interface11::graph_node *n)
 
void remove_node (tbb::flow::interface11::graph_node *n)
 
- Private Member Functions inherited from tbb::internal::no_copy
 no_copy (const no_copy &)=delete
 
 no_copy ()=default
 

Private Attributes

tbb::taskmy_root_task
 
tbb::task_group_contextmy_context
 
bool own_context
 
bool cancelled
 
bool caught_exception
 
bool my_is_active
 
task_list_type my_reset_task_list
 
tbb::flow::interface11::graph_nodemy_nodes
 
tbb::flow::interface11::graph_nodemy_nodes_last
 
tbb::spin_mutex nodelist_mutex
 
tbb::task_arenamy_task_arena
 
tbb::flow::interface11::internal::graph_task_priority_queue_t my_priority_queue
 

Friends

class tbb::flow::interface11::graph_node
 
template<typename C , typename N >
class tbb::flow::interface11::graph_iterator
 
class tbb::interface7::internal::task_arena_base
 
void tbb::flow::interface11::internal::activate_graph (graph &g)
 
void tbb::flow::interface11::internal::deactivate_graph (graph &g)
 
bool tbb::flow::interface11::internal::is_graph_active (graph &g)
 
tbb::tasktbb::flow::interface11::internal::prioritize_task (graph &g, tbb::task &arena_task)
 
void tbb::flow::interface11::internal::spawn_in_graph_arena (graph &g, tbb::task &arena_task)
 
void tbb::flow::interface11::internal::enqueue_in_graph_arena (graph &g, tbb::task &arena_task)
 
void tbb::flow::interface11::internal::add_task_to_graph_reset_list (graph &g, tbb::task *tp)
 

Detailed Description

The graph class.

This class serves as a handle to the graph

Definition at line 211 of file _flow_graph_impl.h.

Member Typedef Documentation

◆ const_iterator

◆ iterator

◆ task_list_type

Definition at line 246 of file _flow_graph_impl.h.

Constructor & Destructor Documentation

◆ graph() [1/2]

tbb::flow::interface10::graph::graph ( )
inline

Constructs a graph with isolated task_group_context.

Definition at line 774 of file flow_graph.h.

774  : my_nodes(NULL), my_nodes_last(NULL), my_task_arena(NULL) {
776  own_context = true;
777  cancelled = false;
778  caught_exception = false;
779  my_context = new task_group_context(tbb::internal::FLOW_TASKS);
780  my_root_task = (new (task::allocate_root(*my_context)) empty_task);
783  my_is_active = true;
784 }
tbb::task_group_context * my_context
void prepare_task_arena(bool reinit=false)
static void fgt_graph(void *)
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
Definition: task.h:663
tbb::flow::interface11::graph_node * my_nodes
void set_ref_count(int count)
Set reference count.
Definition: task.h:761
tbb::flow::interface11::graph_node * my_nodes_last

References own_context, and prepare_task_arena().

Here is the call graph for this function:

◆ graph() [2/2]

tbb::flow::interface10::graph::graph ( tbb::task_group_context use_this_context)
inlineexplicit

Constructs a graph with use_this_context as context.

Definition at line 786 of file flow_graph.h.

786  :
787  my_context(&use_this_context), my_nodes(NULL), my_nodes_last(NULL), my_task_arena(NULL) {
789  own_context = false;
790  cancelled = false;
791  caught_exception = false;
792  my_root_task = (new (task::allocate_root(*my_context)) empty_task);
795  my_is_active = true;
796 }
tbb::task_group_context * my_context
void prepare_task_arena(bool reinit=false)
static void fgt_graph(void *)
static internal::allocate_root_proxy allocate_root()
Returns proxy for overloaded new that allocates a root task.
Definition: task.h:663
tbb::flow::interface11::graph_node * my_nodes
void set_ref_count(int count)
Set reference count.
Definition: task.h:761
tbb::flow::interface11::graph_node * my_nodes_last

◆ ~graph()

tbb::flow::interface10::graph::~graph ( )
inline

Destroys the graph.

Calls wait_for_all, then destroys the root task and context.

Definition at line 798 of file flow_graph.h.

798  {
799  wait_for_all();
801  tbb::task::destroy(*my_root_task);
802  if (own_context) delete my_context;
803  delete my_task_arena;
804 }
tbb::task_group_context * my_context
void wait_for_all()
Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls.
void set_ref_count(int count)
Set reference count.
Definition: task.h:761

Member Function Documentation

◆ begin() [1/2]

graph::iterator tbb::flow::interface10::graph::begin ( )
inline

start iterator

Definition at line 866 of file flow_graph.h.

866 { return iterator(this, true); }
tbb::flow::interface11::graph_iterator< graph, tbb::flow::interface11::graph_node > iterator

◆ begin() [2/2]

graph::const_iterator tbb::flow::interface10::graph::begin ( ) const
inline

start const iterator

Definition at line 870 of file flow_graph.h.

870 { return const_iterator(this, true); }
tbb::flow::interface11::graph_iterator< const graph, const tbb::flow::interface11::graph_node > const_iterator

◆ cbegin()

graph::const_iterator tbb::flow::interface10::graph::cbegin ( ) const
inline

start const iterator

Definition at line 874 of file flow_graph.h.

874 { return const_iterator(this, true); }
tbb::flow::interface11::graph_iterator< const graph, const tbb::flow::interface11::graph_node > const_iterator

◆ cend()

graph::const_iterator tbb::flow::interface10::graph::cend ( ) const
inline

end const iterator

Definition at line 876 of file flow_graph.h.

876 { return const_iterator(this, false); }
tbb::flow::interface11::graph_iterator< const graph, const tbb::flow::interface11::graph_node > const_iterator

◆ decrement_wait_count()

__TBB_DEPRECATED void tbb::flow::interface10::graph::decrement_wait_count ( )
inline

Definition at line 299 of file _flow_graph_impl.h.

299  {
300  release_wait();
301  }
void release_wait() __TBB_override
Deregisters an external entity that may have interacted with the graph.
Definition: flow_graph.h:813

References release_wait().

Here is the call graph for this function:

◆ end() [1/2]

graph::iterator tbb::flow::interface10::graph::end ( )
inline

end iterator

Definition at line 868 of file flow_graph.h.

868 { return iterator(this, false); }
tbb::flow::interface11::graph_iterator< graph, tbb::flow::interface11::graph_node > iterator

◆ end() [2/2]

graph::const_iterator tbb::flow::interface10::graph::end ( ) const
inline

end const iterator

Definition at line 872 of file flow_graph.h.

872 { return const_iterator(this, false); }
tbb::flow::interface11::graph_iterator< const graph, const tbb::flow::interface11::graph_node > const_iterator

◆ exception_thrown()

bool tbb::flow::interface10::graph::exception_thrown ( )
inline

Definition at line 402 of file _flow_graph_impl.h.

References caught_exception.

◆ increment_wait_count()

__TBB_DEPRECATED void tbb::flow::interface10::graph::increment_wait_count ( )
inline

Definition at line 295 of file _flow_graph_impl.h.

295  {
296  reserve_wait();
297  }
void reserve_wait() __TBB_override
Used to register that an external entity may still interact with the graph.
Definition: flow_graph.h:806

References reserve_wait().

Here is the call graph for this function:

◆ is_cancelled()

bool tbb::flow::interface10::graph::is_cancelled ( )
inline

return status of graph execution

Definition at line 401 of file _flow_graph_impl.h.

References cancelled.

◆ prepare_task_arena()

void tbb::flow::interface10::graph::prepare_task_arena ( bool  reinit = false)
inlineprivate

Definition at line 265 of file _flow_graph_impl.h.

265  {
266  if (reinit) {
267  __TBB_ASSERT(my_task_arena, "task arena is NULL");
270  }
271  else {
272  __TBB_ASSERT(my_task_arena == NULL, "task arena is not NULL");
274  }
275  if (!my_task_arena->is_active()) // failed to attach
276  my_task_arena->initialize(); // create a new, default-initialized arena
277  __TBB_ASSERT(my_task_arena->is_active(), "task arena is not active");
278  }
void initialize()
Forces allocation of the resources for the task_arena as specified in constructor arguments.
Definition: task_arena.h:315
Tag class used to indicate the "attaching" constructor.
Definition: task_arena.h:304
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165

References __TBB_ASSERT, tbb::interface7::task_arena::initialize(), tbb::interface7::task_arena::is_active(), my_task_arena, and tbb::interface7::task_arena::terminate().

Referenced by graph().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ register_node()

void tbb::flow::interface10::graph::register_node ( tbb::flow::interface11::graph_node n)
inlineprivate

Definition at line 820 of file flow_graph.h.

820  {
821  n->next = NULL;
822  {
824  n->prev = my_nodes_last;
825  if (my_nodes_last) my_nodes_last->next = n;
826  my_nodes_last = n;
827  if (!my_nodes) my_nodes = n;
828  }
829 }
tbb::flow::interface11::graph_node * my_nodes
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock
tbb::flow::interface11::graph_node * my_nodes_last
friend class scoped_lock
Definition: spin_mutex.h:179

References lock, tbb::flow::interface11::graph_node::next, and tbb::flow::interface11::graph_node::prev.

Referenced by tbb::flow::interface11::graph_node::graph_node().

Here is the caller graph for this function:

◆ release_wait()

void tbb::flow::interface10::graph::release_wait ( )
inlinevirtual

Deregisters an external entity that may have interacted with the graph.

The graph will not return from wait_for_all until all the number of decrement_wait_count calls matches the number of increment_wait_count calls.

Implements tbb::flow::interface11::graph_proxy.

Definition at line 813 of file flow_graph.h.

813  {
814  if (my_root_task) {
817  }
818 }
static void fgt_release_wait(void *)
int decrement_ref_count()
Atomically decrement reference count and returns its new value.
Definition: task.h:788

Referenced by decrement_wait_count().

Here is the caller graph for this function:

◆ remove_node()

void tbb::flow::interface10::graph::remove_node ( tbb::flow::interface11::graph_node n)
inlineprivate

Definition at line 831 of file flow_graph.h.

831  {
832  {
834  __TBB_ASSERT(my_nodes && my_nodes_last, "graph::remove_node: Error: no registered nodes");
835  if (n->prev) n->prev->next = n->next;
836  if (n->next) n->next->prev = n->prev;
837  if (my_nodes_last == n) my_nodes_last = n->prev;
838  if (my_nodes == n) my_nodes = n->next;
839  }
840  n->prev = n->next = NULL;
841 }
tbb::flow::interface11::graph_node * my_nodes
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
Definition: tbb_stddef.h:165
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock
tbb::flow::interface11::graph_node * my_nodes_last
friend class scoped_lock
Definition: spin_mutex.h:179

References __TBB_ASSERT, and lock.

Referenced by tbb::flow::interface11::graph_node::~graph_node().

Here is the caller graph for this function:

◆ reserve_wait()

void tbb::flow::interface10::graph::reserve_wait ( )
inlinevirtual

Used to register that an external entity may still interact with the graph.

The graph will not return from wait_for_all until a matching number of decrement_wait_count calls is made.

Implements tbb::flow::interface11::graph_proxy.

Definition at line 806 of file flow_graph.h.

806  {
807  if (my_root_task) {
810  }
811 }
static void fgt_reserve_wait(void *)
void increment_ref_count()
Atomically increment reference count.
Definition: task.h:771

Referenced by increment_wait_count().

Here is the caller graph for this function:

◆ reset()

void tbb::flow::interface10::graph::reset ( tbb::flow::interface11::reset_flags  f = tbb::flow::interface11::rf_reset_protocol)
inline

Definition at line 843 of file flow_graph.h.

843  {
844  // reset context
846 
847  if(my_context) my_context->reset();
848  cancelled = false;
849  caught_exception = false;
850  // reset all the nodes comprising the graph
851  for(iterator ii = begin(); ii != end(); ++ii) {
852  tbb::flow::interface11::graph_node *my_p = &(*ii);
853  my_p->reset_node(f);
854  }
855  // Reattach the arena. Might be useful to run the graph in a particular task_arena
856  // while not limiting graph lifetime to a single task_arena::execute() call.
857  prepare_task_arena( /*reinit=*/true );
859  // now spawn the tasks necessary to start the graph
860  for(task_list_type::iterator rti = my_reset_task_list.begin(); rti != my_reset_task_list.end(); ++rti) {
862  }
863  my_reset_task_list.clear();
864 }
tbb::task_group_context * my_context
void prepare_task_arena(bool reinit=false)
void spawn_in_graph_arena(tbb::flow::interface10::graph &g, tbb::task &arena_task)
Spawns a task inside graph arena.
void deactivate_graph(tbb::flow::interface10::graph &g)
void __TBB_EXPORTED_METHOD reset()
Forcefully reinitializes the context after the task tree it was associated with is completed.
iterator end()
end iterator
Definition: flow_graph.h:868
tbb::flow::interface11::graph_iterator< graph, tbb::flow::interface11::graph_node > iterator
The base of all graph nodes.
iterator begin()
start iterator
Definition: flow_graph.h:866
virtual void reset_node(reset_flags f=rf_reset_protocol)=0
void activate_graph(tbb::flow::interface10::graph &g)

References tbb::flow::interface11::internal::deactivate_graph().

Here is the call graph for this function:

◆ root_task()

◆ run() [1/2]

template<typename Receiver , typename Body >
__TBB_DEPRECATED void tbb::flow::interface10::graph::run ( Receiver &  r,
Body  body 
)
inline

Spawns a task that runs a body and puts its output to a specific receiver.

The task is spawned as a child of the graph. This is useful for running tasks that need to block a wait_for_all() on the graph. For example a one-off source.

Definition at line 317 of file _flow_graph_impl.h.

317  {
319  task* rtask = new (task::allocate_additional_child_of(*root_task()))
320  run_and_put_task< Receiver, Body >(r, body);
321  my_task_arena->execute(spawn_functor(*rtask));
322  }
323  }
bool is_graph_active(tbb::flow::interface10::graph &g)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task * task
__TBB_DEPRECATED tbb::task * root_task()
Returns the root task of the graph.
internal::return_type_or_void< F >::type execute(F &f)
Definition: task_arena.h:423

References tbb::interface7::task_arena::execute(), tbb::flow::interface11::internal::is_graph_active(), my_task_arena, and root_task().

Here is the call graph for this function:

◆ run() [2/2]

template<typename Body >
__TBB_DEPRECATED void tbb::flow::interface10::graph::run ( Body  body)
inline

Spawns a task that runs a function object.

The task is spawned as a child of the graph. This is useful for running tasks that need to block a wait_for_all() on the graph. For example a one-off source.

Definition at line 329 of file _flow_graph_impl.h.

329  {
331  task* rtask = new (task::allocate_additional_child_of(*root_task())) run_task< Body >(body);
332  my_task_arena->execute(spawn_functor(*rtask));
333  }
334  }
bool is_graph_active(tbb::flow::interface10::graph &g)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task * task
__TBB_DEPRECATED tbb::task * root_task()
Returns the root task of the graph.
internal::return_type_or_void< F >::type execute(F &f)
Definition: task_arena.h:423

References tbb::interface7::task_arena::execute(), tbb::flow::interface11::internal::is_graph_active(), my_task_arena, and root_task().

Here is the call graph for this function:

◆ wait_for_all()

void tbb::flow::interface10::graph::wait_for_all ( )
inline

Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls.

The waiting thread will go off and steal work while it is block in the wait_for_all.

Definition at line 338 of file _flow_graph_impl.h.

338  {
339  cancelled = false;
340  caught_exception = false;
341  if (my_root_task) {
342 #if TBB_USE_EXCEPTIONS
343  try {
344 #endif
345  my_task_arena->execute(wait_functor(my_root_task));
346 #if __TBB_TASK_GROUP_CONTEXT
348 #endif
349 #if TBB_USE_EXCEPTIONS
350  }
351  catch (...) {
353  my_context->reset();
354  caught_exception = true;
355  cancelled = true;
356  throw;
357  }
358 #endif
359 #if __TBB_TASK_GROUP_CONTEXT
360  // TODO: the "if" condition below is just a work-around to support the concurrent wait
361  // mode. The cancellation and exception mechanisms are still broken in this mode.
362  // Consider using task group not to re-implement the same functionality.
364  my_context->reset(); // consistent with behavior in catch()
365 #endif
367 #if __TBB_TASK_GROUP_CONTEXT
368  }
369 #endif
370  }
371  }
tbb::task_group_context * my_context
uintptr_t traits() const
Returns the context's trait.
Definition: task.h:578
void __TBB_EXPORTED_METHOD reset()
Forcefully reinitializes the context after the task tree it was associated with is completed.
bool __TBB_EXPORTED_METHOD is_group_execution_cancelled() const
Returns true if the context received cancellation request.
void set_ref_count(int count)
Set reference count.
Definition: task.h:761
internal::return_type_or_void< F >::type execute(F &f)
Definition: task_arena.h:423

References cancelled, caught_exception, tbb::task_group_context::concurrent_wait, tbb::interface7::task_arena::execute(), tbb::task_group_context::is_group_execution_cancelled(), my_context, my_root_task, my_task_arena, tbb::task_group_context::reset(), tbb::task::set_ref_count(), and tbb::task_group_context::traits().

Here is the call graph for this function:

Friends And Related Function Documentation

◆ tbb::flow::interface11::graph_iterator

template<typename C , typename N >
friend class tbb::flow::interface11::graph_iterator
friend

Definition at line 380 of file _flow_graph_impl.h.

◆ tbb::flow::interface11::graph_node

Definition at line 212 of file _flow_graph_impl.h.

◆ tbb::flow::interface11::internal::activate_graph

◆ tbb::flow::interface11::internal::add_task_to_graph_reset_list

◆ tbb::flow::interface11::internal::deactivate_graph

◆ tbb::flow::interface11::internal::enqueue_in_graph_arena

◆ tbb::flow::interface11::internal::is_graph_active

◆ tbb::flow::interface11::internal::prioritize_task

◆ tbb::flow::interface11::internal::spawn_in_graph_arena

◆ tbb::interface7::internal::task_arena_base

Definition at line 438 of file _flow_graph_impl.h.

Member Data Documentation

◆ cancelled

bool tbb::flow::interface10::graph::cancelled
private

Definition at line 413 of file _flow_graph_impl.h.

Referenced by is_cancelled(), and wait_for_all().

◆ caught_exception

bool tbb::flow::interface10::graph::caught_exception
private

Definition at line 414 of file _flow_graph_impl.h.

Referenced by exception_thrown(), and wait_for_all().

◆ my_context

tbb::task_group_context* tbb::flow::interface10::graph::my_context
private

Definition at line 410 of file _flow_graph_impl.h.

Referenced by wait_for_all().

◆ my_is_active

◆ my_nodes

tbb::flow::interface11::graph_node* tbb::flow::interface10::graph::my_nodes
private

Definition at line 418 of file _flow_graph_impl.h.

◆ my_nodes_last

tbb::flow::interface11::graph_node * tbb::flow::interface10::graph::my_nodes_last
private

Definition at line 418 of file _flow_graph_impl.h.

◆ my_priority_queue

tbb::flow::interface11::internal::graph_task_priority_queue_t tbb::flow::interface10::graph::my_priority_queue
private

◆ my_reset_task_list

task_list_type tbb::flow::interface10::graph::my_reset_task_list
private

◆ my_root_task

tbb::task* tbb::flow::interface10::graph::my_root_task
private

Definition at line 408 of file _flow_graph_impl.h.

Referenced by root_task(), and wait_for_all().

◆ my_task_arena

◆ nodelist_mutex

tbb::spin_mutex tbb::flow::interface10::graph::nodelist_mutex
private

Definition at line 420 of file _flow_graph_impl.h.

◆ own_context

bool tbb::flow::interface10::graph::own_context
private

Definition at line 412 of file _flow_graph_impl.h.

Referenced by graph().


The documentation for this class was generated from the following files:

Copyright © 2005-2020 Intel Corporation. All Rights Reserved.

Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are registered trademarks or trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

* Other names and brands may be claimed as the property of others.