summaryrefslogtreecommitdiff
path: root/docs/tutorials/013/task.h
blob: 64f4064dfa01a4402416a2a5debed19cf37e3b94 (plain)
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

// $Id$

#ifndef TASK_H
#define TASK_H

#include "ace/Task.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "mld.h"

/*
   This is much like the Task we've used in the past for implementing a  thread
   pool.  This time, however, I've made the Task an element in a  singly-linked
   list.  As the svc() method finishes the process() on a  unit of work, it
   will enqueue that unit of work to the next_ Task if  there is one.  If the
   Task does not have a next_ Task, it will invoke the unit of work object's
   fini() method after invoking process().
 */
class Task : public ACE_Task < ACE_MT_SYNCH >
{
public:

    typedef ACE_Task < ACE_MT_SYNCH > inherited;

        // Construct ourselves and an optional number of subtasks
        // chained beyond us.
    Task (int sub_tasks = 0);
    ~Task (void);

        /*
          I really wanted this to be called open() but that was already
          claimed by the Task framework.  start() will kick off our thread 
          pool for us.
        */
    int start (int threads = 1);

        // Take Unit_Of_Work objects from the thread pool and invoke
        // their process() and/or fini() as appropriate.
    int svc (void);

        // Shut down the thread pool and it's associated subtasks
    int close (u_long flags = 0);

        // Wait for the pool and subtasks to close
    int wait (void);

protected:
    ACE_Barrier * barrier_;
    Task *next_;
    MLD;
};

#endif