OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [libgomp/] [env.c] - Diff between revs 816 and 826

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 816 Rev 826
/* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
/* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
   Contributed by Richard Henderson <rth@redhat.com>.
   Contributed by Richard Henderson <rth@redhat.com>.
 
 
   This file is part of the GNU OpenMP Library (libgomp).
   This file is part of the GNU OpenMP Library (libgomp).
 
 
   Libgomp is free software; you can redistribute it and/or modify it
   Libgomp is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   the Free Software Foundation; either version 3, or (at your option)
   any later version.
   any later version.
 
 
   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.
   more details.
 
 
   Under Section 7 of GPL version 3, you are granted additional
   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.
   3.1, as published by the Free Software Foundation.
 
 
   You should have received a copy of the GNU General Public License and
   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */
   <http://www.gnu.org/licenses/>.  */
 
 
/* This file defines the OpenMP internal control variables, and arranges
/* This file defines the OpenMP internal control variables, and arranges
   for them to be initialized from environment variables at startup.  */
   for them to be initialized from environment variables at startup.  */
 
 
#include "libgomp.h"
#include "libgomp.h"
#include "libgomp_f.h"
#include "libgomp_f.h"
#include <ctype.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdlib.h>
#ifdef STRING_WITH_STRINGS
#ifdef STRING_WITH_STRINGS
# include <string.h>
# include <string.h>
# include <strings.h>
# include <strings.h>
#else
#else
# ifdef HAVE_STRING_H
# ifdef HAVE_STRING_H
#  include <string.h>
#  include <string.h>
# else
# else
#  ifdef HAVE_STRINGS_H
#  ifdef HAVE_STRINGS_H
#   include <strings.h>
#   include <strings.h>
#  endif
#  endif
# endif
# endif
#endif
#endif
#include <limits.h>
#include <limits.h>
#include <errno.h>
#include <errno.h>
 
 
#ifndef HAVE_STRTOULL
#ifndef HAVE_STRTOULL
# define strtoull(ptr, eptr, base) strtoul (ptr, eptr, base)
# define strtoull(ptr, eptr, base) strtoul (ptr, eptr, base)
#endif
#endif
 
 
struct gomp_task_icv gomp_global_icv = {
struct gomp_task_icv gomp_global_icv = {
  .nthreads_var = 1,
  .nthreads_var = 1,
  .run_sched_var = GFS_DYNAMIC,
  .run_sched_var = GFS_DYNAMIC,
  .run_sched_modifier = 1,
  .run_sched_modifier = 1,
  .dyn_var = false,
  .dyn_var = false,
  .nest_var = false
  .nest_var = false
};
};
 
 
unsigned short *gomp_cpu_affinity;
unsigned short *gomp_cpu_affinity;
size_t gomp_cpu_affinity_len;
size_t gomp_cpu_affinity_len;
unsigned long gomp_max_active_levels_var = INT_MAX;
unsigned long gomp_max_active_levels_var = INT_MAX;
unsigned long gomp_thread_limit_var = ULONG_MAX;
unsigned long gomp_thread_limit_var = ULONG_MAX;
unsigned long gomp_remaining_threads_count;
unsigned long gomp_remaining_threads_count;
#ifndef HAVE_SYNC_BUILTINS
#ifndef HAVE_SYNC_BUILTINS
gomp_mutex_t gomp_remaining_threads_lock;
gomp_mutex_t gomp_remaining_threads_lock;
#endif
#endif
unsigned long gomp_available_cpus = 1, gomp_managed_threads = 1;
unsigned long gomp_available_cpus = 1, gomp_managed_threads = 1;
unsigned long long gomp_spin_count_var, gomp_throttled_spin_count_var;
unsigned long long gomp_spin_count_var, gomp_throttled_spin_count_var;
 
 
/* Parse the OMP_SCHEDULE environment variable.  */
/* Parse the OMP_SCHEDULE environment variable.  */
 
 
static void
static void
parse_schedule (void)
parse_schedule (void)
{
{
  char *env, *end;
  char *env, *end;
  unsigned long value;
  unsigned long value;
 
 
  env = getenv ("OMP_SCHEDULE");
  env = getenv ("OMP_SCHEDULE");
  if (env == NULL)
  if (env == NULL)
    return;
    return;
 
 
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (strncasecmp (env, "static", 6) == 0)
  if (strncasecmp (env, "static", 6) == 0)
    {
    {
      gomp_global_icv.run_sched_var = GFS_STATIC;
      gomp_global_icv.run_sched_var = GFS_STATIC;
      env += 6;
      env += 6;
    }
    }
  else if (strncasecmp (env, "dynamic", 7) == 0)
  else if (strncasecmp (env, "dynamic", 7) == 0)
    {
    {
      gomp_global_icv.run_sched_var = GFS_DYNAMIC;
      gomp_global_icv.run_sched_var = GFS_DYNAMIC;
      env += 7;
      env += 7;
    }
    }
  else if (strncasecmp (env, "guided", 6) == 0)
  else if (strncasecmp (env, "guided", 6) == 0)
    {
    {
      gomp_global_icv.run_sched_var = GFS_GUIDED;
      gomp_global_icv.run_sched_var = GFS_GUIDED;
      env += 6;
      env += 6;
    }
    }
  else if (strncasecmp (env, "auto", 4) == 0)
  else if (strncasecmp (env, "auto", 4) == 0)
    {
    {
      gomp_global_icv.run_sched_var = GFS_AUTO;
      gomp_global_icv.run_sched_var = GFS_AUTO;
      env += 4;
      env += 4;
    }
    }
  else
  else
    goto unknown;
    goto unknown;
 
 
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (*env == '\0')
  if (*env == '\0')
    return;
    return;
  if (*env++ != ',')
  if (*env++ != ',')
    goto unknown;
    goto unknown;
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (*env == '\0')
  if (*env == '\0')
    goto invalid;
    goto invalid;
 
 
  errno = 0;
  errno = 0;
  value = strtoul (env, &end, 10);
  value = strtoul (env, &end, 10);
  if (errno)
  if (errno)
    goto invalid;
    goto invalid;
 
 
  while (isspace ((unsigned char) *end))
  while (isspace ((unsigned char) *end))
    ++end;
    ++end;
  if (*end != '\0')
  if (*end != '\0')
    goto invalid;
    goto invalid;
 
 
  if ((int)value != value)
  if ((int)value != value)
    goto invalid;
    goto invalid;
 
 
  gomp_global_icv.run_sched_modifier = value;
  gomp_global_icv.run_sched_modifier = value;
  return;
  return;
 
 
 unknown:
 unknown:
  gomp_error ("Unknown value for environment variable OMP_SCHEDULE");
  gomp_error ("Unknown value for environment variable OMP_SCHEDULE");
  return;
  return;
 
 
 invalid:
 invalid:
  gomp_error ("Invalid value for chunk size in "
  gomp_error ("Invalid value for chunk size in "
              "environment variable OMP_SCHEDULE");
              "environment variable OMP_SCHEDULE");
  return;
  return;
}
}
 
 
/* Parse an unsigned long environment variable.  Return true if one was
/* Parse an unsigned long environment variable.  Return true if one was
   present and it was successfully parsed.  */
   present and it was successfully parsed.  */
 
 
