embkernel
 All Classes Functions Variables Typedefs Groups Pages
RtosSyncObject.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
8 #include "RtosSyncObject.hpp"
9 #include "RtosTask.hpp"
10 
16 RtosSyncObject::RtosSyncObject(int maxCount, int initialCount) {
17  mMaxCount = maxCount;
18  mCurrentCount = initialCount;
19 }
20 
24 RtosSyncObject::~RtosSyncObject() {
25 
26 }
27 
35  RtosPortable::enterCriticalSection();
36 
37  if (mCurrentCount > 0) {
38  if (value > mCurrentCount) {
39  value = mCurrentCount;
40  }
41  mCurrentCount -= value;
42  return value;
43  }
44 
45  if (tick == 0) {
46  return 0;
47  }
48 
49  putOnWaitList(Rtos::sCurrentTask, tick, &mWaitingToTake);
50 
51  if (value > mCurrentCount) {
52  value = mCurrentCount;
53  }
54  mCurrentCount -= value;
55  return value;
56 }
57 
61 void RtosSyncObject::internalWakeUpWaitingToTake() {
62  RtosListIterable* iterableSyncObj = mWaitingToTake.getFirst();
63  if (iterableSyncObj) {
64  //Remove from sleeping or suspended list
65  RtosTask * task = iterableSyncObj->mTaskOwner;
66  task->mIterableCore.mListOwner->remove(task->mIterableCore);
67  Rtos::sListReady[task->mPriority].insertAtBeginning(task->mIterableCore);
68  RtosPortable::yield();
69  }
70 }
71 
79  RtosPortable::enterCriticalSection();
80 
81  int available = mMaxCount - mCurrentCount;
82  if (available > 0) {
83  if (value > available) {
84  value = available;
85  }
86  mCurrentCount += value;
87  return value;
88  }
89 
90  if (tick == 0) {
91  return 0;
92  }
93 
94  putOnWaitList(Rtos::sCurrentTask, tick, &mWaitingToGive);
95 
96  available = mMaxCount - mCurrentCount;
97 
98  if (value > available) {
99  value = available;
100  }
101  mCurrentCount += value;
102  return value;
103 }
104 
108 void RtosSyncObject::internalWakeUpWaitingToGive() {
109  RtosListIterable* iterableSyncObj = mWaitingToGive.getFirst();
110  if (iterableSyncObj) {
111  //Remove from sleeping or suspended list
112  RtosTask * task = iterableSyncObj->mTaskOwner;
113  task->mIterableCore.mListOwner->remove(task->mIterableCore);
114  Rtos::sListReady[task->mPriority].insertAtBeginning(task->mIterableCore);
115  RtosPortable::yield();
116  }
117 }
118 
127  if (tick == 0) {
128  return false;
129  }
130 
131  if (tick != Rtos::TICK_INFINITE) {
132  Rtos::putOnSleepingList(task, tick);
133  }
134  else {
136  }
137  task->mIterableSyncObj.mSortValue = 0;
138  list->insertSorted(task->mIterableSyncObj);
139 
140  RtosPortable::yield();
141  RtosPortable::exitCriticalSection();
142  RtosPortable::enterCriticalSection();
143 
144  return !task->mIsTimeout;
145 }