aboutsummaryrefslogtreecommitdiff
path: root/tools/mhmake/src/commandqueue.h
blob: 54a22e98ec0df400f09e317354fde74c07759199 (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
#ifndef __COMMANDQUEUE_H__
#define __COMMANDQUEUE_H__

#include "fileinfo.h"

class commandqueue
{
  struct activeentry
  {
    refptr<fileinfo>         pTarget;
    vector<string>::iterator CurrentCommandIt;
    string                   Command;
    md5_context              md5ctx;
    bool                     IgnoreError;
  };
private:
  queue< refptr<fileinfo> >  m_Queue;
  unsigned                   m_MaxNrCommandsInParallel;
  HANDLE                    *m_pActiveProcesses;
  activeentry               *m_pActiveEntries;
  unsigned                   m_NrActiveEntries;

private:
  void ThrowCommandExecutionError(activeentry *pActiveEntry);
  void RemoveActiveEntry(unsigned Entry);
  bool StartExecuteCommands(const refptr<fileinfo> &pTarget);
  bool StartExecuteNextCommand(activeentry *pActiveEntry, HANDLE *pActiveProcess);
  void TargetBuildFinished(activeentry *pActiveEntry);

public:
  commandqueue();
  ~commandqueue();

  bool QueueTarget(const refptr<fileinfo> &pTarget);  // Returns true if target has been queued, false when commands are executed upon return
  mh_time_t WaitForTarget(const refptr<fileinfo> &pTarget);
  void SetNrParallelBuilds(unsigned NrParallelBuilds);
};


#endif