src/glpenv01.c
author Alpar Juttner <alpar@cs.elte.hu>
Mon, 06 Dec 2010 13:09:21 +0100
changeset 1 c445c931472f
permissions -rw-r--r--
Import glpk-4.45

- Generated files and doc/notes are removed
     1 /* glpenv01.c (environment initialization/termination) */
     2 
     3 /***********************************************************************
     4 *  This code is part of GLPK (GNU Linear Programming Kit).
     5 *
     6 *  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
     7 *  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
     8 *  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
     9 *  E-mail: <mao@gnu.org>.
    10 *
    11 *  GLPK is free software: you can redistribute it and/or modify it
    12 *  under the terms of the GNU General Public License as published by
    13 *  the Free Software Foundation, either version 3 of the License, or
    14 *  (at your option) any later version.
    15 *
    16 *  GLPK is distributed in the hope that it will be useful, but WITHOUT
    17 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    18 *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
    19 *  License for more details.
    20 *
    21 *  You should have received a copy of the GNU General Public License
    22 *  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
    23 ***********************************************************************/
    24 
    25 #include "glpapi.h"
    26 
    27 /***********************************************************************
    28 *  NAME
    29 *
    30 *  glp_init_env - initialize GLPK environment
    31 *
    32 *  SYNOPSIS
    33 *
    34 *  int glp_init_env(void);
    35 *
    36 *  DESCRIPTION
    37 *
    38 *  The routine glp_init_env initializes the GLPK environment. Normally
    39 *  the application program does not need to call this routine, because
    40 *  it is called automatically on the first call to any API routine.
    41 *
    42 *  RETURNS
    43 *
    44 *  The routine glp_init_env returns one of the following codes:
    45 *
    46 *  0 - initialization successful;
    47 *  1 - environment has been already initialized;
    48 *  2 - initialization failed (insufficient memory);
    49 *  3 - initialization failed (unsupported programming model). */
    50 
    51 int glp_init_env(void)
    52 {     ENV *env;
    53       int ok;
    54       /* check if the programming model is supported */
    55       ok = (CHAR_BIT == 8 && sizeof(char) == 1 &&
    56          sizeof(short) == 2 && sizeof(int) == 4 &&
    57          (sizeof(void *) == 4 || sizeof(void *) == 8));
    58       if (!ok) return 3;
    59       /* check if the environment is already initialized */
    60       if (tls_get_ptr() != NULL) return 1;
    61       /* allocate and initialize the environment block */
    62       env = malloc(sizeof(ENV));
    63       if (env == NULL) return 2;
    64       env->magic = ENV_MAGIC;
    65       sprintf(env->version, "%d.%d",
    66          GLP_MAJOR_VERSION, GLP_MINOR_VERSION);
    67       env->term_buf = malloc(TERM_BUF_SIZE);
    68       if (env->term_buf == NULL)
    69       {  free(env);
    70          return 2;
    71       }
    72       env->term_out = GLP_ON;
    73       env->term_hook = NULL;
    74       env->term_info = NULL;
    75       env->tee_file = NULL;
    76       env->err_file = "";
    77       env->err_line = 0;
    78       env->err_hook = NULL;
    79       env->err_info = NULL;
    80       env->mem_limit.hi = 0x7FFFFFFF, env->mem_limit.lo = 0xFFFFFFFF;
    81       env->mem_ptr = NULL;
    82       env->mem_count = env->mem_cpeak = 0;
    83       env->mem_total = env->mem_tpeak = xlset(0);
    84       env->file_ptr = NULL;
    85       env->ioerr_msg = malloc(IOERR_MSG_SIZE);
    86       if (env->ioerr_msg == NULL)
    87       {  free(env->term_buf);
    88          free(env);
    89          return 2;
    90       }
    91       strcpy(env->ioerr_msg, "No error");
    92       env->h_odbc = env->h_mysql = NULL;
    93       /* save pointer to the environment block */
    94       tls_set_ptr(env);
    95       /* initialization successful */
    96       return 0;
    97 }
    98 
    99 /***********************************************************************
   100 *  NAME
   101 *
   102 *  get_env_ptr - retrieve pointer to environment block
   103 *
   104 *  SYNOPSIS
   105 *
   106 *  #include "glpenv.h"
   107 *  ENV *get_env_ptr(void);
   108 *
   109 *  DESCRIPTION
   110 *
   111 *  The routine get_env_ptr retrieves and returns a pointer to the GLPK
   112 *  environment block.
   113 *
   114 *  If the GLPK environment has not been initialized yet, the routine
   115 *  performs initialization. If initialization fails, the routine prints
   116 *  an error message to stderr and terminates the program.
   117 *
   118 *  RETURNS
   119 *
   120 *  The routine returns a pointer to the environment block. */
   121 
   122 ENV *get_env_ptr(void)
   123 {     ENV *env = tls_get_ptr();
   124       /* check if the environment has been initialized */
   125       if (env == NULL)
   126       {  /* not initialized yet; perform initialization */
   127          if (glp_init_env() != 0)
   128          {  /* initialization failed; display an error message */
   129             fprintf(stderr, "GLPK initialization failed\n");
   130             fflush(stderr);
   131             /* and abnormally terminate the program */
   132             abort();
   133          }
   134          /* initialization successful; retrieve the pointer */
   135          env = tls_get_ptr();
   136       }
   137       /* check if the environment block is valid */
   138       if (env->magic != ENV_MAGIC)
   139       {  fprintf(stderr, "Invalid GLPK environment\n");
   140          fflush(stderr);
   141          abort();
   142       }
   143       return env;
   144 }
   145 
   146 /***********************************************************************
   147 *  NAME
   148 *
   149 *  glp_version - determine library version
   150 *
   151 *  SYNOPSIS
   152 *
   153 *  const char *glp_version(void);
   154 *
   155 *  RETURNS
   156 *
   157 *  The routine glp_version returns a pointer to a null-terminated
   158 *  character string, which specifies the version of the GLPK library in
   159 *  the form "X.Y", where X is the major version number, and Y is the
   160 *  minor version number, for example, "4.16". */
   161 
   162 const char *glp_version(void)
   163 {     ENV *env = get_env_ptr();
   164       return env->version;
   165 }
   166 
   167 /***********************************************************************
   168 *  NAME
   169 *
   170 *  glp_free_env - free GLPK environment
   171 *
   172 *  SYNOPSIS
   173 *
   174 *  int glp_free_env(void);
   175 *
   176 *  DESCRIPTION
   177 *
   178 *  The routine glp_free_env frees all resources used by GLPK routines
   179 *  (memory blocks, etc.) which are currently still in use.
   180 *
   181 *  Normally the application program does not need to call this routine,
   182 *  because GLPK routines always free all unused resources. However, if
   183 *  the application program even has deleted all problem objects, there
   184 *  will be several memory blocks still allocated for the library needs.
   185 *  For some reasons the application program may want GLPK to free this
   186 *  memory, in which case it should call glp_free_env.
   187 *
   188 *  Note that a call to glp_free_env invalidates all problem objects as
   189 *  if no GLPK routine were called.
   190 *
   191 *  RETURNS
   192 *
   193 *  0 - termination successful;
   194 *  1 - environment is inactive (was not initialized). */
   195 
   196 int glp_free_env(void)
   197 {     ENV *env = tls_get_ptr();
   198       MEM *desc;
   199       /* check if the environment is active */
   200       if (env == NULL) return 1;
   201       /* check if the environment block is valid */
   202       if (env->magic != ENV_MAGIC)
   203       {  fprintf(stderr, "Invalid GLPK environment\n");
   204          fflush(stderr);
   205          abort();
   206       }
   207       /* close handles to shared libraries */
   208       if (env->h_odbc != NULL)
   209          xdlclose(env->h_odbc);
   210       if (env->h_mysql != NULL)
   211          xdlclose(env->h_mysql);
   212       /* close streams which are still open */
   213       while (env->file_ptr != NULL)
   214          xfclose(env->file_ptr);
   215       /* free memory blocks which are still allocated */
   216       while (env->mem_ptr != NULL)
   217       {  desc = env->mem_ptr;
   218          env->mem_ptr = desc->next;
   219          free(desc);
   220       }
   221       /* invalidate the environment block */
   222       env->magic = -1;
   223       /* free memory allocated to the environment block */
   224       free(env->term_buf);
   225       free(env->ioerr_msg);
   226       free(env);
   227       /* reset a pointer to the environment block */
   228       tls_set_ptr(NULL);
   229       /* termination successful */
   230       return 0;
   231 }
   232 
   233 /* eof */