static bool
static bool
parse_unsigned_long (const char *name, unsigned long *pvalue, bool allow_zero)
parse_unsigned_long (const char *name, unsigned long *pvalue, bool allow_zero)
{
{
  char *env, *end;
  char *env, *end;
  unsigned long value;
  unsigned long value;
 
 
  env = getenv (name);
  env = getenv (name);
  if (env == NULL)
  if (env == NULL)
    return false;
    return false;
 
 
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (*env == '\0')
  if (*env == '\0')
    goto invalid;
    goto invalid;
 
 
  errno = 0;
  errno = 0;
  value = strtoul (env, &end, 10);
  value = strtoul (env, &end, 10);
  if (errno || (long) value <= 0 - allow_zero)
  if (errno || (long) value <= 0 - allow_zero)
    goto invalid;
    goto invalid;
 
 
  while (isspace ((unsigned char) *end))
  while (isspace ((unsigned char) *end))
    ++end;
    ++end;
  if (*end != '\0')
  if (*end != '\0')
    goto invalid;
    goto invalid;
 
 
  *pvalue = value;
  *pvalue = value;
  return true;
  return true;
 
 
 invalid:
 invalid:
  gomp_error ("Invalid value for environment variable %s", name);
  gomp_error ("Invalid value for environment variable %s", name);
  return false;
  return false;
}
}
 
 
/* Parse the OMP_STACKSIZE environment varible.  Return true if one was
/* Parse the OMP_STACKSIZE environment varible.  Return true if one was
   present and it was successfully parsed.  */
   present and it was successfully parsed.  */
 
 
