/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_WORKER_H_
#define ANDROID_WORKER_H_

#include <pthread.h>
#include <string>

namespace android {

class Worker {
 public:
  int Lock();
  int Unlock();

  // Must be called with the lock acquired
  int SignalLocked();
  int ExitLocked();

  // Convenience versions of above, acquires the lock
  int Signal();
  int Exit();

 protected:
  Worker(const char *name, int priority);
  virtual ~Worker();

  int InitWorker();

  bool initialized() const;

  virtual void Routine() = 0;

  /*
   * Must be called with the lock acquired.
   * Returns -EINTR if interrupted by exit request
   */
  int WaitForSignalOrExitLocked();

 private:
  static void *InternalRoutine(void *worker);

  // Must be called with the lock acquired
  int SignalThreadLocked(bool exit);

  std::string name_;
  int priority_;

  pthread_t thread_;
  pthread_mutex_t lock_;
  pthread_cond_t cond_;

  bool exit_;
  bool initialized_;
};
}

#endif
