Actual source code: dlimpl.c

  1: #define PETSC_DLL
  2: /*
  3:    Low-level routines for managing dynamic link libraries (DLLs).
  4: */

 6:  #include ../src/sys/dll/dlimpl.h

  8: /* XXX Should be done better !!!*/
  9: #if !defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
 10: #undef PETSC_HAVE_WINDOWS_H
 11: #undef PETSC_HAVE_DLFCN_H
 12: #endif

 14: #if defined(PETSC_HAVE_WINDOWS_H)
 15: #include <windows.h>
 16: #elif defined(PETSC_HAVE_DLFCN_H)
 17: #include <dlfcn.h>
 18: #endif

 20: #if defined(PETSC_HAVE_WINDOWS_H)
 21: typedef HMODULE dlhandle_t;
 22: typedef FARPROC dlsymbol_t;
 23: #elif defined(PETSC_HAVE_DLFCN_H)
 24: typedef void* dlhandle_t;
 25: typedef void* dlsymbol_t;
 26: #else
 27: typedef void* dlhandle_t;
 28: typedef void* dlsymbol_t;
 29: #endif

 33: /*@C
 34:    PetscDLOpen - 
 35: @*/
 36: PetscErrorCode  PetscDLOpen(const char name[],int flags,PetscDLHandle *handle)
 37: {
 38:   int        dlflags1,dlflags2;
 39:   dlhandle_t dlhandle;


 45:   dlflags1 = 0;
 46:   dlflags2 = 0;
 47:   dlhandle = (dlhandle_t) 0;
 48:   *handle  = (PetscDLHandle) 0;

 50:   /* 
 51:      --- LoadLibrary ---
 52:   */
 53: #if defined(PETSC_HAVE_WINDOWS_H) && defined(PETSC_HAVE_LOADLIBRARY)
 54:   dlhandle = LoadLibrary(name);
 55:   if (!dlhandle) {
 56: #if defined(PETSC_HAVE_GETLASTERROR)
 58:     DWORD erc;
 59:     char  *buff = NULL;
 60:     erc = GetLastError();
 61:     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
 62:                   NULL,erc,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPSTR)&buff,0,NULL);
 63:     PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,PETSC_ERR_FILE_OPEN,1,
 64:                       "Unable to open dynamic library:\n  %s\n  Error message from LoadLibrary() %s\n",name,buff);
 65:     LocalFree(buff);
 66:     PetscFunctionReturn(ierr);
 67: #else
 68:     SETERRQ2(PETSC_ERR_FILE_OPEN,"Unable to open dynamic library:\n  %s\n  Error message from LoadLibrary() %s\n",name,"unavailable");
 69: #endif
 70:   }

 72:   /* 
 73:      --- dlopen ---
 74:   */
 75: #elif defined(PETSC_HAVE_DLFCN_H) && defined(PETSC_HAVE_DLOPEN)
 76:   /*
 77:       Mode indicates symbols required by symbol loaded with dlsym() 
 78:      are only loaded when required (not all together) also indicates
 79:      symbols required can be contained in other libraries also opened
 80:      with dlopen()
 81:   */
 82: #if defined(PETSC_HAVE_RTLD_LAZY)
 83:   dlflags1 = RTLD_LAZY;
 84: #endif
 85: #if defined(PETSC_HAVE_RTLD_NOW)
 86:   if (flags & PETSC_DL_NOW)
 87:     dlflags1 = RTLD_NOW;
 88: #endif
 89: #if defined(PETSC_HAVE_RTLD_GLOBAL)
 90:   dlflags2 = RTLD_GLOBAL;
 91: #endif
 92: #if defined(PETSC_HAVE_RTLD_LOCAL)
 93:   if (flags & PETSC_DL_LOCAL)
 94:     dlflags2 = RTLD_LOCAL;
 95: #endif
 96: #if defined(PETSC_HAVE_DLERROR)
 97:   dlerror(); /* clear any previous error */
 98: #endif
 99:   dlhandle = dlopen(name,dlflags1|dlflags2);
100:   if (!dlhandle) {
101: #if defined(PETSC_HAVE_DLERROR)
102:     const char *errmsg = dlerror();
103: #else
104:     const char *errmsg = "unavailable";
105: #endif
106:     SETERRQ2(PETSC_ERR_FILE_OPEN,"Unable to open dynamic library:\n  %s\n  Error message from dlopen() %s\n",name,errmsg)
107:   }

109:   /* 
110:      --- unimplemented ---
111:   */
112: #else
113:   SETERRQ(PETSC_ERR_SUP_SYS, "Cannot use dynamic libraries on this platform");
114: #endif

