unsigned long logThreadPid(void) { #ifdef WIN32 return (unsigned long)GetCurrentProcessId(); #elif defined(N_PLAT_NLM) return (unsigned long)GetNLMID(); #else return (unsigned long)getpid(); #endif }
static char * progname(void) { #if TARGET == TARGET_UNIX #if SYSTEM == SYSTEM_AIX extern char **p_xargv; #elif SYSTEM == SYSTEM_HPUX extern char **__argv_value; #elif SYSTEM == SYSTEM_IRIX || SYSTEM == SYSTEM_SINIX || SYSTEM == SYSTEM_TRU64 extern char **__Argv; #elif SYSTEM == SYSTEM_UNIXWARE extern char **___Argv; #elif SYSTEM == SYSTEM_FREEBSD || SYSTEM == SYSTEM_INTERIX || \ SYSTEM == SYSTEM_LINUX || SYSTEM == SYSTEM_NETBSD || \ SYSTEM == SYSTEM_OPENBSD static char a[256], c[256]; ssize_t l; int f; #elif SYSTEM == SYSTEM_DGUX || SYSTEM == SYSTEM_DRSNX || \ SYSTEM == SYSTEM_DYNIX || SYSTEM == SYSTEM_LYNXOS || \ SYSTEM == SYSTEM_SOLARIS || SYSTEM == SYSTEM_SUNOS extern char **environ; char **e; char *t; #endif /* SYSTEM */ #if !MP_BUILTINSTACK_SUPPORT && !MP_GLIBCBACKTRACE_SUPPORT && \ !MP_LIBUNWIND_SUPPORT && !MP_LIBRARYSTACK_SUPPORT && \ (ARCH == ARCH_IX86 || ARCH == ARCH_M68K || ARCH == ARCH_MIPS || \ ARCH == ARCH_POWER || ARCH == ARCH_POWERPC || ARCH == ARCH_SPARC) unsigned long *p; stackinfo s; #endif /* MP_BUILTINSTACK_SUPPORT && MP_GLIBCBACKTRACE_SUPPORT && ... */ #ifdef MP_PROCFS_EXENAME static char b[64]; #endif /* MP_PROCFS_EXENAME */ #elif TARGET == TARGET_AMIGA || TARGET == TARGET_WINDOWS static char p[256]; #elif TARGET == TARGET_NETWARE char *p, *t; #endif /* TARGET */ #if TARGET == TARGET_UNIX /* AIX, HP/UX, Interix, IRIX, SINIX, Tru64 and UnixWare have global * variables containing argc and argv which we can use to determine the * filename that the program was invoked with. */ #if SYSTEM == SYSTEM_AIX if (p_xargv[0] != NULL) return p_xargv[0]; #elif SYSTEM == SYSTEM_HPUX if (__argv_value[0] != NULL) return __argv_value[0]; #elif SYSTEM == SYSTEM_IRIX || SYSTEM == SYSTEM_SINIX || SYSTEM == SYSTEM_TRU64 if (__Argv[0] != NULL) return __Argv[0]; #elif SYSTEM == SYSTEM_UNIXWARE if (___Argv[0] != NULL) return ___Argv[0]; #elif SYSTEM == SYSTEM_FREEBSD || SYSTEM == SYSTEM_INTERIX || \ SYSTEM == SYSTEM_LINUX || SYSTEM == SYSTEM_NETBSD || \ SYSTEM == SYSTEM_OPENBSD /* The BSD variants, Interix and Linux have a file in the /proc filesystem * which contains the argument vector that a process was invoked with. */ l = 0; sprintf(a, MP_PROCFS_CMDNAME, __mp_processid()); if ((f = open(a, O_RDONLY)) != -1) { if ((l = read(f, c, sizeof(c) - 1)) == -1) l = 0; close(f); } if (l > 0) { c[l] = '\0'; return c; } #elif SYSTEM == SYSTEM_DGUX || SYSTEM == SYSTEM_DRSNX || \ SYSTEM == SYSTEM_DYNIX || SYSTEM == SYSTEM_LYNXOS || \ SYSTEM == SYSTEM_SOLARIS || SYSTEM == SYSTEM_SUNOS /* We can access the argument vector from the pointer to the environment * array on all other UNIX systems. On DG/UX Intel, DRS/NX, DYNIX/ptx, * Solaris and SunOS we stop scanning backwards along the array when we * reach argc. On DG/UX M88K and LynxOS we stop scanning forwards along * the array when we reach a NULL pointer. The contents of the argument * vector then follow. */ #if (SYSTEM == SYSTEM_DGUX && ARCH == ARCH_M88K) || SYSTEM == SYSTEM_LYNXOS for (e = environ; *e != NULL; e++); t = (char *) (e + 1); #else /* SYSTEM && ARCH */ for (t = NULL, e = environ - 2; *e > (char *) _POSIX_ARG_MAX; t = *e--); #endif /* SYSTEM && ARCH */ if (t != NULL) return t; #endif /* SYSTEM */ #if !MP_BUILTINSTACK_SUPPORT && !MP_GLIBCBACKTRACE_SUPPORT && \ !MP_LIBUNWIND_SUPPORT && !MP_LIBRARYSTACK_SUPPORT && \ (ARCH == ARCH_IX86 || ARCH == ARCH_M68K || ARCH == ARCH_MIPS || \ ARCH == ARCH_POWER || ARCH == ARCH_POWERPC || ARCH == ARCH_SPARC) /* Because there is no function to return the executable filename * of a process on UNIX, we need to cheat and rely on the ABI by walking * up the process stack till we reach the startup code and then find * argv[0]. This is very OS-specific and is not my first choice for * doing this, but unfortunately it seemed to be the only way. */ __mp_newframe(&s, NULL); for (p = NULL; __mp_getframe(&s); p = (unsigned long *) s.frame); if (p != NULL) { #if ARCH == ARCH_IX86 #if SYSTEM == SYSTEM_FREEBSD || SYSTEM == SYSTEM_LINUX || \ SYSTEM == SYSTEM_NETBSD || SYSTEM == SYSTEM_OPENBSD if ((p = (unsigned long *) p[4])) return (char *) *p; #elif SYSTEM == SYSTEM_INTERIX if ((p = (unsigned long *) p[-6])) return (char *) (p + 1); #elif SYSTEM == SYSTEM_LYNXOS if ((p = (unsigned long *) p[3])) return (char *) *p; #else /* SYSTEM */ if ((p = (unsigned long *) p[3])) return (char *) p; #endif /* SYSTEM */ #elif ARCH == ARCH_M68K if ((p = (unsigned long *) p[3])) return (char *) *p; #elif ARCH == ARCH_MIPS if ((p = (unsigned long *) p[7])) return (char *) p; #elif ARCH == ARCH_POWER || ARCH == ARCH_POWERPC #if SYSTEM == SYSTEM_AIX if ((p = (unsigned long *) p[7])) return (char *) p; #else /* SYSTEM */ if ((p = (unsigned long *) p[23])) return (char *) *p; #endif /* SYSTEM */ #elif ARCH == ARCH_SPARC #if ENVIRON == ENVIRON_64 if (p = (unsigned long *) *(((unsigned long *) (*p + 0x7FF)) + 1)) #else /* ENVIRON */ if (p = (unsigned long *) *(((unsigned long *) *p) + 1)) #endif /* ENVIRON */ return (char *) *p; #endif /* ARCH */ } #endif /* MP_BUILTINSTACK_SUPPORT && MP_GLIBCBACKTRACE_SUPPORT && ... */ #ifdef MP_PROCFS_EXENAME /* If the /proc filesystem is supported then we can usually access the * actual executable file that contains the current program through a * special file in the current /proc entry. */ sprintf(b, MP_PROCFS_EXENAME, __mp_processid()); return b; #endif /* MP_PROCFS_EXENAME */ #elif TARGET == TARGET_AMIGA if (GetProgramName(p, sizeof(p))) return p; #elif TARGET == TARGET_WINDOWS if (GetModuleFileName(NULL, p, sizeof(p))) return p; #elif TARGET == TARGET_NETWARE if (GetNLMNameFromNLMID(GetNLMID(), &p, &t) == 0) return p; #endif /* TARGET */ return NULL; }