2010-01-27 16 views
7

La forma más sencilla de manipular el GIL en las extensiones Python C es el uso de las macros proporcionados:Cómo evitar la advertencia gcc en extensión de Python C cuando se utiliza Py_BEGIN_ALLOW_THREADS

my_awesome_C_function() 
{ 
    blah; 

    Py_BEGIN_ALLOW_THREADS 

    // do stuff that doesn't need the GIL 

    if (should_i_call_back) { 
     Py_BLOCK_THREADS 
     // do stuff that needs the GIL 
     Py_UNBLOCK_THREADS 
    } 

    Py_END_ALLOW_THREADS 

    return blah blah; 
} 

Esto funciona muy bien, dejando que lanza los GIL para la mayor parte de mi código, pero volviéndolo a capturar por pequeños trozos de código que lo necesitan.

El problema es cuando compilo esto con gcc, me sale:

ext/engine.c:548: warning: '_save' might be used uninitialized in this function 

porque Py_BEGIN_ALLOW_THREADS se define así:

#define Py_BEGIN_ALLOW_THREADS { \ 
     PyThreadState *_save; \ 
     _save = PyEval_SaveThread(); 

Así, tres preguntas:

  1. Is es posible suprimir la advertencia de gcc,
  2. Does Alguien tiene alguna idea de por qué gcc piensa que _save se puede utilizar sin inicializar, ya que se asigna inmediatamente después de su declaración, y
  3. ¿Por qué no se ha definido la macro para declarar e inicializar la variable en una declaración para evitar el problema?

(los dos últimos son realmente solo por mi propia curiosidad).

Puedo evitar el problema al no usar las macros y hacerlo todo yo solo, pero prefiero no hacerlo.

Respuesta

3
  1. Sí, es posible suprimir las advertencias no inicializadas con el prefijo -Wno-.

-Wall -Wno-uninitialized

Si desea eliminar sólo esta advertencia, simplemente podría inicializar _save a un puntero nulo para que no se basa en un valor de retorno de la función ... que una línea de código y un comentario tiene sentido para mí:

PyThreadState *_save; 
_save = 0; /* init as null pointer value */ 
_save = PyEval_SaveThread(); 
+0

Tenía la esperanza de una forma muy localizada de desactivar solo esta advertencia en esta línea. Prefiero no deshabilitar todas las advertencias no inicializadas. –

+0

si desea evitar solo esta advertencia, agregue una línea antes de llamar a 'PyEval_SaveThread()' para inicializar '_save' a un puntero nulo (vea la respuesta actualizada más arriba) –

1

Mis dos centavos:

  1. puede suprimir advertencias específicas, pero Supongo que ya lo sabías.
  2. Dice podría ser inicializado :-)
  3. La única razón que puedo imaginar es la compatibilidad con los compiladores de C mayores.

He intentado cavar en the source, pero no pude encontrar ninguna buena pista.

+1

1. Sabía que podía desactivar clases enteras de advertencias en el línea de comando, pero esperaba un pragma que pudiera desactivar solo esta advertencia. –

0

Ned, puede intentar one of these:

#pragma GCC diagnostic warning "-Wno-unitialized" 
#pragma GCC diagnostic error "-Wno-uninitialized" 
#pragma GCC diagnostic ignored "-Wno-uninialized" 

o ignorar -Wuninitialized? De acuerdo con la documentación, debe hacer esto antes de definir cualquier dato o función. Tal vez le permita desactivar la advertencia solo para ese archivo?

Cuestiones relacionadas