/*
 * Copyright (C) 2019 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.
 */

#include "src/traced/service/lazy_producer.h"

#include "perfetto/base/build_config.h"

#include "perfetto/tracing/core/data_source_config.h"
#include "perfetto/tracing/core/data_source_descriptor.h"

#if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
#include <sys/system_properties.h>
#endif

namespace perfetto {

LazyProducer::LazyProducer(base::TaskRunner* task_runner,
                           uint32_t delay_ms,
                           std::string data_source_name,
                           std::string property_name)
    : task_runner_(task_runner),
      delay_ms_(delay_ms),
      data_source_name_(data_source_name),
      property_name_(property_name),
      weak_factory_(this) {}

void LazyProducer::ConnectInProcess(TracingService* svc) {
  endpoint_ = svc->ConnectProducer(this, geteuid(), "lazy_producer",
                                   /*shm_hint_kb*/ 16, /*in_process*/ true);
}

void LazyProducer::OnConnect() {
  DataSourceDescriptor dsd;
  dsd.set_name(data_source_name_);
  endpoint_->RegisterDataSource(dsd);
}

void LazyProducer::SetupDataSource(DataSourceInstanceID,
                                   const DataSourceConfig&) {
  SetAndroidProperty(property_name_, "1");
  active_sessions_++;
  generation_++;
}

void LazyProducer::StopDataSource(DataSourceInstanceID) {
  if (--active_sessions_)
    return;

  uint64_t cur_generation = generation_;
  auto weak_this = weak_factory_.GetWeakPtr();
  task_runner_->PostDelayedTask(
      [weak_this, cur_generation] {
        if (!weak_this)
          return;
        if (weak_this->generation_ == cur_generation)
          weak_this->SetAndroidProperty(weak_this->property_name_, "0");
      },
      delay_ms_);
}

bool LazyProducer::SetAndroidProperty(const std::string& name,
                                      const std::string& value) {
#if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
  return __system_property_set(name.c_str(), value.c_str()) == 0;
#else
  // Allow this to be mocked out for tests on other platforms.
  base::ignore_result(name);
  base::ignore_result(value);
  return true;
#endif
}

LazyProducer::~LazyProducer() {
  if (active_sessions_)
    SetAndroidProperty(property_name_, "0");
}

}  // namespace perfetto
