Changeset 3203 in CLRX


Ignore:
Timestamp:
Jun 28, 2017, 1:21:45 PM (22 months ago)
Author:
matszpk
Message:

CLRadeonExtender: Utils: add runExecWithOutput and findMesaOCL.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/utils/Utilities.h

    r3199 r3203  
    708708/// create directory
    709709extern void makeDir(const char* dirname);
     710/// run executable with output, returns array of output
     711extern Array<cxbyte> runExecWithOutput(const char* program, const char** argv);
     712
    710713/// find amdocl library, returns path if found, otherwise returns empty string
    711714extern std::string findAmdOCL();
     715
     716/// find Mesa OpenCL library, returns path if found, otherwise returns empty string
     717extern std::string findMesaOCL();
    712718
    713719/*
  • CLRadeonExtender/trunk/doc/ClrxAsmInvoke.md

    r3202 r3203  
    118118    Path to AMDOCL (AMD OpenCL implementation) shared library (libamdocl32.so,
    119119libamdocl64.so, amdocl.dll or amdocl64.dll).
    120    
     120
    121121### Output
    122122
  • CLRadeonExtender/trunk/utils/Utilities.cpp

    r3200 r3203  
    3030#include <unistd.h>
    3131#include <sys/stat.h>
     32#include <sys/wait.h>
    3233#endif
    3334#include <fstream>
     
    553554}
    554555
     556CLRX::Array<cxbyte> CLRX::runExecWithOutput(const char* program, const char** argv)
     557{
     558#ifndef HAVE_WINDOWS
     559    Array<cxbyte> output;
     560    errno = 0;
     561    int pipefds[2];
     562    if (::pipe(pipefds) < 0)
     563        throw Exception("Can't create pipe");
     564    int fret = fork();
     565    if (fret == 0)
     566    {   // children
     567        if (::close(1)<0)
     568            ::exit(-1);
     569        if (::dup(pipefds[1])<0) // redirection to pipe
     570            ::exit(-1);
     571        ::close(pipefds[0]);
     572        ::execvp(program, (char**)argv);
     573        ::exit(-1); // not
     574    }
     575    else if (fret > 0)
     576    {   // parent
     577        ::close(pipefds[1]);
     578        /* growing, growing... */
     579        size_t prevBufSize = 0;
     580        size_t readBufSize = 256;
     581        output.resize(readBufSize);
     582        try
     583        {
     584        while(true)
     585        {
     586            while (prevBufSize < readBufSize)
     587            {
     588                ssize_t ret = ::read(pipefds[0], output.data()+prevBufSize,
     589                            readBufSize-prevBufSize);
     590                if (ret < 0)
     591                    throw Exception("Can't read output of running process");
     592                prevBufSize += ret;
     593                if (ret == 0)
     594                    break;
     595            }
     596            if (prevBufSize < readBufSize)
     597            {   /* final resize */
     598                output.resize(prevBufSize);
     599                break;
     600            }
     601            prevBufSize = readBufSize;
     602            readBufSize = prevBufSize+(prevBufSize>>1);
     603            output.resize(readBufSize);
     604        }
     605        }
     606        catch(...)
     607        {   // close on error
     608            ::waitpid(fret, nullptr, 0);
     609            ::close(pipefds[0]);
     610            throw;
     611        }
     612        int status = 0;
     613        ::waitpid(fret, &status, 0);
     614        ::close(pipefds[0]);
     615        if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
     616            throw Exception("Process exited abnormally");
     617    }
     618    else
     619        throw Exception("Can't create new process");
     620    return output;
     621#else
     622    throw Exception("Unsupported function");
     623#endif
     624}
     625
    555626static const char* libAmdOCLPaths[] =
    556627{
     
    593664    return "";
    594665}
     666
     667static const char* libMesaOCLPaths[] =
     668{
     669#ifdef HAVE_LINUX
     670#  ifdef HAVE_32BIT
     671     "/usr/lib/i386-linux-gnu",
     672     "/usr/lib32",
     673     "/usr/lib"
     674#  else
     675     "/usr/lib/x86_64-linux-gnu",
     676     "/usr/lib64"
     677#  endif
     678#endif
     679};
     680
     681std::string CLRX::findMesaOCL()
     682{
     683    std::string amdOclPath = parseEnvVariable<std::string>("CLRX_MESAOCL_PATH", "");
     684    if (!amdOclPath.empty())
     685    {
     686        if (isFileExists(amdOclPath.c_str()))
     687            return amdOclPath;
     688    }
     689    else
     690    {
     691        for (const char* libPath: libMesaOCLPaths)
     692        {
     693            amdOclPath = joinPaths(libPath, "libMesaOpenCL.so.1");
     694            if (isFileExists(amdOclPath.c_str()))
     695                return amdOclPath;
     696        }
     697#ifdef HAVE_64BIT
     698        if (isFileExists("/usr/lib64/OpenCL/vendors/mesa/libOpenCL.so"))
     699            return "/usr/lib64/OpenCL/vendors/mesa/libOpenCL.so";
     700#else
     701        if (isFileExists("/usr/lib32/OpenCL/vendors/mesa/libOpenCL.so"))
     702            return "/usr/lib32/OpenCL/vendors/mesa/libOpenCL.so";
     703        if (isFileExists("/usr/lib/OpenCL/vendors/mesa/libOpenCL.so"))
     704            return "/usr/lib/OpenCL/vendors/mesa/libOpenCL.so";
     705#endif
     706    }
     707    return "";
     708}
Note: See TracChangeset for help on using the changeset viewer.