+ AcquireLock();
+ Task_T* receiver = &Tasks[tid];
+ Task_T* sender = &Tasks[Running[CpuID].task];
+ sender->sender = tid;
+ sender->sdata = sdata;
+ sender->nsdata = nsdata;
+ sender->rdata = rdata;
+ sender->nrdata = nrdata;
+ // put sender in receiver's wait queue
+
+ if (receiver->state == STATE_RECV_BLOCKED)
+ {
+ // TODO: swap tasks directly to the receiver
+ // The receiver will handle the message and yield back to sender
+ ReleaseLock();
+ //YieldTo(receiver);
+ }
+ else
+ {
+ ReleaseLock();
+ Kernel_Yield();
+ }
+ return sender->status;