2012-07-16 35 views
6

Estoy compilando Percona (variante de MySQL) en mi Raspberry Pi, que tiene un procesador ARM.Trabajando con la conversión inválida de const

He encontrado un problema durante la compilación que se ha informado, pero nadie está dispuesto a solucionarlo porque ARM es una plataforma no compatible.

https://bugs.launchpad.net/percona-server/+bug/1002848

He conseguido solucionar el problema y con éxito compilar, pero mis conocimientos de C++ es un poco deficiente y no entiendo totalmente si en realidad he roto algo o no.

He leído muchas de las conversiones no válidas de preguntas const char * a char * en SO, que es de donde surgió la idea de esta solución.

El error fue de la siguiente manera:

error: invalid conversion from 'const pthread_mutex_t*' to 'pthread_mutex_t*' 

(que en realidad no era pthread_mutex_t en mi plataforma, pero el problema es el mismo - el tipo real se perdió al abismo infinito que es el búfer de desplazamiento)

El código erróneo era:

uint32 count(uint index) const 
    { 
    my_atomic_rwlock_rdlock(&time_collector_lock); 

me cambiaron a este:

uint32 count(uint index) const 
    { 
    my_atomic_rwlock_t dummy = time_collector_lock; 
    my_atomic_rwlock_rdlock(&dummy); 

time_collector_lock se define como:

private: 
    my_atomic_rwlock_t time_collector_lock; 

Debido al hecho de esto se supone que es un mutex, tengo la sensación de que he hecho, probablemente esta no-thread-safe. ¿O está bien?

¿Existe una solución mejor?

+0

¿Por qué no usar 'const_cast'? Habilitará ** su intención ** y no creará una ** copia ** de pthread_mutex_t ... –

+0

Si intenta 'const_cast' un objeto que inicialmente se declaró como' const', el resultado es UB – SingerOfTheFall

+0

@SingerOfTheFall El ** único ** propósito de const_cast es quitar la const. –

Respuesta

10

Parece, en la clase, que ha declarado que los datos de los miembros como:

pthread_mutex_t time_collector_lock; 

por lo que en la función de miembro de const, estos datos se convierte en miembro de como si que ha declarado como:

const pthread_mutex_t time_collector_lock; //(as-if declaration) 

que está causando el problema, ya que no se puede pasar puntero a const objeto a my_atomic_rwlock_rdlock() que se espera puntero a objeto no const.

La palabra clave mutable puede guardarlo aquí. Declarar los datos de los miembros como mutable objeto como:

mutable pthread_mutex_t time_collector_lock; 
//^^^^^^note this 

Ahora puede utilizar los datos de los miembros de const función miembro, así:

uint32 count(uint index) const 
{ 
    my_atomic_rwlock_rdlock(&time_collector_lock); //ok now! 
+2

Tengo este patrón. Los bloqueos y estos no son parte del estado lógico de un objeto (de hecho, su uso es para preservar su estado lógico), por lo que deberían ser mutables cuando sea necesario. –

+3

En realidad se define como 'my_atomic_rwlock_t time_collector_lock;' agregando 'mutable' hizo el truco. ¡Muchas gracias! – Leigh