/*
 * Copyright © 2012-2017 Inria.  All rights reserved.
 * See COPYING in top-level directory.
 */

#include <private/autogen/config.h>
#include <hwloc.h>
#include <private/private.h>

#include <stdlib.h>

static struct hwloc_backend *
hwloc_fake_component_instantiate(struct hwloc_disc_component *component __hwloc_attribute_unused,
				 const void *_data1 __hwloc_attribute_unused,
				 const void *_data2 __hwloc_attribute_unused,
				 const void *_data3 __hwloc_attribute_unused)
{
  if (getenv("HWLOC_DEBUG_FAKE_COMPONENT"))
    printf("fake component instantiated\n");
  return NULL;
}

static struct hwloc_disc_component hwloc_fake_disc_component = {
  HWLOC_DISC_COMPONENT_TYPE_MISC, /* so that it's always enabled when using the OS discovery */
  "fake",
  0, /* nothing to exclude */
  hwloc_fake_component_instantiate,
  100, /* make sure it's loaded before anything conflicting excludes it */
  1,
  NULL
};

static int
hwloc_fake_component_init(unsigned long flags)
{
  if (flags)
    return -1;
  if (hwloc_plugin_check_namespace("fake", "hwloc_backend_alloc") < 0)
    return -1;
  if (getenv("HWLOC_DEBUG_FAKE_COMPONENT"))
    printf("fake component initialized\n");
  return 0;
}

static void
hwloc_fake_component_finalize(unsigned long flags)
{
  if (flags)
    return;
  if (getenv("HWLOC_DEBUG_FAKE_COMPONENT"))
    printf("fake component finalized\n");
}

HWLOC_DECLSPEC extern const struct hwloc_component hwloc_fake_component; /* never linked statically in the core */

const struct hwloc_component hwloc_fake_component = {
  HWLOC_COMPONENT_ABI,
  hwloc_fake_component_init, hwloc_fake_component_finalize,
  HWLOC_COMPONENT_TYPE_DISC,
  0,
  &hwloc_fake_disc_component
};