static bool
static bool
parse_stacksize (const char *name, unsigned long *pvalue)
parse_stacksize (const char *name, unsigned long *pvalue)
{
{
  char *env, *end;
  char *env, *end;
  unsigned long value, shift = 10;
  unsigned long value, shift = 10;
 
 
  env = getenv (name);
  env = getenv (name);
  if (env == NULL)
  if (env == NULL)
    return false;
    return false;
 
 
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (*env == '\0')
  if (*env == '\0')
    goto invalid;
    goto invalid;
 
 
  errno = 0;
  errno = 0;
  value = strtoul (env, &end, 10);
  value = strtoul (env, &end, 10);
  if (errno)
  if (errno)
    goto invalid;
    goto invalid;
 
 
  while (isspace ((unsigned char) *end))
  while (isspace ((unsigned char) *end))
    ++end;
    ++end;
  if (*end != '\0')
  if (*end != '\0')
    {
    {
      switch (tolower ((unsigned char) *end))
      switch (tolower ((unsigned char) *end))
        {
        {
        case 'b':
        case 'b':
          shift = 0;
          shift = 0;
          break;
          break;
        case 'k':
        case 'k':
          break;
          break;
        case 'm':
        case 'm':
          shift = 20;
          shift = 20;
          break;
          break;
        case 'g':
        case 'g':
          shift = 30;
          shift = 30;
          break;
          break;
        default:
        default:
          goto invalid;
          goto invalid;
        }
        }
      ++end;
      ++end;
      while (isspace ((unsigned char) *end))
      while (isspace ((unsigned char) *end))
        ++end;
        ++end;
      if (*end != '\0')
      if (*end != '\0')
        goto invalid;
        goto invalid;
    }
    }
 
 
  if (((value << shift) >> shift) != value)
  if (((value << shift) >> shift) != value)
    goto invalid;
    goto invalid;
 
 
  *pvalue = value << shift;
  *pvalue = value << shift;
  return true;
  return true;
 
 
 invalid:
 invalid:
  gomp_error ("Invalid value for environment variable %s", name);
  gomp_error ("Invalid value for environment variable %s", name);
  return false;
  return false;
}
}
 
 
/* Parse the GOMP_SPINCOUNT environment varible.  Return true if one was
/* Parse the GOMP_SPINCOUNT environment varible.  Return true if one was
   present and it was successfully parsed.  */
   present and it was successfully parsed.  */
 
 
