| /* | |
| * Copyright 2010-2016 Intel Corporation. | |
| * | |
| * This library is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU Lesser General Public License as published | |
| * by the Free Software Foundation, version 2.1. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| * 02110-1301 USA. | |
| * | |
| * Disclaimer: The codes contained in these modules may be specific | |
| * to the Intel Software Development Platform codenamed Knights Ferry, | |
| * and the Intel product codenamed Knights Corner, and are not backward | |
| * compatible with other Intel products. Additionally, Intel will NOT | |
| * support the codes or instruction set in future products. | |
| * | |
| * Intel offers no warranty of any kind regarding the code. This code is | |
| * licensed on an "AS IS" basis and Intel is not obligated to provide | |
| * any support, assistance, installation, training, or other services | |
| * of any kind. Intel is also not obligated to provide any updates, | |
| * enhancements or extensions. Intel specifically disclaims any warranty | |
| * of merchantability, non-infringement, fitness for any particular | |
| * purpose, and any other warranty. | |
| * | |
| * Further, Intel disclaims all liability of any kind, including but | |
| * not limited to liability for infringement of any proprietary rights, | |
| * relating to the use of the code, even if Intel is notified of the | |
| * possibility of such liability. Except as expressly stated in an Intel | |
| * license agreement provided with this code and agreed upon with Intel, | |
| * no license, express or implied, by estoppel or otherwise, to any | |
| * intellectual property rights is granted herein. | |
| */ | |
| #ifndef _COIPROCESS_SOURCE_H | |
| #define _COIPROCESS_SOURCE_H | |
| /** @ingroup COIProcess | |
| * @addtogroup COIProcessSource | |
| @{ | |
| * @file source/COIProcess_source.h | |
| */ | |
| #ifndef DOXYGEN_SHOULD_SKIP_THIS | |
| #include "../common/COITypes_common.h" | |
| #include "../common/COIResult_common.h" | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| #endif // DOXYGEN_SHOULD_SKIP_THIS | |
| /////////////////////////////////////////////////////////////////////////////// | |
| /// This is a special COIPROCESS handle that can be used to indicate that | |
| /// the source process should be used for an operation. | |
| /// | |
| #define COI_PROCESS_SOURCE ((COIPROCESS)-1) | |
| #define COI_MAX_FILE_NAME_LENGTH 256 | |
| /////////////////////////////////////////////////////////////////////////////// | |
| /// This is a flag for COIProcessCreateFromMemory that indicates the passed in | |
| /// memory pointer is a fat binary file and should not have regular validation. | |
| /// | |
| #define COI_FAT_BINARY ((uint64_t)-1) | |
| /////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Create a remote process on the Sink and start executing its main() | |
| /// function. | |
| /// | |
| /// For more details about creating a process see COIProcessCreateFromMemory. | |
| /// | |
| /// @param in_Engine | |
| /// [in] A handle retrieved via a call to COIEngineGetHandle() that | |
| /// indicates which device to create the process on. This is | |
| /// necessary because there can be more than one device | |
| /// within the system. | |
| /// | |
| /// @param in_pBinaryName | |
| /// [in] Pointer to a null-terminated string that contains the | |
| /// path to the program binary to be instantiated as a process on | |
| /// the sink device. The file name will be accessed via | |
| /// fopen and fread, as such, the passed in binary name must | |
| /// be locatable via these commands. Also, the file name (without | |
| /// directory information) will be used automatically by the system | |
| /// to create the argv[0] of the new process. | |
| /// | |
| /// @param in_Argc | |
| /// [in] The number of arguments being passed in to the process in the | |
| /// in_ppArgv parameter. | |
| /// | |
| /// @param in_ppArgv | |
| /// [in] An array of strings that represent the arguments being passed | |
| /// in. The system will auto-generate argv[0] using in_pBinaryName and | |
| /// thus that parameter cannot be passed in using in_ppArgv. Instead, | |
| /// in_ppArgv contains the rest of the parameters being passed in. | |
| /// | |
| /// @param in_DupEnv | |
| /// [in] A boolean that indicates whether the process that is being | |
| /// created should inherit the environment of the caller. | |
| /// | |
| /// @param in_ppAdditionalEnv | |
| /// [in] An array of strings that represent additional environment | |
| /// variables. This parameter must terminate the array with a NULL | |
| /// string. For convenience it is also allowed to be NULL if there are | |
| /// no additional environment variables that need adding. Note that | |
| /// any environment variables specified here will be in addition to | |
| /// but override those that were inherited via in_DupEnv. | |
| /// | |
| /// @param in_ProxyActive | |
| /// [in] A boolean that specifies whether the process that is to be | |
| /// created wants I/O proxy support. If this flag is enabled, then | |
| /// stdout and stderr are forwarded back to the calling process's | |
| /// output and error streams. | |
| /// | |
| /// @param in_Reserved | |
| /// Reserved for future use, best set at NULL. | |
| /// | |
| /// @param in_InitialBufferSpace | |
| /// [in] The initial memory (in bytes) that will be pre-allocated at | |
| /// process creation for use by buffers associated with this remote | |
| /// process. In addition to allocating, Intel(R) Coprocessor Offload | |
| /// Infrastructure (Intel(R) COI) will also fault in the | |
| /// memory during process creation. If the total size of the buffers | |
| /// in use by this process exceed this initial size, memory on the | |
| /// sink may continue to be allocated on demand, as needed, subject | |
| /// to the system constraints on the sink. | |
| /// | |
| ///@param in_LibrarySearchPath | |
| /// [in] a path to locate dynamic libraries dependencies for the sink | |
| /// application. If not NULL, this path will override the environment | |
| /// variable SINK_LD_LIBRARY_PATH. If NULL it will use | |
| /// SINK_LD_LIBRARY_PATH to locate dependencies. | |
| /// | |
| /// @param out_pProcess | |
| /// [out] Handle returned to uniquely identify the process that was | |
| /// created for use in later API calls. | |
| /// | |
| /// @return COI_SUCCESS if the remote process was successfully created. | |
| /// | |
| /// @return COI_INVALID_POINTER if in_pBinaryName was NULL. | |
| /// | |
| /// @return COI_INVALID_FILE if in_pBinaryName is not a "regular file" as | |
| /// determined by stat or if its size is 0. | |
| /// | |
| /// @return COI_DOES_NOT_EXIST if in_pBinaryName cannot be found. | |
| /// | |
| /// @return See COIProcessCreateFromMemory for additional errors. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessCreateFromFile( | |
| COIENGINE in_Engine, | |
| const char *in_pBinaryName, | |
| int in_Argc, | |
| const char **in_ppArgv, | |
| uint8_t in_DupEnv, | |
| const char **in_ppAdditionalEnv, | |
| uint8_t in_ProxyActive, | |
| const char *in_Reserved, | |
| uint64_t in_InitialBufferSpace, | |
| const char *in_LibrarySearchPath, | |
| COIPROCESS *out_pProcess); | |
| /////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Create a remote process on the Sink and start executing its main() | |
| /// function. This will also automatically load any dependent shared objects | |
| /// on to the device. Once the process is created, remote calls can be | |
| /// initiated by using the RunFunction mechanism found in the COIPipeline APIs. | |
| /// | |
| /// If instead of creating a process you only wish to check for dynamic | |
| /// library dependencies set the environment variable | |
| /// SINK_LD_TRACE_LOADED_OBJECTS to be non empty before making this call. | |
| /// | |
| /// If there are dynamic link libraries on the source file system that need to | |
| /// be preloaded when the process is created on the device, callers of this | |
| /// API can set the environment variable SINK_LD_PRELOAD to a colon separated | |
| /// list of libraries that need to be copied to the sink and preloaded as part | |
| /// of process creation. | |
| /// | |
| /// For more information on how dependencies are loaded, see | |
| /// COIProcessLoadLibraryFromMemory. | |
| /// | |
| /// @param in_Engine | |
| /// [in] A handle retrieved via a call to COIEngineGetHandle() that | |
| /// indicates which device to create the process on. This is | |
| /// necessary because there can be more than one device | |
| /// within the system. | |
| /// | |
| /// @param in_pBinaryName | |
| /// [in] Pointer to a null-terminated string that contains the name to | |
| /// give the process that will be created. Note that the final name | |
| /// will strip out any directory information from in_pBinaryName and | |
| /// use the file information to generate an argv[0] for the new | |
| /// process. | |
| /// | |
| /// @param in_pBinaryBuffer | |
| /// [in] Pointer to a buffer whose contents represent the sink-side | |
| /// process that we want to create. | |
| /// | |
| /// @param in_BinaryBufferLength | |
| /// [in] Number of bytes in in_pBinaryBuffer. | |
| /// | |
| /// @param in_Argc | |
| /// [in] The number of arguments being passed in to the process in the | |
| /// in_ppArgv parameter. | |
| /// | |
| /// @param in_ppArgv | |
| /// [in] An array of strings that represent the arguments being passed | |
| /// in. The system will auto-generate argv[0] using in_pBinaryName and | |
| /// thus that parameter cannot be passed in using in_ppArgv. Instead, | |
| /// in_ppArgv contains the rest of the parameters being passed in. | |
| /// | |
| /// @param in_DupEnv | |
| /// [in] A boolean that indicates whether the process that is being | |
| /// created should inherit the environment of the caller. | |
| /// | |
| /// @param in_ppAdditionalEnv | |
| /// [in] An array of strings that represent additional environment | |
| /// variables. This parameter must terminate the array with a NULL | |
| /// string. For convenience it is also allowed to be NULL if there are | |
| /// no additional environment variables that need adding. Note that | |
| /// any environment variables specified here will be in addition to | |
| /// but override those that were inherited via in_DupEnv. | |
| /// | |
| /// @param in_ProxyActive | |
| /// [in] A boolean that specifies whether the process that is to be | |
| /// created wants I/O proxy support. | |
| /// | |
| /// @param in_Reserved | |
| /// Reserved for future use, best set to NULL. | |
| /// | |
| /// @param in_InitialBufferSpace | |
| /// [in] The initial memory (in bytes) that will be pre-allocated at | |
| /// process creation for use by buffers associated with this remote | |
| /// process. In addition to allocating, Intel(R) Coprocessor | |
| /// Offload Infrastructure (Intel(R) COI) will also fault in the | |
| /// memory during process creation. If the total size of the buffers | |
| /// in use by this process exceed this initial size, memory on the | |
| /// sink may continue to be allocated on demand, as needed, subject | |
| /// to the system constraints on the sink. | |
| /// | |
| /// @param in_LibrarySearchPath | |
| /// [in] A path to locate dynamic libraries dependencies for the sink | |
| /// application. If not NULL, this path will override the environment | |
| /// variable SINK_LD_LIBRARY_PATH. If NULL it will use | |
| /// SINK_LD_LIBRARY_PATH to locate dependencies. | |
| /// | |
| /// @param in_FileOfOrigin | |
| /// [in] If not NULL, this parameter indicates the file from which the | |
| /// in_pBinaryBuffer was obtained. This parameter is optional. | |
| /// | |
| /// @param in_FileOfOriginOffset | |
| /// [in] If in_FileOfOrigin is not NULL, this parameter indicates the | |
| /// offset within that file where in_pBinaryBuffer begins. | |
| /// | |
| /// @param out_pProcess | |
| /// [out] Handle returned to uniquely identify the process that was | |
| /// created for use in later API calls. | |
| /// | |
| /// @return COI_SUCCESS if the remote process was successfully created. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the in_Engine handle passed in was invalid. | |
| /// | |
| /// @return COI_INVALID_POINTER if out_pProcess was NULL. | |
| /// | |
| /// @return COI_INVALID_POINTER if in_pBinaryName or in_pBinaryBuffer was NULL. | |
| /// | |
| /// @return COI_MISSING_DEPENDENCY if a dependent library is missing from | |
| /// either SINK_LD_LIBRARY_PATH or the in_LibrarySearchPath parameter. | |
| /// | |
| /// @return COI_BINARY_AND_HARDWARE_MISMATCH if in_pBinaryName or any of its | |
| /// recursive dependencies were built for a target machine that does | |
| /// not match the engine specified. | |
| /// | |
| /// @return COI_RESOURCE_EXHAUSTED if no more COIProcesses can be created, | |
| /// possibly, but not necessarily because in_InitialBufferSpace is too | |
| /// large. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if in_Argc is 0 and in_ppArgv is not NULL. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if in_Argc is greater than 0 and in_ppArgv is | |
| /// NULL. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if in_Argc is less than 0. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if the length of in_pBinaryName is greater than or | |
| /// equal to COI_MAX_FILE_NAME_LENGTH. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if in_BinaryBufferLength is 0. | |
| /// | |
| /// @return COI_TIME_OUT_REACHED if establishing the communication channel with | |
| /// the remote process timed out. | |
| /// | |
| /// @return COI_DOES_NOT_EXIST if in_FileOfOrigin is not NULL and does not | |
| /// exist. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if in_FileOfOrigin is NULL and | |
| /// in_FileOfOriginOffset is not 0. | |
| /// | |
| /// @return COI_INVALID_FILE if in_FileOfOrigin is not a "regular file" as | |
| /// determined by stat or if its size is 0. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if in_FileOfOrigin exists but its size is | |
| /// less than in_FileOfOriginOffset + in_BinaryBufferLength. | |
| /// | |
| /// @return COI_NOT_INITIALIZED if the environment variable | |
| /// SINK_LD_TRACE_LOADED_OBJECTS is set to a non empty string and there | |
| /// are no errors locating the shared library dependencies. | |
| /// | |
| /// @return COI_PROCESS_DIED if at some point during the loading of the remote | |
| /// process the remote process terminated abnormally. | |
| /// | |
| /// @return COI_VERSION_MISMATCH if the version of Intel(R) Coprocessor | |
| /// Offload Infrastructure (Intel(R) COI) on the host is not | |
| /// compatible with the version on the device. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessCreateFromMemory( | |
| COIENGINE in_Engine, | |
| const char *in_pBinaryName, | |
| const void *in_pBinaryBuffer, | |
| uint64_t in_BinaryBufferLength, | |
| int in_Argc, | |
| const char **in_ppArgv, | |
| uint8_t in_DupEnv, | |
| const char **in_ppAdditionalEnv, | |
| uint8_t in_ProxyActive, | |
| const char *in_Reserved, | |
| uint64_t in_InitialBufferSpace, | |
| const char *in_LibrarySearchPath, | |
| const char *in_FileOfOrigin, | |
| uint64_t in_FileOfOriginOffset, | |
| COIPROCESS *out_pProcess); | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Destroys the indicated process, releasing its resources. Note, this | |
| /// will destroy any outstanding pipelines created in this process as well. | |
| /// | |
| /// @param in_Process | |
| /// [in] Process to destroy. | |
| /// | |
| /// @param in_WaitForMainTimeout | |
| /// [in] The number of milliseconds to wait for the main() function | |
| /// to return in the sink process before timing out. -1 means to wait | |
| /// indefinitely. | |
| /// | |
| /// @param in_ForceDestroy | |
| /// [in] If this flag is set to true, then the sink process will be | |
| /// forcibly terminated after the timeout has been reached. A timeout | |
| /// value of 0 will kill the process immediately, while a timeout of | |
| /// -1 is invalid. If the flag is set to false then a message will | |
| /// be sent to the sink process requesting a clean shutdown. A value | |
| /// of false along with a timeout of 0 does not send a shutdown | |
| /// message, instead simply polls the process to see if it is alive. | |
| /// In most cases this flag should be set to false. If a sink process | |
| /// is not responding then it may be necessary to set this flag to | |
| /// true. | |
| /// | |
| /// @param out_pProcessReturn | |
| /// [out] The value returned from the main() function executing in | |
| /// the sink process. This is an optional parameter. If the caller | |
| /// is not interested in the return value from the remote process | |
| /// they may pass in NULL for this parameter. The output value of | |
| /// this pointer is only meaningful if COI_SUCCESS is returned. | |
| /// | |
| /// @param out_pTerminationCode | |
| /// [out] This parameter specifies the termination code. This will | |
| /// be 0 if the remote process exited cleanly. If the remote process | |
| /// exited abnormally this will contain the termination code given | |
| /// by the operating system of the remote process. This is an optional | |
| /// parameter and the caller may pass in NULL if they are not | |
| /// interested in the termination code. The output value of this | |
| /// pointer is only meaningful if COI_SUCCESS is returned. | |
| /// | |
| /// @return COI_SUCCESS if the process was destroyed. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the process handle passed in was invalid. | |
| /// | |
| /// @return COI_OUT_OF_RANGE for any negative in_WaitForMainTimeout value | |
| /// except -1. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if in_WaitForMainTimeout is -1 and | |
| /// in_ForceDestroy is true. | |
| /// | |
| /// @return COI_TIME_OUT_REACHED if the sink process is still running after | |
| /// waiting in_WaitForMainTimeout milliseconds and in_ForceDestroy | |
| /// is false. This is true even if in_WaitForMainTimeout was 0. | |
| /// In this case, out_pProcessReturn and out_pTerminationCode | |
| /// are undefined. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessDestroy( | |
| COIPROCESS in_Process, | |
| int32_t in_WaitForMainTimeout, | |
| uint8_t in_ForceDestroy, | |
| int8_t *out_pProcessReturn, | |
| uint32_t *out_pTerminationCode); | |
| #define COI_MAX_FUNCTION_NAME_LENGTH 256 | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Given a loaded native process, gets an array of function handles that can | |
| /// be used to schedule run functions on a pipeline associated with that | |
| /// process. See the documentation for COIPipelineRunFunction() for | |
| /// additional information. All functions that are to be retrieved in this | |
| /// fashion must have the define COINATIVEPROCESSEXPORT preceding their type | |
| /// specification. For functions that are written in C++, either the entries | |
| /// in in_pFunctionNameArray in must be pre-mangled, or the functions must be | |
| /// declared as extern "C". It is also necessary to link the binary containing | |
| /// the exported functions with the -rdynamic linker flag. | |
| /// It is possible for this call to successfully find function handles for | |
| /// some of the names passed in but not all of them. If this occurs | |
| /// COI_DOES_NOT_EXIST will return and any handles not found will be returned | |
| /// as NULL. | |
| /// | |
| /// @param in_Process | |
| /// [in] Process handle previously returned via COIProcessCreate(). | |
| /// | |
| /// @param in_NumFunctions | |
| /// [in] Number of function names passed in to the in_pFunctionNames | |
| /// array. | |
| /// | |
| /// @param in_ppFunctionNameArray | |
| /// [in] Pointer to an array of null-terminated strings that match | |
| /// the name of functions present in the code of the binary | |
| /// previously loaded via COIProcessCreate(). Note that if a C++ | |
| /// function is used, then the string passed in must already be | |
| /// properly name-mangled, or extern "C" must be used for where | |
| /// the function is declared. | |
| /// | |
| /// @param out_pFunctionHandleArray | |
| /// [in out] Pointer to a location created by the caller large | |
| /// enough to hold an array of COIFUNCTION sized elements that has | |
| /// in_numFunctions entries in the array. | |
| /// | |
| /// @return COI_SUCCESS if all function names indicated were found. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the in_Process handle passed in was invalid. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if in_NumFunctions is zero. | |
| /// | |
| /// @return COI_INVALID_POINTER if the in_ppFunctionNameArray or | |
| /// out_pFunctionHandleArray pointers was NULL. | |
| /// | |
| /// @return COI_DOES_NOT_EXIST if one or more function names were not | |
| /// found. To determine the function names that were not found, | |
| /// check which elements in the out_pFunctionHandleArray | |
| /// are set to NULL. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if any of the null-terminated strings passed in | |
| /// via in_ppFunctionNameArray were more than | |
| /// COI_MAX_FUNCTION_NAME_LENGTH characters in length including | |
| /// the null. | |
| /// | |
| /// @warning This operation can take several milliseconds so it is recommended | |
| /// that it only be done at load time. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessGetFunctionHandles( | |
| COIPROCESS in_Process, | |
| uint32_t in_NumFunctions, | |
| const char **in_ppFunctionNameArray, | |
| COIFUNCTION *out_pFunctionHandleArray); | |
| #if COI_LIBRARY_VERSION >= 2 | |
| /// @name COIProcessLoadLibrary* flags, named after the corresponding | |
| /// RTLD flags that are passed into dlopen(). | |
| /// Please consult a Linux manual for more information about these flags. | |
| //@{ | |
| #define COI_LOADLIBRARY_LOCAL 0x00000 | |
| #define COI_LOADLIBRARY_GLOBAL 0x00100 | |
| #define COI_LOADLIBRARY_LAZY 0x00001 | |
| #define COI_LOADLIBRARY_NOW 0x00002 | |
| #define COI_LOADLIBRARY_NOLOAD 0x00004 | |
| #define COI_LOADLIBRARY_DEEPBIND 0x00008 | |
| #define COI_LOADLIBRARY_NODELETE 0x01000 | |
| /// Flags to replicate the behaviour of the original version of | |
| /// COIProcessLoadLibrary* APIs. | |
| #define COI_LOADLIBRARY_V1_FLAGS (COI_LOADLIBRARY_GLOBAL|COI_LOADLIBRARY_NOW) | |
| //@} | |
| #endif | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Loads a shared library into the specified remote process, akin to using | |
| /// dlopen() on a local process in Linux or LoadLibrary() in Windows. | |
| /// Dependencies for this library that are not listed with absolute paths | |
| /// are searched for first in current working directory, then in the | |
| /// colon-delimited paths in the environment variable SINK_LD_LIBRARY_PATH, | |
| /// and finally on the sink in the standard search paths as defined by the | |
| /// sink's operating system / dynamic loader. | |
| /// | |
| /// @param in_Process | |
| /// [in] Process to load the library into. | |
| /// | |
| /// @param in_pLibraryBuffer | |
| /// [in] The memory buffer containing the shared library to load. | |
| /// | |
| /// @param in_LibraryBufferLength | |
| /// [in] The number of bytes in the memory buffer in_pLibraryBuffer. | |
| /// | |
| /// @param in_pLibraryName | |
| /// [in] Name for the shared library. This optional parameter can | |
| /// be specified in case the dynamic library doesn't have an | |
| /// SO_NAME field. If specified, it will take precedence over | |
| /// the SO_NAME if it exists. If it is not specified then | |
| /// the library must have a valid SO_NAME field. | |
| /// | |
| ///@param in_LibrarySearchPath | |
| /// [in] A path to locate dynamic libraries dependencies for the | |
| /// library being loaded. If not NULL, this path will override the | |
| /// environment variable SINK_LD_LIBRARY_PATH. If NULL it will use | |
| /// SINK_LD_LIBRARY_PATH to locate dependencies. | |
| /// | |
| ///@param in_LibrarySearchPath | |
| /// [in] A path to locate dynamic libraries dependencies for the sink | |
| /// application. If not NULL, this path will override the environment | |
| /// variable SINK_LD_LIBRARY_PATH. If NULL it will use | |
| /// SINK_LD_LIBRARY_PATH to locate dependencies. | |
| /// | |
| /// @param in_FileOfOrigin | |
| /// [in] If not NULL, this parameter indicates the file from which the | |
| /// in_pBinaryBuffer was obtained. This parameter is optional. | |
| /// | |
| /// @param in_FileOfOriginOffset | |
| /// [in] If in_FileOfOrigin is not NULL, this parameter indicates the | |
| /// offset within that file where in_pBinaryBuffer begins. | |
| /// | |
| #if COI_LIBRARY_VERSION >= 2 | |
| /// @param in_Flags | |
| /// [in] Bitmask of the flags that will be passed in as the dlopen() | |
| /// "flag" parameter on the sink. | |
| /// | |
| #endif | |
| /// | |
| /// @param out_pLibrary | |
| /// [out] If COI_SUCCESS or COI_ALREADY_EXISTS is returned, the handle | |
| /// that uniquely identifies the loaded library. | |
| /// | |
| /// @return COI_SUCCESS if the library was successfully loaded. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the process handle passed in was invalid. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if in_LibraryBufferLength is 0. | |
| /// | |
| /// @return COI_INVALID_FILE if in_pLibraryBuffer does not represent a valid | |
| /// shared library file. | |
| /// | |
| /// @return COI_MISSING_DEPENDENCY if a dependent library is missing from | |
| /// either SINK_LD_LIBRARY_PATH or the in_LibrarySearchPath parameter. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if the shared library is missing an SONAME | |
| /// and in_pLibraryName is NULL. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if in_pLibraryName is the same as that of | |
| /// any of the dependencies (recursive) of the library being loaded. | |
| /// | |
| /// @return COI_ALREADY_EXISTS if there is an existing COILIBRARY handle | |
| /// that identifies this library, and this COILIBRARY hasn't been | |
| /// unloaded yet. | |
| /// | |
| /// @return COI_BINARY_AND_HARDWARE_MISMATCH if the target machine of the | |
| /// binary or any of its recursive dependencies does not match the | |
| /// engine associated with in_Process. | |
| /// | |
| /// @return COI_UNDEFINED_SYMBOL if we are unable to load the library due to | |
| /// an undefined symbol. | |
| /// | |
| /// @return COI_PROCESS_DIED if loading the library on the device caused | |
| /// the remote process to terminate. | |
| /// | |
| /// @return COI_DOES_NOT_EXIST if in_FileOfOrigin is not NULL and does not | |
| /// exist. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if in_FileOfOrigin is NULL and | |
| /// in_FileOfOriginOffset is not 0. | |
| /// | |
| /// @return COI_INVALID_FILE if in_FileOfOrigin is not a "regular file" as | |
| /// determined by stat or if its size is 0. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if in_FileOfOrigin exists but its size is | |
| /// less than in_FileOfOriginOffset + in_BinaryBufferLength. | |
| /// | |
| /// @return COI_INVALID_POINTER if out_pLibrary or in_pLibraryBuffer are NULL. | |
| /// | |
| #if COI_LIBRARY_VERSION >= 2 | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessLoadLibraryFromMemory( | |
| COIPROCESS in_Process, | |
| const void *in_pLibraryBuffer, | |
| uint64_t in_LibraryBufferLength, | |
| const char *in_pLibraryName, | |
| const char *in_LibrarySearchPath, | |
| const char *in_FileOfOrigin, | |
| uint64_t in_FileOfOriginOffset, | |
| uint32_t in_Flags, | |
| COILIBRARY *out_pLibrary); | |
| __asm__(".symver COIProcessLoadLibraryFromMemory," | |
| "COIProcessLoadLibraryFromMemory@COI_2.0"); | |
| #else | |
| COIRESULT | |
| COIProcessLoadLibraryFromMemory( | |
| COIPROCESS in_Process, | |
| const void *in_pLibraryBuffer, | |
| uint64_t in_LibraryBufferLength, | |
| const char *in_pLibraryName, | |
| const char *in_LibrarySearchPath, | |
| const char *in_FileOfOrigin, | |
| uint64_t in_FileOfOriginOffset, | |
| COILIBRARY *out_pLibrary); | |
| __asm__(".symver COIProcessLoadLibraryFromMemory," | |
| "COIProcessLoadLibraryFromMemory@COI_1.0"); | |
| #endif | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Loads a shared library into the specified remote process, akin to using | |
| /// dlopen() on a local process in Linux or LoadLibrary() in Windows. | |
| /// | |
| /// For more details, see COIProcessLoadLibraryFromMemory. | |
| /// | |
| /// @param in_Process | |
| /// [in] Process to load the library into. | |
| /// | |
| /// @param in_pFileName | |
| /// [in] The name of the shared library file on the source's file | |
| /// system that is being loaded. If the file name is not an absolute | |
| /// path, the file is searched for in the same manner as dependencies. | |
| /// | |
| /// @param in_pLibraryName | |
| /// [in] Name for the shared library. This optional parameter can | |
| /// be specified in case the dynamic library doesn't have an | |
| /// SO_NAME field. If specified, it will take precedence over | |
| /// the SO_NAME if it exists. If it is not specified then | |
| /// the library must have a valid SO_NAME field. | |
| /// | |
| ///@param in_LibrarySearchPath | |
| /// [in] a path to locate dynamic libraries dependencies for the | |
| /// library being loaded. If not NULL, this path will override the | |
| /// environment variable SINK_LD_LIBRARY_PATH. If NULL it will use | |
| /// SINK_LD_LIBRARY_PATH to locate dependencies. | |
| /// | |
| #if COI_LIBRARY_VERSION >= 2 | |
| /// @param in_Flags | |
| /// [in] Bitmask of the flags that will be passed in as the dlopen() | |
| /// "flag" parameter on the sink. | |
| /// | |
| #endif | |
| /// | |
| /// @param out_pLibrary | |
| /// [out] If COI_SUCCESS or COI_ALREADY_EXISTS is returned, the handle | |
| /// that uniquely identifies the loaded library. | |
| /// | |
| /// @return COI_SUCCESS if the library was successfully loaded. | |
| /// | |
| /// @return COI_INVALID_POINTER if in_pFileName is NULL. | |
| /// | |
| /// @return COI_DOES_NOT_EXIST if in_pFileName cannot be found. | |
| /// | |
| /// @return COI_INVALID_FILE if the file is not a valid shared library. | |
| /// | |
| /// @return See COIProcessLoadLibraryFromMemory for additional errors. | |
| /// | |
| #if COI_LIBRARY_VERSION >= 2 | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessLoadLibraryFromFile( | |
| COIPROCESS in_Process, | |
| const char *in_pFileName, | |
| const char *in_pLibraryName, | |
| const char *in_LibrarySearchPath, | |
| uint32_t in_Flags, | |
| COILIBRARY *out_pLibrary); | |
| __asm__(".symver COIProcessLoadLibraryFromFile," | |
| "COIProcessLoadLibraryFromFile@COI_2.0"); | |
| #else | |
| COIRESULT | |
| COIProcessLoadLibraryFromFile( | |
| COIPROCESS in_Process, | |
| const char *in_pFileName, | |
| const char *in_pLibraryName, | |
| const char *in_LibrarySearchPath, | |
| COILIBRARY *out_pLibrary); | |
| __asm__(".symver COIProcessLoadLibraryFromFile," | |
| "COIProcessLoadLibraryFromFile@COI_1.0"); | |
| #endif | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Unloads a a previously loaded shared library from the specified | |
| /// remote process. | |
| /// | |
| /// @param in_Process | |
| /// [in] Process that we are unloading a library from. | |
| /// | |
| /// @param in_Library | |
| /// [in] Library that we want to unload. | |
| /// | |
| /// @return COI_SUCCESS if the library was successfully loaded. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the process or library handle were invalid. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessUnloadLibrary( | |
| COIPROCESS in_Process, | |
| COILIBRARY in_Library); | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Registers shared libraries that are already in the host process's memory | |
| /// to be used during the shared library dependency resolution steps that take | |
| /// place during subsequent calls to COIProcessCreate* and | |
| /// COIProcessLoadLibrary*. If listed as a dependency, the registered library | |
| /// will be used to satisfy the dependency, even if there is another library | |
| /// on disk that also satisfies that dependency. | |
| /// | |
| /// Addresses registered must remain valid during subsequent calls to | |
| /// COIProcessCreate* and COIProcessLoadLibrary*. | |
| /// | |
| /// If the Sink is Linux, the shared libraries must have a library name | |
| /// (DT_SONAME field). On most compilers this means built with -soname. | |
| /// | |
| /// If successful, this API registers all the libraries. Otherwise none | |
| /// are registered. | |
| /// | |
| /// @param in_NumLibraries | |
| /// [in] The number of libraries that are being registered. | |
| /// | |
| /// @param in_ppLibraryArray | |
| /// [in] An array of pointers that point to the starting addresses | |
| /// of the libraries. | |
| /// | |
| /// @param in_pLibrarySizeArray | |
| /// [in] An array of pointers that point to the number of bytes in | |
| /// each of the libraries. | |
| /// | |
| /// @param in_ppFileOfOriginArray | |
| /// [in] An array of strings indicating the file from which the | |
| /// library was obtained. This parameter is optional. Elements | |
| /// in the array may be set to NULL. | |
| /// | |
| /// @param in_pFileOfOriginOffSetArray | |
| /// [in] If the corresponding entry in in_ppFileOfOriginArray is not | |
| /// NULL, this parameter indicates the offsets within those files | |
| /// where the corresponding libraries begin. | |
| /// | |
| /// @return COI_SUCCESS if the libraries were registered successfully. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if in_NumLibraries is 0. | |
| /// | |
| /// @return COI_INVALID_POINTER if in_ppLibraryArray or in_pLibrarySizeArray | |
| /// are NULL. | |
| /// | |
| /// @return COI_INVALID_POINTER if any of the pointers in in_ppLibraryArray | |
| /// are NULL. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if any of the values in in_pLibrarySizeArray is 0. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if either one of in_ppFileOfOriginArray | |
| /// and in_pFileOfOriginOffSetArray is NULL and the other is not. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if one of the addresses being registered does not | |
| /// represent a valid library. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT | |
| COIProcessRegisterLibraries( | |
| uint32_t in_NumLibraries, | |
| const void **in_ppLibraryArray, | |
| const uint64_t *in_pLibrarySizeArray, | |
| const char **in_ppFileOfOriginArray, | |
| const uint64_t *in_pFileOfOriginOffSetArray); | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// The user can choose to have notifications for these internal events | |
| /// so that they can build their own profiling and performance layer on | |
| /// top of Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI). | |
| /// | |
| typedef enum COI_NOTIFICATIONS | |
| { | |
| /// This event occurs when all explicit and implicit dependencies are | |
| /// satisfied and Intel(R) Coprocessor Offload Infrastructure | |
| /// (Intel(R) COI) schedules the run function to begin execution. | |
| RUN_FUNCTION_READY = 0, | |
| /// This event occurs just before the run function actually starts | |
| /// executing. There may be some latency between the ready and start | |
| /// events if other run functions are already queued and ready to run. | |
| RUN_FUNCTION_START, | |
| /// This event occurs when the run function finishes. This is when the | |
| /// completion event for that run function would be signaled. | |
| RUN_FUNCTION_COMPLETE, | |
| /// This event occurs when all explicit and implicit dependencies are | |
| /// met for the pending buffer operation. Assuming buffer needs to be | |
| /// moved, copied, read, etc... Will not be invoked if no actual memory | |
| /// is moved, copied, read, etc. This means that COIBufferUnmap will | |
| /// never result in a callback as it simply updates the status of the | |
| /// buffer but doesn't initiate any data movement. COIBufferMap, | |
| /// COIBufferSetState, COIBufferWrite, COIBufferRead and COIBufferCopy | |
| /// do initiate data movement and therefore will invoke the callback. | |
| BUFFER_OPERATION_READY, | |
| /// This event occurs when the buffer operation is completed. | |
| BUFFER_OPERATION_COMPLETE, | |
| /// This event occurs when a user event is signaled from the remotely | |
| /// a sink process. Local (source triggered) events do not trigger this. | |
| USER_EVENT_SIGNALED | |
| } COI_NOTIFICATIONS; | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// A callback that will be invoked to notify the user of an internal | |
| /// Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI) | |
| /// event. Note that the callback is registered per process so any of the | |
| /// above notifications that happen on the registered process will receive | |
| /// the callback. | |
| /// As with any callback mechanism it is up to the user to make sure that | |
| /// there are no possible deadlocks due to reentrancy (i.e. the callback being | |
| /// invoked in the same context that triggered the notification) and also | |
| /// that the callback does not slow down overall processing. If the user | |
| /// performs too much work within the callback it could delay further | |
| /// processing. The callback will be invoked prior to the signaling of | |
| /// the corresponding COIEvent. For example, if a user is waiting | |
| /// for a COIEvent associated with a run function completing they will | |
| /// receive the callback before the COIEvent is marked as signaled. | |
| /// | |
| /// | |
| /// @param in_Type | |
| /// [in] The type of internal event that has occurred. | |
| /// | |
| /// @param in_Process | |
| /// [in] The process associated with the operation. | |
| /// | |
| /// @param in_Event | |
| /// [in] The completion event that is associated with the | |
| /// operation that is being notified. | |
| /// | |
| /// @param in_UserData | |
| /// [in] Opaque data that was provided when the callback was | |
| /// registered. Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI) | |
| /// simply passes this back to the user so that | |
| /// they can interpret it as they choose. | |
| /// | |
| typedef void (*COI_NOTIFICATION_CALLBACK)( | |
| COI_NOTIFICATIONS in_Type, | |
| COIPROCESS in_Process, | |
| COIEVENT in_Event, | |
| const void *in_UserData); | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Register a callback to be invoked to notify that an internal | |
| /// Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI) event | |
| /// has occured on the process that is associated with the callback. | |
| /// Note that it is legal to have more than one callback registered with | |
| /// a given process but those must all be unique callback pointers. | |
| /// Note that setting a UserData value with COINotificationCallbackSetContext | |
| /// will override a value set when registering the callback. | |
| /// | |
| /// @param in_Process | |
| /// [in] Process that the callback is associated with. The callback | |
| /// will only be invoked to notify an event for this specific process. | |
| /// | |
| /// @param in_Callback | |
| /// [in] Pointer to a user function used to signal a notification. | |
| /// | |
| /// @param in_UserData | |
| /// [in] Opaque data to pass to the callback when it is invoked. | |
| /// | |
| /// @return COI_SUCCESS if the callback was registered successfully. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the in_Process parameter does not identify | |
| /// a valid process. | |
| /// | |
| /// @return COI_INVALID_POINTER if the in_Callback parameter is NULL. | |
| /// | |
| /// @return COI_ALREADY_EXISTS if the user attempts to reregister the same | |
| /// callback for a process. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT COIRegisterNotificationCallback( | |
| COIPROCESS in_Process, | |
| COI_NOTIFICATION_CALLBACK in_Callback, | |
| const void *in_UserData); | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Unregisters a callback, notifications will no longer be signaled. | |
| /// | |
| /// @param in_Process | |
| /// [in] Process that we are unregistering. | |
| /// | |
| /// @param in_Callback | |
| /// [in] The specific callback to unregister. | |
| /// | |
| /// @return COI_SUCCESS if the callback was unregistered. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the in_Process parameter does not identify | |
| /// a valid process. | |
| /// | |
| /// @return COI_INVALID_POINTER if the in_Callback parameter is NULL. | |
| /// | |
| /// @return COI_DOES_NOT_EXIST if in_Callback was not previously registered | |
| /// for in_Process. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT COIUnregisterNotificationCallback( | |
| COIPROCESS in_Process, | |
| COI_NOTIFICATION_CALLBACK in_Callback); | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Set the user data that will be returned in the notification callback. | |
| /// This data is sticky and per thread so must be set prior to the | |
| /// Intel(R) Coprocessor Offload Infrastructure (Intel(R) COI) | |
| /// operation being invoked. If you wish to set the context to be returned | |
| /// for a specific instance of a user event notification then the context | |
| /// must be set using this API prior to registering that user event with | |
| /// COIEventRegisterUserEvent. | |
| /// The value may be set prior to each Intel(R) Coprocessor Offload | |
| /// Infrastructure (Intel(R) COI) operation being called to | |
| /// effectively have a unique UserData per callback. | |
| /// Setting this value overrides any value that was set when the | |
| /// callback was registered and will also override any future registrations | |
| /// that occur. | |
| /// | |
| /// @param in_UserData | |
| /// [in] Opaque data to pass to the callback when it is invoked. | |
| /// Note that this data is set per thread. | |
| /// | |
| COIACCESSAPI | |
| void COINotificationCallbackSetContext( | |
| const void *in_UserData); | |
| /// @name COIProcessSetCacheSize flags. | |
| /// Flags are divided into two categories: _MODE_ and _ACTION_ | |
| /// only one of each is valid with each call. | |
| /// _ACTIONS_ and _MODES_ should be bitwised OR'ed together, i.e. | | |
| //@{ | |
| /// Current set of DEFINED bits for _MODE_, can be used | |
| /// to clear or check fields, not useful to pass into APIs. Used internally. | |
| #define COI_CACHE_MODE_MASK 0x00000007 | |
| /// Flag to indicate to keep the previous mode of operation. By default | |
| /// this would be COI_CACHE_MODE_ONDEMAND_SYNC. As of this release | |
| /// This is the only mode available. This mode is valid with _ACTION_ | |
| /// flags. | |
| #define COI_CACHE_MODE_NOCHANGE 0x00000001 | |
| /// Mode of operation that indicates that COI will allocate physical | |
| /// cache memory exactly when it is is needed. COIPipeline execution in | |
| /// the given process will momentarily block until the allocation request | |
| /// is completed. This is and has been the default mode. | |
| #define COI_CACHE_MODE_ONDEMAND_SYNC 0x00000002 | |
| /// Not yet implemented. Future mode that will not stall a COIPipeline | |
| /// but prefer eviction/paging if possible as to immediately execute pipeline. | |
| /// At the same time, enqueue background requests to allocate extra cache | |
| /// so as to provide optimze behavior on subsequent runs. | |
| #define COI_CACHE_MODE_ONDEMAND_ASYNC 0x00000004 | |
| /// Current set of DEFINED bits for _ACTION_ can be used | |
| /// to clear fields, but not useful to pass into API's. Used internally. | |
| #define COI_CACHE_ACTION_MASK 0x00070000 | |
| /// No action requested. With this flag specified | |
| /// it is recommended to NOT provide a out_pCompletion event, | |
| /// as with this flag, modes and values are immediately set. | |
| /// This is valid with _MODE_ flags. | |
| #define COI_CACHE_ACTION_NONE 0x00010000 | |
| /// This _ACTION_ flag will immediately attempt to increase the cache | |
| /// physical memory size to the current set pool size(s). Used to | |
| /// pre-allocate memory on remote processes, so that runfunction will | |
| /// enqueue faster. Also may prevent unused buffer eviction from process | |
| /// reducing overhead in trade for memory allocation cost. | |
| #define COI_CACHE_ACTION_GROW_NOW 0x00020000 | |
| /// Not yet implemented. Future _ACTION_ that will attempt to find unused | |
| /// allocated cache and free it, with the express goal of reducing the | |
| /// footprint on the remote process down to the value of the currently set | |
| /// pool size(s). | |
| #define COI_CACHE_ACTION_FREE_UNUSED 0x00040000 | |
| //@} | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Set the minimum preferred COIProcess cache size. By default these values | |
| /// are set to 1GB. With the default size of 1GB, Intel(R) COI will only | |
| /// grow the cache with each new buffer up until the set limit is consumed, | |
| /// after which, only required to accommodate additional buffers. | |
| /// This means that after the cache preference is met, a process will act | |
| /// as conservative as possible for memory consumption. | |
| /// This API will allow users to adjust memory consumption aggressiveness. | |
| /// | |
| /// Additional performance may be gained if the user sets a value higher than | |
| /// default. With high memory consumption user can choose to trade performance | |
| /// between memory allocation cost and transfer speeds to and from the | |
| /// remote process. A last consideration is that if buffers are used only | |
| /// once, it may be best to keep a small cache size, or ensure buffers are | |
| /// fully destroyed after their use. | |
| /// | |
| /// Adjusting this value to high may result in out of resource conditions. | |
| /// | |
| /// @param in_pProcess | |
| /// [in] Handle to uniquely identify the process for which the cache | |
| /// is to be adjusted. | |
| /// | |
| /// @param in_HugePagePoolSize | |
| /// [in] The suggested size of the remote huge page cache in bytes. | |
| /// This value defaults to 1GB. A process will only allocate cache | |
| /// memory if the current cache is smaller than this limit, or it is | |
| /// absolutely necessary to fulfill a request, but preferring to | |
| /// re-use existing memory and paging unused buffers back to the host | |
| /// Increasing this value will cause a process to | |
| /// aggressively allocate memory on demand up to this value, before | |
| /// evicting/paging memory from the remote process back to the host | |
| /// process. | |
| /// | |
| /// The net result is that memory consumption is increased, but the | |
| /// user can 'cache' more buffers on the remote process. More time | |
| /// may be spent during first use of run functions as more memory | |
| /// may be allocated, but subsequent run functions will likely | |
| /// see an increase in queueing performance as the data is already | |
| /// valid in the remote process. | |
| /// | |
| /// Users should tune this value for optimum performance balanced | |
| /// against memory consumption. This value does not affect 4K page | |
| /// cache. Please use in_SmallPagePoolSize for 4K pages. | |
| /// | |
| /// @param in_HugeFlags | |
| /// [in] Flags to select mode or action for huge page cache. One _MODE_ | |
| /// and one _ACTION_ flag are specified together. Default _MODE_ is | |
| /// COI_CACHE_MODE_ONDEMAND_SYNC. See all COI_CACHE_MODE_* and | |
| /// COI_CACHE_ACTION_* for other modes and actions. Default _ACTION_ | |
| /// is COI_CACHE_ACTION_NONE. | |
| /// | |
| /// @param in_SmallPagePoolSize | |
| /// [in] The suggested size of the remote 4K cache in bytes. Same | |
| /// function as in_HugePagePoolSize but affecting only 4K page cache. | |
| /// Defaults to 1GB. | |
| /// | |
| /// @param in_SmallFlags | |
| /// [in] Flags to select mode or action for 4K page cache. One _MODE_ | |
| /// and one _ACTION_ flag are be specified together. Default _MODE_ is | |
| /// COI_CACHE_MODE_ONDEMAND_SYNC. See all COI_CACHE_MODE_* and | |
| /// COI_CACHE_ACTION_* for other modes and actions. | |
| /// | |
| /// @param in_NumDependencies | |
| /// [in] The number of dependencies specified in the in_pDependencies | |
| /// array. This may be 0 if the caller does not want the call to | |
| /// wait for any events to be signaled. | |
| /// | |
| /// @param in_pDependencies | |
| /// [in] An optional array of handles to previously created COIEVENT | |
| /// objects that this operation will wait for before starting. | |
| /// This allows the user to create dependencies between asynchronous | |
| /// calls and other operations such as run functions. The user may | |
| /// pass in NULL if they do not wish to wait for any dependencies. | |
| /// Only useful with _ACTION_ flags, otherwise there is no action | |
| /// to wait on. All _MODE_ changes happen immediately. | |
| /// | |
| /// @param out_pCompletion | |
| /// [out] An optional pointer to a COIEVENT object that will be | |
| /// signaled when the operation is complete. The user may pass in | |
| /// NULL if the user wants the operation to block until completed. | |
| /// Note: This flag is not useful unless paired with a | |
| /// valid _ACTION_ flag. | |
| /// | |
| /// @return COI_SUCCESS if the cache was successfully adjusted. In case of | |
| /// valid flags including _ACTION_, if out_pCompletion was specified, | |
| /// this does not indicate the operation succeeded, but rather only | |
| /// it was successfully queued. For further information see | |
| /// that COIEventWait() for getting return values. | |
| /// | |
| /// @return COI_INVALID_HANDLE if the in_Process handle passed in was invalid. | |
| /// | |
| /// @return COI_RESOURCE_EXHAUSTED if no more cache can be created, | |
| /// possibly, but not necessarily because a pool size was set to large | |
| /// and COI_CACHE_ACTION_GROW_NOW was specified. | |
| /// | |
| /// @return COI_NOT_SUPPORTED if more than one _MODE_ or _ACTION_ was | |
| /// specified. | |
| /// | |
| /// @return COI_NOT_SUPPORTED if an invalid _MODE_ or _ACTION_ was | |
| /// specified. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if in_NumDependencies is non-zero while | |
| /// in_pDependencies was passed in as NULL. | |
| /// | |
| /// @return COI_OUT_OF_RANGE if one of the pool sizes was invalid. | |
| /// | |
| /// @return COI_PROCESS_DIED if at some point during the mode or action the | |
| /// remote process terminated abnormally. Possible due to an out of | |
| /// memory condition. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT COIProcessSetCacheSize( | |
| const COIPROCESS in_Process, | |
| const uint64_t in_HugePagePoolSize, | |
| const uint32_t in_HugeFlags, | |
| const uint64_t in_SmallPagePoolSize, | |
| const uint32_t in_SmallFlags, | |
| uint32_t in_NumDependencies, | |
| const COIEVENT *in_pDependencies, | |
| COIEVENT *out_pCompletion); | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// These are the different modes of operation that can be selected for | |
| /// the COI_DMA_MODE by the API COIProcessConfigureDMA. They allow the user | |
| /// to customize the DMA layer behaviour. | |
| /// | |
| typedef enum COI_DMA_MODE | |
| { | |
| /// This mode will use one common logical channel for all DMA operations. | |
| /// Using this mode requires a channel count of one. | |
| COI_DMA_MODE_SINGLE = 0, | |
| /// This mode will dedicate on logical channel for write operations | |
| /// and one logical channel for read operations. Requires a minimum of | |
| /// two logical channels, if more than two are used they are ignored | |
| /// in the current implementation. | |
| COI_DMA_MODE_READ_WRITE, | |
| /// This mode is not yet implemented and is a placeholder for future | |
| /// releases. Check here for updates when it is implemented. | |
| /// Will require a minimum of two logical channels and a maximum | |
| /// of four channels. | |
| COI_DMA_MODE_ROUND_ROBIN, | |
| /// Reserved for internal use. | |
| COI_DMA_RESERVED | |
| } COI_DMA_MODE; | |
| ////////////////////////////////////////////////////////////////////////////// | |
| /// | |
| /// Set the number and mode of the physical DMA channels that each COIProcess | |
| /// will establish during COIProcess creation. | |
| /// | |
| /// By default the runtime will operate in COI_DMA_MODE_SINGLE mode. | |
| /// This API is intended to be called before COIProcessCreateFromFile() or | |
| /// COIProcessCreateFromMemory(). The values are stored globally and will | |
| /// be used by the creation API's. It is possible to call this API once | |
| /// before each new COIPROCESS is created and thus have each COIPROCESS | |
| /// run in different modes. It is not possible to change the mode on an | |
| /// existing COIPROCESS. | |
| /// | |
| /// The larger number of logical connections requested will impose a | |
| /// performance penalty on the COIBUFFER creation API's, but unlock better | |
| /// parallelism for DMA transfers during runtime. | |
| /// | |
| /// A maximum value of four (4) channels is available today, but current | |
| /// implementation will only take advantage of two DMA channels. The option | |
| /// is left available for programmers to use in case future implementations | |
| /// provide performance advantages. | |
| /// | |
| /// It is important to note that for some operations that enabling this | |
| /// options may increase parallelism and require the user to enforce | |
| /// explicit dependencies for operations on the same buffers. See documentation | |
| /// for COIBufferRead/Write/Copy operations for more details. | |
| /// | |
| /// @param in_Channels | |
| /// [in] Number of logical connections to the remote COIProcess that | |
| /// the runtime will establish and use for DMA transfer requests. | |
| /// Will be ignored if in_Mode is set to COI_DMA_MODE_SINGLE. | |
| /// | |
| /// @param in_Mode | |
| /// [in] The mode of operation in which the runtime will use the | |
| /// logical connections to the remote COIProcess. | |
| /// | |
| /// @return COI_SUCCESS if the mode and number of DMA channels requested | |
| /// is valid. The actual create creation of channels and modes is | |
| /// done during COIProcessCreateFromFile() and | |
| /// COIProcessCreateFromMemory(). | |
| /// | |
| /// @return COI_NOT_SUPPORTED if an invalid value for in_Channels or | |
| /// in_Mode was requested. | |
| /// | |
| /// @return COI_ARGUMENT_MISMATCH if an invalid combination of in_Channels and | |
| /// in_Mode was requested. Example could be 2 channels with | |
| /// COI_DMA_MODE_SINGLE, or 1 channel with COI_DMA_MODE_READ_WRITE. | |
| /// | |
| COIACCESSAPI | |
| COIRESULT COIProcessConfigureDMA( | |
| const uint64_t in_Channels, | |
| const COI_DMA_MODE in_Mode); | |
| #ifdef __cplusplus | |
| } /* extern "C" */ | |
| #endif | |
| #endif /* _COIPROCESS_SOURCE_H */ | |
| /*! @} */ |