]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/devcommon.c
LinCAN can be compiled in mode with RT-Linux chip worker threads now.
[lincan.git] / lincan / src / devcommon.c
index c26a36f0231fab67c8cb420628e888bc98b6a15e..c0b602886f49a8a64abf7552aae9ad73262732c2 100644 (file)
@@ -25,8 +25,25 @@ void canqueue_notify_chip(struct canque_ends_t *qends, struct canque_edge_t *qed
                        wake_up(&qends->endinfo.chipinfo.daemonq);
                        break;*/
                case CANQUEUE_NOTIFY_PROC:
+                   #ifndef CAN_WITH_RTL
                        /*wake_up(&qends->endinfo.chipinfo.daemonq);*/
                        chip->chipspecops->wakeup_tx(chip, obj);
+                   #else /*CAN_WITH_RTL*/
+                       can_msgobj_set_fl(obj,TX_REQUEST);
+                       if(qends->endinfo.chipinfo.worker_thread){
+                               can_msgobj_set_fl(obj,WORKER_WAKE);
+                               pthread_kill(qends->endinfo.chipinfo.worker_thread,RTL_SIGNAL_WAKEUP);
+                               rtl_schedule();
+                       } else {
+                               set_bit(MSGOBJ_TX_REQUEST_b,&chip->pend_flags);
+
+                               if(chip->worker_thread) {
+                                       set_bit(MSGOBJ_WORKER_WAKE_b,&chip->pend_flags);
+                                       pthread_kill(chip->worker_thread,RTL_SIGNAL_WAKEUP);
+                                       rtl_schedule();
+                               }
+                       }
+                   #endif /*CAN_WITH_RTL*/
                        break;
                case CANQUEUE_NOTIFY_DEAD_WANTED:
                case CANQUEUE_NOTIFY_DEAD:
@@ -46,7 +63,9 @@ int canqueue_ends_init_chip(struct canque_ends_t *qends, struct chip_t *chip, st
        if(ret<0) return ret;
        
        qends->context=NULL;
+    #ifndef CAN_WITH_RTL
        init_waitqueue_head(&qends->endinfo.chipinfo.daemonq);
+    #endif /*CAN_WITH_RTL*/
        qends->endinfo.chipinfo.chip=chip;
        qends->endinfo.chipinfo.msgobj=obj;
        qends->notify=canqueue_notify_chip;