static bool
static bool
parse_spincount (const char *name, unsigned long long *pvalue)
parse_spincount (const char *name, unsigned long long *pvalue)
{
{
  char *env, *end;
  char *env, *end;
  unsigned long long value, mult = 1;
  unsigned long long value, mult = 1;
 
 
  env = getenv (name);
  env = getenv (name);
  if (env == NULL)
  if (env == NULL)
    return false;
    return false;
 
 
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (*env == '\0')
  if (*env == '\0')
    goto invalid;
    goto invalid;
 
 
  if (strncasecmp (env, "infinite", 8) == 0
  if (strncasecmp (env, "infinite", 8) == 0
      || strncasecmp (env, "infinity", 8) == 0)
      || strncasecmp (env, "infinity", 8) == 0)
    {
    {
      value = ~0ULL;
      value = ~0ULL;
      end = env + 8;
      end = env + 8;
      goto check_tail;
      goto check_tail;
    }
    }
 
 
  errno = 0;
  errno = 0;
  value = strtoull (env, &end, 10);
  value = strtoull (env, &end, 10);
  if (errno)
  if (errno)
    goto invalid;
    goto invalid;
 
 
  while (isspace ((unsigned char) *end))
  while (isspace ((unsigned char) *end))
    ++end;
    ++end;
  if (*end != '\0')
  if (*end != '\0')
    {
    {
      switch (tolower ((unsigned char) *end))
      switch (tolower ((unsigned char) *end))
        {
        {
        case 'k':
        case 'k':
          mult = 1000LL;
          mult = 1000LL;
          break;
          break;
        case 'm':
        case 'm':
          mult = 1000LL * 1000LL;
          mult = 1000LL * 1000LL;
          break;
          break;
        case 'g':
        case 'g':
          mult = 1000LL * 1000LL * 1000LL;
          mult = 1000LL * 1000LL * 1000LL;
          break;
          break;
        case 't':
        case 't':
          mult = 1000LL * 1000LL * 1000LL * 1000LL;
          mult = 1000LL * 1000LL * 1000LL * 1000LL;
          break;
          break;
        default:
        default:
          goto invalid;
          goto invalid;
        }
        }
      ++end;
      ++end;
     check_tail:
     check_tail:
      while (isspace ((unsigned char) *end))
      while (isspace ((unsigned char) *end))
        ++end;
        ++end;
      if (*end != '\0')
      if (*end != '\0')
        goto invalid;
        goto invalid;
    }
    }
 
 
  if (value > ~0ULL / mult)
  if (value > ~0ULL / mult)
    value = ~0ULL;
    value = ~0ULL;
  else
  else
    value *= mult;
    value *= mult;
 
 
  *pvalue = value;
  *pvalue = value;
  return true;
  return true;
 
 
 invalid:
 invalid:
  gomp_error ("Invalid value for environment variable %s", name);
  gomp_error ("Invalid value for environment variable %s", name);
  return false;
  return false;
}
}
 
 
/* Parse a boolean value for environment variable NAME and store the
/* Parse a boolean value for environment variable NAME and store the
   result in VALUE.  */
   result in VALUE.  */
 
 
static void
static void
parse_boolean (const char *name, bool *value)
parse_boolean (const char *name, bool *value)
{
{
  const char *env;
  const char *env;
 
 
  env = getenv (name);
  env = getenv (name);
  if (env == NULL)
  if (env == NULL)
    return;
    return;
 
 
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (strncasecmp (env, "true", 4) == 0)
  if (strncasecmp (env, "true", 4) == 0)
    {
    {
      *value = true;
      *value = true;
      env += 4;
      env += 4;
    }
    }
  else if (strncasecmp (env, "false", 5) == 0)
  else if (strncasecmp (env, "false", 5) == 0)
    {
    {
      *value = false;
      *value = false;
      env += 5;
      env += 5;
    }
    }
  else
  else
    env = "X";
    env = "X";
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (*env != '\0')
  if (*env != '\0')
    gomp_error ("Invalid value for environment variable %s", name);
    gomp_error ("Invalid value for environment variable %s", name);
}
}
 
 
/* Parse the OMP_WAIT_POLICY environment variable and store the
/* Parse the OMP_WAIT_POLICY environment variable and store the
   result in gomp_active_wait_policy.  */
   result in gomp_active_wait_policy.  */
 
 
static int
static int
parse_wait_policy (void)
parse_wait_policy (void)
{
{
  const char *env;
  const char *env;
  int ret = -1;
  int ret = -1;
 
 
  env = getenv ("OMP_WAIT_POLICY");
  env = getenv ("OMP_WAIT_POLICY");
  if (env == NULL)
  if (env == NULL)
    return -1;
    return -1;
 
 
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (strncasecmp (env, "active", 6) == 0)
  if (strncasecmp (env, "active", 6) == 0)
    {
    {
      ret = 1;
      ret = 1;
      env += 6;
      env += 6;
    }
    }
  else if (strncasecmp (env, "passive", 7) == 0)
  else if (strncasecmp (env, "passive", 7) == 0)
    {
    {
      ret = 0;
      ret = 0;
      env += 7;
      env += 7;
    }
    }
  else
  else
    env = "X";
    env = "X";
  while (isspace ((unsigned char) *env))
  while (isspace ((unsigned char) *env))
    ++env;
    ++env;
  if (*env == '\0')
  if (*env == '\0')
    return ret;
    return ret;
  gomp_error ("Invalid value for environment variable OMP_WAIT_POLICY");
  gomp_error ("Invalid value for environment variable OMP_WAIT_POLICY");
  return -1;
  return -1;
}
}
 
 
/* Parse the GOMP_CPU_AFFINITY environment varible.  Return true if one was
/* Parse the GOMP_CPU_AFFINITY environment varible.  Return true if one was
   present and it was successfully parsed.  */
   present and it was successfully parsed.  */
 
 
