Use atomic operation

This commit is contained in:
Ricky Zhang 2014-09-18 16:10:41 -04:00
parent b5b415da0d
commit 39be6a0ac9
No known key found for this signature in database
GPG Key ID: 9E291B0BFD83C3B8

View File

@ -158,7 +158,7 @@ struct SheepVars {
char eth_addr[6]; /* Hardware address of the Ethernet card */ char eth_addr[6]; /* Hardware address of the Ethernet card */
char fake_addr[6]; /* Local faked hardware address (what SheepShaver sees) */ char fake_addr[6]; /* Local faked hardware address (what SheepShaver sees) */
#ifdef LINUX_3_15 #ifdef LINUX_3_15
int got_packet; atomic_t got_packet;
#endif #endif
}; };
@ -396,14 +396,10 @@ static ssize_t sheep_net_read(struct file *f, char *buf, size_t count, loff_t *o
if (skb != NULL || (f->f_flags & O_NONBLOCK)) if (skb != NULL || (f->f_flags & O_NONBLOCK))
break; break;
/*packet is not available*/
#ifdef LINUX_3_15
v->got_packet = 0;
#endif
/* No packet in queue and in blocking mode, so block */ /* No packet in queue and in blocking mode, so block */
#ifdef LINUX_3_15 #ifdef LINUX_3_15
wait_event_interruptible(v->wait, v->got_packet == 1); atomic_set(&v->got_packet, 0);
wait_event_interruptible(v->wait, atomic_read(&v->got_packet));
#else #else
interruptible_sleep_on(&v->wait); interruptible_sleep_on(&v->wait);
#endif #endif
@ -746,12 +742,18 @@ static int sheep_net_receiver(struct sk_buff *skb, struct net_device *dev, struc
/* Enqueue packet */ /* Enqueue packet */
skb_queue_tail(&v->queue, skb); skb_queue_tail(&v->queue, skb);
/* Unblock blocked read */
#ifdef LINUX_3_15 #ifdef LINUX_3_15
v->got_packet = 1;
#endif
/* Unblock blocked read */ atomic_set(&v->got_packet, 1);
wake_up(&v->wait);
wake_up_interruptible(&v->wait);
#else
wake_up(&v->wait);
#endif
return 0; return 0;
drop: drop: