COIN-OR::LEMON - Graph Library

source: glpk-cmake/src/glpenv01.c

Last change on this file was 1:c445c931472f, checked in by Alpar Juttner <alpar@…>, 13 years ago

Import glpk-4.45

  • Generated files and doc/notes are removed
File size: 7.2 KB
Line 
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
51int 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
122ENV *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
162const 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
196int 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 */
Note: See TracBrowser for help on using the repository browser.