summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-18 15:33:13 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-18 15:36:58 +0100
commit19e855d745819297ee64f817eff02dac17a20104 (patch)
treeff8555b5ba38562ed2a16dc102d3f7cbf21fdc95
parentscore: Avoid Giant lock for CORE spinlock (diff)
downloadrtems-19e855d745819297ee64f817eff02dac17a20104.tar.bz2
mpci: Avoid Giant lock
Update #2555.
-rw-r--r--cpukit/score/src/mpci.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c
index c191bbe472..3929d78a09 100644
--- a/cpukit/score/src/mpci.c
+++ b/cpukit/score/src/mpci.c
@@ -237,16 +237,19 @@ uint32_t _MPCI_Send_request_packet (
uint32_t timeout_code
)
{
- Thread_Control *executing = _Thread_Executing;
+ Per_CPU_Control *cpu_self;
+ Thread_Control *executing;
- the_packet->source_tid = executing->Object.id;
- the_packet->source_priority = executing->current_priority;
- the_packet->to_convert =
- ( the_packet->to_convert - sizeof(MP_packet_Prefix) ) / sizeof(uint32_t);
+ cpu_self = _Thread_Dispatch_disable();
+
+ executing = _Per_CPU_Get_executing( cpu_self );
- executing->Wait.id = the_packet->id;
+ the_packet->source_tid = executing->Object.id;
+ the_packet->source_priority = executing->current_priority;
+ the_packet->to_convert =
+ ( the_packet->to_convert - sizeof(MP_packet_Prefix) ) / sizeof(uint32_t);
- _Thread_Disable_dispatch();
+ executing->Wait.id = the_packet->id;
(*_MPCI_table->send_packet)( destination, the_packet );
@@ -265,7 +268,7 @@ uint32_t _MPCI_Send_request_packet (
timeout_code
);
- _Thread_Enable_dispatch();
+ _Thread_Dispatch_enable( cpu_self );
return executing->Wait.return_code;
}