116:   *handle = (PetscDLHandle) dlhandle;

118:   return(0);
119: }


124: /*@C
125:    PetscDLClose - 
126: @*/
127: PetscErrorCode  PetscDLClose(PetscDLHandle *handle)
128: {
129:   dlhandle_t dlhandle;


134:   dlhandle = (dlhandle_t) *handle;

136:   /* 
137:      --- FreeLibrary ---
138:   */
139: #if defined(PETSC_HAVE_WINDOWS_H)
140: #if defined(PETSC_HAVE_FREELIBRARY)
141:   if (FreeLibrary(dlhandle) == 0) {
142: #if defined(PETSC_HAVE_GETLASTERROR)
143:     char  *buff = NULL;
144:     DWORD erc   = GetLastError();
145:     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
146:                   NULL,erc,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPSTR)&buff,0,NULL);
147:     PetscErrorPrintf("Error closing dynamic library:\n  Error message from FreeLibrary() %s\n",buff);
148:     LocalFree(buff);
149: #else
150:     PetscErrorPrintf("Error closing dynamic library:\n  Error message from FreeLibrary() %s\n","unavailable");
151: #endif
152:   }
153: #endif /* !PETSC_HAVE_FREELIBRARY */

155:   /* 
156:      --- dclose --- 
157:   */
158: #elif defined(PETSC_HAVE_DLFCN_H)
159: #if defined(PETSC_HAVE_DLCLOSE)
160: #if defined(PETSC_HAVE_DLERROR)
161:   dlerror(); /* clear any previous error */
162: #endif
163:   if (dlclose(dlhandle) < 0) {
164: #if defined(PETSC_HAVE_DLERROR)
165:     const char *errmsg = dlerror();
166: #else
167:     const char *errmsg = "unavailable";
168: #endif
169:     PetscErrorPrintf("Error closing dynamic library:\n  Error message from dlclose() %s\n", errmsg);
170:   }
171: #endif /* !PETSC_HAVE_DLCLOSE */

173:   /* 
174:      --- unimplemented --- 
175:   */
176: #else
177:   SETERRQ(PETSC_ERR_SUP_SYS, "Cannot use dynamic libraries on this platform");
178: #endif

180:   *handle = PETSC_NULL;

182:   return(0);
183: }


188: /*@C
189:    PetscDLSym - 
190: @*/
191: PetscErrorCode  PetscDLSym(PetscDLHandle handle,const char symbol[],void **value)
192: {
193:   dlhandle_t dlhandle;
194:   dlsymbol_t dlsymbol;


200:   dlhandle = (dlhandle_t) 0;
201:   dlsymbol = (dlsymbol_t) 0;

203:   *value   = (void *) 0;

205:   /* 
206:      --- GetProcAddress ---
207:   */
208: #if defined(PETSC_HAVE_WINDOWS_H) 
209: #if defined(PETSC_HAVE_GETPROCADDRESS)
210:   if (handle != PETSC_NULL)
211:     dlhandle = (dlhandle_t) handle;
212:   else
213:     dlhandle = (dlhandle_t) GetCurrentProcess();
214:   dlsymbol = (dlsymbol_t) GetProcAddress(dlhandle,symbol);
215: #if defined(PETSC_HAVE_SETLASTERROR)
216:   SetLastError((DWORD)0); /* clear any previous error */
217: #endif
218: #endif /* !PETSC_HAVE_GETPROCADDRESS */

220:   /* 
221:      --- dlsym ---
222:   */
223: #elif defined(PETSC_HAVE_DLFCN_H)
224: #if defined(PETSC_HAVE_DLSYM)
225:   if (handle != PETSC_NULL)
226:     dlhandle = (dlhandle_t) handle;
227:   else
228:     dlhandle = (dlhandle_t) 0;
229: #if defined(PETSC_HAVE_DLERROR)
230:   dlerror(); /* clear any previous error */
231: #endif
232:   dlsymbol = (dlsymbol_t) dlsym(dlhandle,symbol);
233: #if defined(PETSC_HAVE_DLERROR)
234:   dlerror(); /* clear any previous error */
235: #endif
236: #endif /* !PETSC_HAVE_DLSYM */

238:   /* 
239:      --- unimplemented --- 
240:   */
241: #else
242:   SETERRQ(PETSC_ERR_SUP_SYS, "Cannot use dynamic libraries on this platform");
243: #endif

245:   *value = *((void**)&dlsymbol);

247:   return(0);
248: }