[Mesa-dev] [PATCH] r300g: add program name check for BSD

Brian Paul brianp at vmware.com
Thu Jun 27 07:31:40 PDT 2013


On 06/26/2013 10:08 PM, Jonathan Gray wrote:
> On Wed, Jun 26, 2013 at 09:49:08AM -0600, Brian Paul wrote:
>> On 06/26/2013 01:11 AM, Jonathan Gray wrote:
>>> program_invocation_short_name is glibc specific.  Provide an
>>> alternative using getprogname(), which can be found on *BSD and OS X.
>>>
>>> Signed-off-by: Jonathan Gray <jsg at jsg.id.au>
>>> ---
>>>   src/gallium/drivers/r300/r300_chipset.c | 10 +++++++++-
>>>   1 file changed, 9 insertions(+), 1 deletion(-)
>>>
>>> diff --git src/gallium/drivers/r300/r300_chipset.c src/gallium/drivers/r300/r300_chipset.c
>>> index 11061ed..7f51ccb 100644
>>> --- src/gallium/drivers/r300/r300_chipset.c
>>> +++ src/gallium/drivers/r300/r300_chipset.c
>>> @@ -30,6 +30,14 @@
>>>   #include <stdio.h>
>>>   #include <errno.h>
>>>
>>> +#undef GET_PROGRAM_NAME
>>> +#ifdef __GLIBC__
>>> +#	define GET_PROGRAM_NAME() program_invocation_short_name
>>> +#else /* *BSD and OS X */
>>> +#	include <stdlib.h>
>>> +#	define GET_PROGRAM_NAME() getprogname()
>>> +#endif
>>> +
>>>   /* r300_chipset: A file all to itself for deducing the various properties of
>>>    * Radeons. */
>>>
>>> @@ -49,7 +57,7 @@ static void r300_apply_hyperz_blacklist(struct r300_capabilities* caps)
>>>       int i;
>>>
>>>       for (i = 0; i < Elements(list); i++) {
>>> -        if (strcmp(list[i], program_invocation_short_name) == 0) {
>>> +        if (strcmp(list[i], GET_PROGRAM_NAME()) == 0) {
>>>               caps->zmask_ram = 0;
>>>               caps->hiz_ram = 0;
>>>               break;
>>>
>>
>> I think a new gallium utility function for this would be helpful.
>> In fact I've already implemented something like this for our windows
>> driver.
>>
>> Does the attached code look OK you to guys?
>
> looks good to me, a few nitpicks inline
>
>>
>> -Brian
>>
>>
>
>> #include "pipe/p_config.h"
>> #include "os/os_process.h"
>> #include "util/u_memory.h"
>>
>> #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
>> #  include <windows.h>
>> #endif
>
> it isn't clear if stdlib.h is included here?
>
>>
>>
>> /**
>>   * Return the name of the current process.
>>   * \param procname  returns the process name, always 0-terminated
>>   * \param size  size of the procname buffer
>>   * \return  TRUE or FALSE for success, failure
>>   */
>> boolean
>> os_get_process_name(char *procname, size_t size)
>> {
>>     const char *name;
>> #if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
>>     char szProcessPath[MAX_PATH];
>>     char *lpProcessName;
>>     char *lpProcessExt;
>>
>>     GetModuleFileNameA(NULL, szProcessPath, Elements(szProcessPath));
>>
>>     lpProcessName = strrchr(szProcessPath, '\\');
>>     lpProcessName = lpProcessName ? lpProcessName + 1 : szProcessPath;
>>
>>     lpProcessExt = strrchr(lpProcessName, '.');
>>     if (lpProcessExt) {
>>        *lpProcessExt = '\0';
>>     }
>>
>>     name = lpProcessName;
>>
>> #elif defined(__GLIBC__)
>>     name = program_invocation_short_name;
>> #else /* *BSD and OS X */
>>     name = getprogname();
>> #endif
>>
>>     assert(procname);
>>     assert(size > 0);
>>
>>     if (name) {
>>        strncpy(procname, name, size);
>>        procname[size - 1] = 0;
>
> and this should be '\0' not 0, though the end result is the same
>
>>        return TRUE;
>>     }
>>     else {
>>        return FALSE;
>>     }
>> }

Thanks.  I'll fix those issues and post git patches for review.

-Brian



More information about the mesa-dev mailing list