Changeset 2496 in Sophya


Ignore:
Timestamp:
Feb 3, 2004, 12:05:44 PM (22 years ago)
Author:
ansari
Message:

Implementation propre de la gestion de chargement dynamique (classe PDynLinkMgr) sur MacOSX/Darwin a travers les API NSObjectFileImage et NSModule + petite correction ds zthread.h (deplacement de unlock()) - Reza 3 Fevrier 2004

Location:
trunk/SophyaLib/SysTools
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/SysTools/cxxcmplnk.cc

    r2443 r2496  
    101101  linkCmd = compCmd;
    102102#else
    103   linkCmd = "cc -bundle -flat_namespace -undefined suppress ";
    104   linkOptions = "-L/usr/lib/gcc/darwin/default -lstdc++ -lcc_dynamic -lpthread ";
     103  linkCmd = "c++ -bundle ";
     104  linkOptions = "-lSystem -lm";
    105105#endif
    106106
  • trunk/SophyaLib/SysTools/pdlmgr.cc

    r2322 r2496  
    172172  cmd = "ld -b -o " + fnameso + " " + fnameobj + " -lm -lc";
    173173#elif defined(Darwin)
    174   cmd = "cc -bundle -flat_namespace -undefined suppress -o " + fnameso + " " + fnameobj + " -lm  -lcc_dynamic -lSystem ";
     174  // cmd = "cc -bundle -flat_namespace -undefined suppress -o " + fnameso + " " + fnameobj + " -lm  -lcc_dynamic -lSystem ";
     175  cmd = "cc -bundle -o " + fnameso + " " + fnameobj + " -lSystem -lm";
    175176#else
    176177  cmd = "ld -o " + fnameso + " " + fnameobj + " -lm -lc";
     
    195196PDynLinkMgr::PDynLinkMgr(string& soname, bool cp)
    196197{
    197 #ifndef Darwin
    198 dlhandle = NULL;
    199 #endif
     198dylok = false;
    200199soName = "";
    201200
     
    230229soName = fnameso;
    231230
     231string sdylerr;
    232232#if defined(HPUX)
    233 dlhandle = NULL;
    234233cerr << "PDynLinkMgr::PDynLinkMgr() Not yet available on HP-UX " << endl;
    235234return;
    236 #else
     235#elif defined(Darwin)
     236NSObjectFileImageReturnCode nsrc = NSCreateObjectFileImageFromFile(fnameso.c_str(), &nsobjfile);
     237if (nsrc == NSObjectFileImageSuccess) {
     238  nsmod = NSLinkModule(nsobjfile, fnameso.c_str(),
     239                       NSLINKMODULE_OPTION_BINDNOW | NSLINKMODULE_OPTION_PRIVATE |
     240                       NSLINKMODULE_OPTION_RETURN_ON_ERROR);
     241  // The second argument of NSLinkModule is the module name
     242  // We might associate later a name for the module in the PDynLinkMgr object
     243  if (nsmod != NULL) dylok = true;
     244  else cerr << "PDynLinkMgr::PDynLinkMgr()/ Error from NSLinkModule ... " << endl;
     245}
     246else {
     247  cerr << "PDynLinkMgr::PDynLinkMgr()/ Error from NSCreateObjectFileImageFromFile ... " << endl;
     248  if (nsrc == NSObjectFileImageFailure) cerr << " ErrCode= NSObjectFileImageFailure " << endl;
     249  else if (nsrc == NSObjectFileImageInappropriateFile) cerr << " ErrCode= NSObjectFileImageInappropriateFile" << endl;
     250  else if (nsrc == NSObjectFileImageArch ) cerr << " ErrCode= NSObjectFileImageArch" << endl;
     251  else if (nsrc == NSObjectFileImageFormat) cerr << " ErrCode= NSObjectFileImageFormat" << endl;
     252  else if (nsrc == NSObjectFileImageAccess) cerr << " ErrCode= NSObjectFileImageAccess" << endl;
     253}
     254#else
     255dlhandle = NULL;
    237256dlhandle =  dlopen(fnameso.c_str(), RTLD_NOW);
    238 if (dlhandle == NULL) {
     257if (dlhandle != NULL) dylok = true;
     258else {
     259  sdylerr = "Loader Error (dlerror()):";
     260  sdylerr += dlerror();
     261#endif
     262
     263if (!dylok)  {
    239264  cerr << "PDynLinkMgr::PDynLinkMgr(): Error opening SO " << fnameso
    240265       << " (" << soname << ")" << endl;
    241   string sn = dlerror();
    242   cerr << "Loader Error (dlerror()) :" << sn << endl;
     266  if (sdylerr.length() > 0) cerr << sdylerr;
    243267  return;
    244268  }
    245 #endif
    246269}
    247270
     
    253276#if defined(HPUX)
    254277cerr << "PDynLinkMgr::~PDynLinkMgr() Not yet available on HP-UX " << endl;
    255 return;
    256 #else
    257 if (dlhandle) dlclose(dlhandle);    dlhandle = NULL;
     278// return;
     279#elif defined(Darwin)
     280if (dylok) {
     281  if (nsmod != NULL)  NSUnLinkModule(nsmod, NSUNLINKMODULE_OPTION_NONE);
     282  NSDestroyObjectFileImage(nsobjfile);
     283  }
     284#else
     285if (dylok) {
     286  if (dlhandle) dlclose(dlhandle);    dlhandle = NULL;
     287  }
     288#endif
    258289if (copy) {
    259290  string cmd = "rm -f " + soName;
    260291  system(cmd.c_str());
    261292  }
    262 #endif
    263293}
    264294
     
    269299{
    270300DlFunction f = NULL;
     301if (!dylok) {
     302  cerr << "PDynLinkMgr::GetFunction() Error:sharedobjet/dynamic library not open -> f=NULL" << endl;
     303  return f;
     304}
    271305#if defined(HPUX)
    272306cerr << "PDynLinkMgr::GetFunction() Not yet available on HP-UX " << endl;
    273307return f;
    274 #else
     308#endif
    275309#if defined(Darwin)
    276310string funame = "_" + funcname;
     311NSSymbol nsf = NSLookupSymbolInModule(nsmod, funame.c_str());
     312f = (DlFunction)NSAddressOfSymbol(nsf);
    277313#else
    278314string const & funame = funcname;
    279 #endif
    280315if (dlhandle != NULL) 
    281316  f = (DlFunction)dlsym(dlhandle, funame.c_str());
     317#endif
     318
    282319if (f == NULL) cerr << "PDynLinkMgr::GetFunction(): Error linking " << funcname << endl;
    283320return(f);
    284 #endif
    285 }
    286 
    287 
     321}
     322
     323
  • trunk/SophyaLib/SysTools/pdlmgr.h

    r1900 r2496  
    1313#include <dl.h>
    1414#elif defined(Darwin)
    15 #include </sw/include/dlfcn.h>
     15#include <mach-o/dyld.h>
    1616#else
    1717#include <dlfcn.h>
     
    3535
    3636  virtual DlFunction    GetFunction(string const & funcname);             
     37  inline  DlFunction    GetFunction(const char * funcname)
     38    { string fname = funcname;   return GetFunction(fname); }           
     39
     40  inline  string        GetName() const { return soName; }
    3741
    3842protected :
     
    4347#if defined(HPUX)
    4448  shl_t dlhandle;
     49#elif defined(Darwin)
     50  NSObjectFileImage nsobjfile;
     51  NSModule nsmod;
    4552#else
    4653  void * dlhandle;
    4754#endif
     55  bool dylok;
    4856  string soName;
    4957  bool copy;
  • trunk/SophyaLib/SysTools/zthread.h

    r2488 r2496  
    9898  {
    9999    if (_mtx) {
    100       _mtx->unlock();
    101100      if (_sigbr == 1) _mtx->signal();
    102101      else  if (_sigbr == 2) _mtx->broadcast();
     102      _mtx->unlock();
    103103    }
    104104  }
Note: See TracChangeset for help on using the changeset viewer.