static bool
static bool
parse_affinity (void)
parse_affinity (void)
{
{
  char *env, *end;
  char *env, *end;
  unsigned long cpu_beg, cpu_end, cpu_stride;
  unsigned long cpu_beg, cpu_end, cpu_stride;
  unsigned short *cpus = NULL;
  unsigned short *cpus = NULL;
  size_t allocated = 0, used = 0, needed;
  size_t allocated = 0, used = 0, needed;
 
 
  env = getenv ("GOMP_CPU_AFFINITY");
  env = getenv ("GOMP_CPU_AFFINITY");
  if (env == NULL)
  if (env == NULL)
    return false;
    return false;
 
 
  do
  do
    {
    {
      while (*env == ' ' || *env == '\t')
      while (*env == ' ' || *env == '\t')
        env++;
        env++;
 
 
      cpu_beg = strtoul (env, &end, 0);
      cpu_beg = strtoul (env, &end, 0);
      cpu_end = cpu_beg;
      cpu_end = cpu_beg;
      cpu_stride = 1;
      cpu_stride = 1;
      if (env == end || cpu_beg >= 65536)
      if (env == end || cpu_beg >= 65536)
        goto invalid;
        goto invalid;
 
 
      env = end;
      env = end;
      if (*env == '-')
      if (*env == '-')
        {
        {
          cpu_end = strtoul (++env, &end, 0);
          cpu_end = strtoul (++env, &end, 0);
          if (env == end || cpu_end >= 65536 || cpu_end < cpu_beg)
          if (env == end || cpu_end >= 65536 || cpu_end < cpu_beg)
            goto invalid;
            goto invalid;
 
 
          env = end;
          env = end;
          if (*env == ':')
          if (*env == ':')
            {
            {
              cpu_stride = strtoul (++env, &end, 0);
              cpu_stride = strtoul (++env, &end, 0);
              if (env == end || cpu_stride == 0 || cpu_stride >= 65536)
              if (env == end || cpu_stride == 0 || cpu_stride >= 65536)
                goto invalid;
                goto invalid;
 
 
              env = end;
              env = end;
            }
            }
        }
        }
 
 
      needed = (cpu_end - cpu_beg) / cpu_stride + 1;
      needed = (cpu_end - cpu_beg) / cpu_stride + 1;
      if (used + needed >= allocated)
      if (used + needed >= allocated)
        {
        {
          unsigned short *new_cpus;
          unsigned short *new_cpus;
 
 
          if (allocated < 64)
          if (allocated < 64)
            allocated = 64;
            allocated = 64;
          if (allocated > needed)
          if (allocated > needed)
            allocated <<= 1;
            allocated <<= 1;
          else
          else
            allocated += 2 * needed;
            allocated += 2 * needed;
          new_cpus = realloc (cpus, allocated * sizeof (unsigned short));
          new_cpus = realloc (cpus, allocated * sizeof (unsigned short));
          if (new_cpus == NULL)
          if (new_cpus == NULL)
            {
            {
              free (cpus);
              free (cpus);
              gomp_error ("not enough memory to store GOMP_CPU_AFFINITY list");
              gomp_error ("not enough memory to store GOMP_CPU_AFFINITY list");
              return false;
              return false;
            }
            }
 
 
          cpus = new_cpus;
          cpus = new_cpus;
        }
        }
 
 
      while (needed--)
      while (needed--)
        {
        {
          cpus[used++] = cpu_beg;
          cpus[used++] = cpu_beg;
          cpu_beg += cpu_stride;
          cpu_beg += cpu_stride;
        }
        }
 
 
      while (*env == ' ' || *env == '\t')
      while (*env == ' ' || *env == '\t')
        env++;
        env++;
 
 
      if (*env == ',')
      if (*env == ',')
        env++;
        env++;
      else if (*env == '\0')
      else if (*env == '\0')
        break;
        break;
    }
    }
  while (1);
  while (1);
 
 
  gomp_cpu_affinity = cpus;
  gomp_cpu_affinity = cpus;
  gomp_cpu_affinity_len = used;
  gomp_cpu_affinity_len = used;
  return true;
  return true;
 
 
 invalid:
 invalid:
  gomp_error ("Invalid value for enviroment variable GOMP_CPU_AFFINITY");
  gomp_error ("Invalid value for enviroment variable GOMP_CPU_AFFINITY");
  return false;
  return false;
}
}
 
 
static void __attribute__((constructor))
static void __attribute__((constructor))
initialize_env (void)
initialize_env (void)
{
{
  unsigned long stacksize;
  unsigned long stacksize;
  int wait_policy;
  int wait_policy;
 
 
  /* Do a compile time check that mkomp_h.pl did good job.  */
  /* Do a compile time check that mkomp_h.pl did good job.  */
  omp_check_defines ();
  omp_check_defines ();
 
 
  parse_schedule ();
  parse_schedule ();
  parse_boolean ("OMP_DYNAMIC", &gomp_global_icv.dyn_var);
  parse_boolean ("OMP_DYNAMIC", &gomp_global_icv.dyn_var);
  parse_boolean ("OMP_NESTED", &gomp_global_icv.nest_var);
  parse_boolean ("OMP_NESTED", &gomp_global_icv.nest_var);
  parse_unsigned_long ("OMP_MAX_ACTIVE_LEVELS", &gomp_max_active_levels_var,
  parse_unsigned_long ("OMP_MAX_ACTIVE_LEVELS", &gomp_max_active_levels_var,
                       true);
                       true);
  parse_unsigned_long ("OMP_THREAD_LIMIT", &gomp_thread_limit_var, false);
  parse_unsigned_long ("OMP_THREAD_LIMIT", &gomp_thread_limit_var, false);
  if (gomp_thread_limit_var != ULONG_MAX)
  if (gomp_thread_limit_var != ULONG_MAX)
    gomp_remaining_threads_count = gomp_thread_limit_var - 1;
    gomp_remaining_threads_count = gomp_thread_limit_var - 1;
#ifndef HAVE_SYNC_BUILTINS
#ifndef HAVE_SYNC_BUILTINS
  gomp_mutex_init (&gomp_remaining_threads_lock);
  gomp_mutex_init (&gomp_remaining_threads_lock);
#endif
#endif
  gomp_init_num_threads ();
  gomp_init_num_threads ();
  gomp_available_cpus = gomp_global_icv.nthreads_var;
  gomp_available_cpus = gomp_global_icv.nthreads_var;
  if (!parse_unsigned_long ("OMP_NUM_THREADS", &gomp_global_icv.nthreads_var,
  if (!parse_unsigned_long ("OMP_NUM_THREADS", &gomp_global_icv.nthreads_var,
                            false))
                            false))
    gomp_global_icv.nthreads_var = gomp_available_cpus;
    gomp_global_icv.nthreads_var = gomp_available_cpus;
  if (parse_affinity ())
  if (parse_affinity ())
    gomp_init_affinity ();
    gomp_init_affinity ();
  wait_policy = parse_wait_policy ();
  wait_policy = parse_wait_policy ();
  if (!parse_spincount ("GOMP_SPINCOUNT", &gomp_spin_count_var))
  if (!parse_spincount ("GOMP_SPINCOUNT", &gomp_spin_count_var))
    {
    {
      /* Using a rough estimation of 100000 spins per msec,
      /* Using a rough estimation of 100000 spins per msec,
         use 5 min blocking for OMP_WAIT_POLICY=active,
         use 5 min blocking for OMP_WAIT_POLICY=active,
         200 msec blocking when OMP_WAIT_POLICY is not specificed
         200 msec blocking when OMP_WAIT_POLICY is not specificed
         and 0 when OMP_WAIT_POLICY=passive.
         and 0 when OMP_WAIT_POLICY=passive.
         Depending on the CPU speed, this can be e.g. 5 times longer
         Depending on the CPU speed, this can be e.g. 5 times longer
         or 5 times shorter.  */
         or 5 times shorter.  */
      if (wait_policy > 0)
      if (wait_policy > 0)
        gomp_spin_count_var = 30000000000LL;
        gomp_spin_count_var = 30000000000LL;
      else if (wait_policy < 0)
      else if (wait_policy < 0)
        gomp_spin_count_var = 20000000LL;
        gomp_spin_count_var = 20000000LL;
    }
    }
  /* gomp_throttled_spin_count_var is used when there are more libgomp
  /* gomp_throttled_spin_count_var is used when there are more libgomp
     managed threads than available CPUs.  Use very short spinning.  */
     managed threads than available CPUs.  Use very short spinning.  */
  if (wait_policy > 0)
  if (wait_policy > 0)
    gomp_throttled_spin_count_var = 1000LL;
    gomp_throttled_spin_count_var = 1000LL;
  else if (wait_policy < 0)
  else if (wait_policy < 0)
    gomp_throttled_spin_count_var = 100LL;
    gomp_throttled_spin_count_var = 100LL;
  if (gomp_throttled_spin_count_var > gomp_spin_count_var)
  if (gomp_throttled_spin_count_var > gomp_spin_count_var)
    gomp_throttled_spin_count_var = gomp_spin_count_var;
    gomp_throttled_spin_count_var = gomp_spin_count_var;
 
 
  /* Not strictly environment related, but ordering constructors is tricky.  */
  /* Not strictly environment related, but ordering constructors is tricky.  */
  pthread_attr_init (&gomp_thread_attr);
  pthread_attr_init (&gomp_thread_attr);
  pthread_attr_setdetachstate (&gomp_thread_attr, PTHREAD_CREATE_DETACHED);
  pthread_attr_setdetachstate (&gomp_thread_attr, PTHREAD_CREATE_DETACHED);
 
 
  if (parse_stacksize ("OMP_STACKSIZE", &stacksize)
  if (parse_stacksize ("OMP_STACKSIZE", &stacksize)
      || parse_stacksize ("GOMP_STACKSIZE", &stacksize))
      || parse_stacksize ("GOMP_STACKSIZE", &stacksize))
    {
    {
      int err;
      int err;
 
 
      err = pthread_attr_setstacksize (&gomp_thread_attr, stacksize);
      err = pthread_attr_setstacksize (&gomp_thread_attr, stacksize);
 
 
#ifdef PTHREAD_STACK_MIN
#ifdef PTHREAD_STACK_MIN
      if (err == EINVAL)
      if (err == EINVAL)
        {
        {
          if (stacksize < PTHREAD_STACK_MIN)
          if (stacksize < PTHREAD_STACK_MIN)
            gomp_error ("Stack size less than minimum of %luk",
            gomp_error ("Stack size less than minimum of %luk",
                        PTHREAD_STACK_MIN / 1024ul
                        PTHREAD_STACK_MIN / 1024ul
                        + (PTHREAD_STACK_MIN % 1024 != 0));
                        + (PTHREAD_STACK_MIN % 1024 != 0));
          else
          else
            gomp_error ("Stack size larger than system limit");
            gomp_error ("Stack size larger than system limit");
        }
        }
      else
      else
#endif
#endif
      if (err != 0)
      if (err != 0)
        gomp_error ("Stack size change failed: %s", strerror (err));
        gomp_error ("Stack size change failed: %s", strerror (err));
    }
    }
}
}
 
 


