Re: [BUG] Bad #define, nonportable C, missing {}

vda (vda@port.imtp.ilyichevsk.odessa.ua)
Tue, 27 Nov 2001 16:03:54 -0200


On Monday 26 November 2001 18:28, Alan Cox wrote:
> > > MODINC(x,y) (x = (x % y) + 1)
> >
> > drivers/message/i2o/i2o_config.c:#define MODINC(x,y) (x = x++ % y)
> >
> > Alan, can you clarify what this macro is doing?
> > What about making it less confusing?
>
> Nothing to do with me 8). I didnt write that bit of the i2o code. I agree
> its both confusing and buggy. Send a fix ?

This is a test to be sure my replacement is equivalent:
--------------------
#include <stdio.h>
#define MODINC(x,y) (x = x++ % y)
#define MODULO_INC(x,y) ((x) = ((x)%(y))+1)
int main() {
int x1=1;
int x2=1;
int y=7;
int i;
for(i=0;i<22;i++) {
printf("%d,%d -> ",x1,x2);
MODINC(x1,y);
MODULO_INC(x2,y);
printf("%d,%d\n",x1,x2);
}
}

Patch is below

--
vda

--- i2o_config.c.new Mon Oct 22 13:39:56 2001 +++ i2o_config.c.orig Tue Nov 27 16:03:19 2001 @@ -45,7 +45,7 @@ static spinlock_t i2o_config_lock = SPIN_LOCK_UNLOCKED; struct wait_queue *i2o_wait_queue;

-#define MODINC(x,y) (x = x++ % y) +#define MODULO_INC(x,y) ((x) = ((x)%(y))+1)

struct i2o_cfg_info { @@ -144,10 +144,10 @@ inf->event_q[inf->q_in].data_size);

spin_lock(&i2o_config_lock); - MODINC(inf->q_in, I2O_EVT_Q_LEN); + MODULO_INC(inf->q_in, I2O_EVT_Q_LEN); if(inf->q_len == I2O_EVT_Q_LEN) { - MODINC(inf->q_out, I2O_EVT_Q_LEN); + MODULO_INC(inf->q_out, I2O_EVT_Q_LEN); inf->q_lost++; } else @@ -803,7 +803,7 @@ }

memcpy(&kget.info, &p->event_q[p->q_out], sizeof(struct i2o_evt_info)); - MODINC(p->q_out, I2O_EVT_Q_LEN); + MODULO_INC(p->q_out, I2O_EVT_Q_LEN); spin_lock_irqsave(&i2o_config_lock, flags); p->q_len--; kget.pending = p->q_len; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/