Example

The following example (present in src/examples/dyn_add_rem) initially declares one service. This service receives an integer as parameter. It creates services, and removes the service that has just been called. Hence a service can only be called once, but it spawns new services.

#include <iostream>
#include <sstream>
#include <cstring>

#include "DIET_server.h"
#include "DIET_Dagda.h"

/* begin function prototypes*/
int service(diet_profile_t *pb);
int add_service(const char* service_name);
/* end function prototypes*/

static unsigned int NB = 1;

template <typename T>
std::string toString( T t ) {
    std::ostringstream oss;
    oss << t;
    return oss.str();
}

/* Solve Function */
int
service(diet_profile_t* pb) {
  int *nb;

  if (pb->pb_name)
    std::cout << "## Executing " << pb->pb_name << std::endl;
  else {
    std::cout << "## ERROR: No name for the service" << std::endl;
    return -1;
  }

  diet_scalar_get(diet_parameter(pb,0), &nb, NULL);
  std::cout << "## Will create " << *nb << " services." << std::endl;

  for (int i = 0; i < *nb; i++) {
    add_service(std::string("dyn_add_rem_" + toString(NB++)).c_str());
  }

  std::cout << "## Services added" << std::endl;
  diet_print_service_table();

  /* Removing */
  std::cout << "## Removing service " << pb->pb_name << std::endl;
#ifdef HAVE_ALT_BATCH
  pb->parallel_flag = 1;
#endif
  diet_service_table_remove(pb);
  std::cout << "## Service removed" << std::endl;

  /* Print service table */
  diet_print_service_table();

  return 0;
}

/* usage function */
int
usage(char* cmd) {
  std::cerr << "Usage: " << cmd << " <SeD.cfg>" << std::endl;
  return -1;
}

/* add_service function: declares SeD's service */
int
add_service(const char* service_name) {
  diet_profile_desc_t* profile = NULL;
  unsigned int pos = 0;

  /* Set profile parameters: */
  profile = diet_profile_desc_alloc(strdup(service_name),0,0,0);

  diet_generic_desc_set(diet_param_desc(profile,pos++),DIET_SCALAR, DIET_INT);

  /* Add service to the service table */
  if (diet_service_table_add(profile, NULL, service )) return 1;

  /* Free the profile, since it was deep copied */
  diet_profile_desc_free(profile);

  std::cout << "Service '" << service_name << "' added!" << std::endl;

  return 0;
}

int checkUsage(int argc, char ** argv) {
  if (argc != 2) {
    usage(argv[0]);
    exit(1);
  }
  return 0;
}

/* MAIN */
int
main( int argc, char* argv[]) {
  int res;
  std::string service_name = "dyn_add_rem_0";

  checkUsage(argc, argv);

  /* Add service */
  diet_service_table_init(1);
  add_service(service_name.c_str());

  /* Print service table and launch daemon */
  diet_print_service_table();
  res = diet_SeD(argv[1],argc,argv);
  return res;
}



The DIET Team - Mer 29 nov 2017 15:13:36 EST