/* The public OpenMP API routines that access these variables.  */
/* The public OpenMP API routines that access these variables.  */
 
 
void
void
omp_set_num_threads (int n)
omp_set_num_threads (int n)
{
{
  struct gomp_task_icv *icv = gomp_icv (true);
  struct gomp_task_icv *icv = gomp_icv (true);
  icv->nthreads_var = (n > 0 ? n : 1);
  icv->nthreads_var = (n > 0 ? n : 1);
}
}
 
 
void
void
omp_set_dynamic (int val)
omp_set_dynamic (int val)
{
{
  struct gomp_task_icv *icv = gomp_icv (true);
  struct gomp_task_icv *icv = gomp_icv (true);
  icv->dyn_var = val;
  icv->dyn_var = val;
}
}
 
 
int
int
omp_get_dynamic (void)
omp_get_dynamic (void)
{
{
  struct gomp_task_icv *icv = gomp_icv (false);
  struct gomp_task_icv *icv = gomp_icv (false);
  return icv->dyn_var;
  return icv->dyn_var;
}
}
 
 
void
void
omp_set_nested (int val)
omp_set_nested (int val)
{
{
  struct gomp_task_icv *icv = gomp_icv (true);
  struct gomp_task_icv *icv = gomp_icv (true);
  icv->nest_var = val;
  icv->nest_var = val;
}
}
 
 
int
int
omp_get_nested (void)
omp_get_nested (void)
{
{
  struct gomp_task_icv *icv = gomp_icv (false);
  struct gomp_task_icv *icv = gomp_icv (false);
  return icv->nest_var;
  return icv->nest_var;
}
}
 
 
void
void
omp_set_schedule (omp_sched_t kind, int modifier)
omp_set_schedule (omp_sched_t kind, int modifier)
{
{
  struct gomp_task_icv *icv = gomp_icv (true);
  struct gomp_task_icv *icv = gomp_icv (true);
  switch (kind)
  switch (kind)
    {
    {
    case omp_sched_static:
    case omp_sched_static:
      if (modifier < 1)
      if (modifier < 1)
        modifier = 0;
        modifier = 0;
      icv->run_sched_modifier = modifier;
      icv->run_sched_modifier = modifier;
      break;
      break;
    case omp_sched_dynamic:
    case omp_sched_dynamic:
    case omp_sched_guided:
    case omp_sched_guided:
      if (modifier < 1)
      if (modifier < 1)
        modifier = 1;
        modifier = 1;
      icv->run_sched_modifier = modifier;
      icv->run_sched_modifier = modifier;
      break;
      break;
    case omp_sched_auto:
    case omp_sched_auto:
      break;
      break;
    default:
    default:
      return;
      return;
    }
    }
  icv->run_sched_var = kind;
  icv->run_sched_var = kind;
}
}
 
 
void
void
omp_get_schedule (omp_sched_t *kind, int *modifier)
omp_get_schedule (omp_sched_t *kind, int *modifier)
{
{
  struct gomp_task_icv *icv = gomp_icv (false);
  struct gomp_task_icv *icv = gomp_icv (false);
  *kind = icv->run_sched_var;
  *kind = icv->run_sched_var;
  *modifier = icv->run_sched_modifier;
  *modifier = icv->run_sched_modifier;
}
}
 
 
int
int
omp_get_max_threads (void)
omp_get_max_threads (void)
{
{
  struct gomp_task_icv *icv = gomp_icv (false);
  struct gomp_task_icv *icv = gomp_icv (false);
  return icv->nthreads_var;
  return icv->nthreads_var;
}
}
 
 
int
int
omp_get_thread_limit (void)
omp_get_thread_limit (void)
{
{
  return gomp_thread_limit_var > INT_MAX ? INT_MAX : gomp_thread_limit_var;
  return gomp_thread_limit_var > INT_MAX ? INT_MAX : gomp_thread_limit_var;
}
}
 
 
void
void
omp_set_max_active_levels (int max_levels)
omp_set_max_active_levels (int max_levels)
{
{
  if (max_levels >= 0)
  if (max_levels >= 0)
    gomp_max_active_levels_var = max_levels;
    gomp_max_active_levels_var = max_levels;
}
}
 
 
int
int
omp_get_max_active_levels (void)
omp_get_max_active_levels (void)
{
{
  return gomp_max_active_levels_var;
  return gomp_max_active_levels_var;
}
}
 
 
ialias (omp_set_dynamic)
ialias (omp_set_dynamic)
ialias (omp_set_nested)
ialias (omp_set_nested)
ialias (omp_set_num_threads)
ialias (omp_set_num_threads)
ialias (omp_get_dynamic)
ialias (omp_get_dynamic)
ialias (omp_get_nested)
ialias (omp_get_nested)
ialias (omp_set_schedule)
ialias (omp_set_schedule)
ialias (omp_get_schedule)
ialias (omp_get_schedule)
ialias (omp_get_max_threads)
ialias (omp_get_max_threads)
ialias (omp_get_thread_limit)
ialias (omp_get_thread_limit)
ialias (omp_set_max_active_levels)
ialias (omp_set_max_active_levels)
ialias (omp_get_max_active_levels)
ialias (omp_get_max_active_levels)
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.