// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_SUBPROCESS_H__
#define CHROMEOS_PLATFORM_UPDATE_ENGINE_SUBPROCESS_H__

#include <map>
#include <string>
#include <vector>
#include <glib.h>
#include "base/basictypes.h"
#include "chromeos/obsolete_logging.h"

// The Subprocess class is a singleton. It's used to spawn off a subprocess
// and get notified when the subprocess exits. The result of Exec() can
// be saved and used to cancel the callback request. If you know you won't
// call CancelExec(), you may safely lose the return value from Exec().

namespace chromeos_update_engine {

class Subprocess {
 public:
  static void Init() {
    CHECK(!subprocess_singleton_);
    subprocess_singleton_ = new Subprocess;
  }
   
  typedef void(*ExecCallback)(int return_code, void *p);

  // Returns a tag > 0 on success.
  uint32_t Exec(const std::vector<std::string>& cmd,
                ExecCallback callback,
                void* p);

  // Used to cancel the callback. The process will still run to completion.
  void CancelExec(uint32_t tag);

  // Executes a command synchronously. Returns true on success.
  static bool SynchronousExec(const std::vector<std::string>& cmd,
                              int* return_code);

  // Gets the one instance
  static Subprocess& Get() {
    return *subprocess_singleton_;
  }
  
  // Returns true iff there is at least one subprocess we're waiting on.
  bool SubprocessInFlight() {
    for (std::map<int, SubprocessCallbackRecord>::iterator it =
             callback_records_.begin();
         it != callback_records_.end(); ++it) {
      if (it->second.callback)
        return true;
    }
    return false;
  }
 private:
  // The global instance
  static Subprocess* subprocess_singleton_;

  // Callback for when any subprocess terminates. This calls the user
  // requested callback.
  static void GChildExitedCallback(GPid pid, gint status, gpointer data);

  struct SubprocessCallbackRecord {
    ExecCallback callback;
    void* callback_data;
  };

  std::map<int, SubprocessCallbackRecord> callback_records_;

  Subprocess() {}
  DISALLOW_COPY_AND_ASSIGN(Subprocess);
};

}  // namespace chromeos_update_engine

#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_SUBPROCESS_H__
