Skip to contentSkip to conversation

RT-Socket-CAN:

PATCH New Wolfgang Grandegger 1 participant 1 message Aug 22, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 RT-Socket-CAN:

Hello,

the following patch fixes:

2007-08-22 Wolfgang Grandegger <[email protected]>

* ksrc/drivers/can/rtcan_socket.c: protect the list of sockets per device properly when adding or deleting sockets.

It should be applied to Xenomai's trunk and v2.3.x branch.

Wolfgang.

ChangeLog +5 -0
Index: ChangeLog
===================================================================
@@ -1,3 +1,8 @@
+2007-08-22  Wolfgang Grandegger  <[email protected]>
+
+	* ksrc/drivers/can/rtcan_socket.c: protect the list of sockets
+	per device properly when adding or deleting sockets.
+
 2007-08-18  Philippe Gerum  <[email protected]>
 
 	* RELEASE: Xenomai 2.4-rc2
drivers/can/rtcan_socket.c +8 -0
Index: ksrc/drivers/can/rtcan_socket.c
===================================================================
@@ -37,6 +37,7 @@ LIST_HEAD(rtcan_socket_list);
 void rtcan_socket_init(struct rtdm_dev_context *context)
 {
     struct rtcan_socket *sock = (struct rtcan_socket *)&context->dev_private;
+    rtdm_lockctx_t lock_ctx;
 
 
     rtdm_sem_init(&sock->recv_sem, 0);
@@ -56,7 +57,10 @@ void rtcan_socket_init(struct rtdm_dev_c
     sock->rx_timeout = RTDM_TIMEOUT_INFINITE;
 
     INIT_LIST_HEAD(&sock->tx_wait_head);
+
+    rtdm_lock_get_irqsave(&rtcan_socket_lock, lock_ctx);
     list_add(&sock->socket_list, &rtcan_socket_list);
+    rtdm_lock_put_irqrestore(&rtcan_socket_lock, lock_ctx);
 }
 
 
@@ -64,6 +68,7 @@ void rtcan_socket_cleanup(struct rtdm_de
 {
     struct rtcan_socket *sock = (struct rtcan_socket *)&context->dev_private;
     struct tx_wait_queue *tx_waiting;
+    rtdm_lockctx_t lock_ctx;
     int tx_list_empty;
 
 
@@ -91,5 +96,8 @@ void rtcan_socket_cleanup(struct rtdm_de
     } while (!tx_list_empty);
 
     rtdm_sem_destroy(&sock->recv_sem);
+
+    rtdm_lock_get_irqsave(&rtcan_socket_lock, lock_ctx);
     list_del(&sock->socket_list);
+    rtdm_lock_put_irqrestore(&rtcan_socket_lock, lock_ctx);
 }