#include "holder.h"
#include "SpinLock.h"
+#ifndef DIRECTORY_SEPARATOR_CHAR
+#ifdef TARGET_UNIX
+#define DIRECTORY_SEPARATOR_CHAR '/'
+#else // TARGET_UNIX
+#define DIRECTORY_SEPARATOR_CHAR '\\'
+#endif // TARGET_UNIX
+#endif
+
#ifdef TARGET_UNIX
// Per module (1 for NativeAOT), key that will be used to implement TLS in Unix
pthread_key_t eventpipe_tls_key;
ep_rt_lock_handle_t _ep_rt_aot_config_lock_handle;
CrstStatic _ep_rt_aot_config_lock;
-ep_char8_t *volatile _ep_rt_aot_diagnostics_cmd_line;
#ifndef TARGET_UNIX
uint32_t *_ep_rt_aot_proc_group_offsets;
const ep_char8_t *
ep_rt_aot_entrypoint_assembly_name_get_utf8 (void)
{
- // shipping criteria: no EVENTPIPE-NATIVEAOT-TODO left in the codebase
- // TODO: Implement EventPipe assembly name - return filename in nativeaot?
- return reinterpret_cast<const ep_char8_t*>("");
+ // We are (intentionally for now) using the module name rather than entry assembly
+ // Cannot use __cpp_threadsafe_static_init feature since it will bring in the C++ runtime and need to use threadsafe way to initialize entrypoint_assembly_name
+ static const ep_char8_t * entrypoint_assembly_name = nullptr;
+ if (entrypoint_assembly_name == nullptr) {
+ ep_char8_t * entrypoint_assembly_name_local;
+ const TCHAR * wszModuleFileName = NULL;
+ HANDLE moduleHandle = PalGetModuleHandleFromPointer((void*)&ep_rt_aot_entrypoint_assembly_name_get_utf8);
+ if(PalGetModuleFileName(&wszModuleFileName, moduleHandle) == 0) {
+ entrypoint_assembly_name_local = reinterpret_cast<ep_char8_t *>(malloc(1));
+ if(entrypoint_assembly_name_local==NULL) {
+ return NULL;
+ }
+ *entrypoint_assembly_name_local = '\0';
+ }
+ else {
+#ifdef HOST_WINDOWS
+ const wchar_t* process_name_const = wcsrchr(wszModuleFileName, DIRECTORY_SEPARATOR_CHAR);
+ if (process_name_const != NULL) {
+ process_name_const++;
+ }
+ else {
+ process_name_const = reinterpret_cast<const wchar_t *>(wszModuleFileName);
+ }
+ size_t len = -1;
+ const wchar_t* extension = wcsrchr(process_name_const, '.');
+ if (extension != NULL) {
+ len = extension - process_name_const;
+ }
+ entrypoint_assembly_name_local = ep_rt_utf16_to_utf8_string(reinterpret_cast<const ep_char16_t *>(process_name_const), len);
+#else
+ const ep_char8_t* process_name_const = strrchr(wszModuleFileName, DIRECTORY_SEPARATOR_CHAR);
+ if (process_name_const != NULL) {
+ process_name_const++;
+ }
+ else {
+ process_name_const = reinterpret_cast<const ep_char8_t *>(wszModuleFileName);
+ }
+ size_t len = strlen(process_name_const);
+ const ep_char8_t *extension = strrchr(process_name_const, '.');
+ if (extension != NULL) {
+ len = extension - process_name_const;
+ }
+ ep_char8_t* process_name = reinterpret_cast<ep_char8_t *>(malloc(len + 1));
+ if (process_name == NULL) {
+ return NULL;
+ }
+ memcpy(process_name, process_name_const, len);
+ process_name[len] = '\0';
+ entrypoint_assembly_name_local = reinterpret_cast<ep_char8_t*>(process_name);
+#endif // HOST_WINDOWS
+ }
+
+ if (PalInterlockedCompareExchangePointer((void**)(&entrypoint_assembly_name), (void*)(entrypoint_assembly_name_local), nullptr) != nullptr)
+ free(entrypoint_assembly_name_local);
+ }
+
+ return entrypoint_assembly_name;
}
const ep_char8_t *
#ifdef TARGET_WINDOWS
const ep_char16_t* command_line = reinterpret_cast<const ep_char16_t *>(::GetCommandLineW());
return ep_rt_utf16_to_utf8_string(command_line, -1);
+#elif TARGET_LINUX
+ FILE *cmdline_file = ::fopen("/proc/self/cmdline", "r");
+ if (cmdline_file == nullptr)
+ return "";
+
+ char *line = NULL;
+ size_t line_len = 0;
+ if (::getline (&line, &line_len, cmdline_file) == -1) {
+ ::fclose (cmdline_file);
+ return "";
+ }
+
+ ::fclose (cmdline_file);
+ return reinterpret_cast<const ep_char8_t*>(line);
#else
return "";
#endif
bool
ep_rt_aot_file_write (
- ep_rt_file_handle_t file_handle,
- const uint8_t *buffer,
- uint32_t bytes_to_write,
- uint32_t *bytes_written)
+ ep_rt_file_handle_t file_handle,
+ const uint8_t *buffer,
+ uint32_t bytes_to_write,
+ uint32_t *bytes_written)
{
#ifdef TARGET_WINDOWS
return ::WriteFile (file_handle, buffer, bytes_to_write, reinterpret_cast<LPDWORD>(bytes_written), NULL) != FALSE;
void ep_rt_aot_spin_lock_requires_lock_held (const ep_rt_spin_lock_handle_t *spin_lock)
{
EP_ASSERT (ep_rt_spin_lock_is_valid (spin_lock));
- EP_ASSERT (spin_lock->lock->OwnedByCurrentThread ());
+ EP_ASSERT (spin_lock->lock->OwnedByCurrentThread ());
}
void ep_rt_aot_spin_lock_requires_lock_not_held (const ep_rt_spin_lock_handle_t *spin_lock)
{
- EP_ASSERT (spin_lock->lock == NULL || !spin_lock->lock->OwnedByCurrentThread ());
+ EP_ASSERT (spin_lock->lock == NULL || !spin_lock->lock->OwnedByCurrentThread ());
}
#endif /* EP_CHECKED_BUILD */