1855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*
2855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
3855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
4855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
5855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * you may not use this file except in compliance with the License.
6855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * You may obtain a copy of the License at
7855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
8855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
9855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
10855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
11855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
12855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * See the License for the specific language governing permissions and
14855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * limitations under the License.
15855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi */
16855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
17855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
18855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @file         M4OSA_Semaphore.c
19855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief        Semaphore for Windows
20855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note         This file implements functions to manipulate semaphore
21855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
22855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
23855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
24855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
25855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
26855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Debug.h"
27855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Types.h"
28855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Error.h"
29855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Memory.h"
30855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Semaphore.h"
31855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
32855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <semaphore.h>
33855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <string.h>
34855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <stdlib.h>
35855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <stdio.h>
36855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <errno.h>
37855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <time.h>
38855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
39855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
40855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/* Context for the semaphore */
41855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargitypedef struct {
42855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_UInt32   coreID;     /* semaphore context identifiant */
43855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   sem_t          semaphore;  /* semaphore */
44855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi} M4OSA_SemaphoreContext;
45855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
46855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
47855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
48855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
49855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
50855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
51855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method creates a new semaphore with the "initialCounter"
52855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             value.
53855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       This function creates and allocates a unique context. It's the
54855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             OSAL real time responsibility for managing its context. It must
55855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             be freed by the M4OSA_semaphoreClose function. The context
56855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             parameter will be sent back to any OSAL core semaphore functions
57855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             to allow retrieving data associated to the opened semaphore.
58855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(OUT) Context of the created semaphore
59855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      initial_count:(IN) Initial counter of the semaphore
60855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
61855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: provided context is NULL
62855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_ALLOC: there is no more available memory
63855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_CONTEXT_FAILED: the context creation failed
64855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
65855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
66855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_semaphoreOpen(M4OSA_Context* context,
67855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                              M4OSA_UInt32 initial_count)
68855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
69855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_SemaphoreContext* semaphoreContext = M4OSA_NULL;
70855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
71855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_2("M4OSA_semaphoreOpen\t\tM4OSA_Context* 0x%x\tM4OSA_UInt32 "
72855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "%d", context, initial_count);
73855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
74855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
75855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_semaphoreOpen");
76855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
77855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   *context = M4OSA_NULL;
78855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
79694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu   semaphoreContext = (M4OSA_SemaphoreContext*) M4OSA_32bitAlignedMalloc(
80855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                      sizeof(M4OSA_SemaphoreContext), M4OSA_SEMAPHORE,
81855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                      (M4OSA_Char*)"M4OSA_semaphoreOpen: semaphore context");
82855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
83855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(semaphoreContext == M4OSA_NULL)
84855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
85855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(M4ERR_ALLOC, "M4OSA_semaphoreOpen");
86855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
87855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_ALLOC;
88855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
89855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
90855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if (0 != sem_init(&semaphoreContext->semaphore, 0, initial_count))
91855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
92694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu      free(semaphoreContext);
93855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
94855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(M4ERR_CONTEXT_FAILED,
95855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         "M4OSA_semaphoreOpen: OS semaphore creation failed");
96855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
97855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_CONTEXT_FAILED;
98855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
99855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
100855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   semaphoreContext->coreID = M4OSA_SEMAPHORE ;
101855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   *context = (M4OSA_Context)semaphoreContext;
102855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
103855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
104855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
105855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
106855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
107855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
108855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
109855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
110855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
111855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method decrements (one by one) the semaphore counter. The
112855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             semaphore is identified by its context This call is not blocking
113855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             if the semaphore counter is positive or zero (after
114855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             decrementation). This call is blocking if the semaphore counter
115855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             is less than zero (after decrementation), until the semaphore is
116855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             upper than zero (see M4OSA_semaphorePost) or time_out is
117855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             reached.
118855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       If "timeout" value is M4OSA_WAIT_FOREVER, the calling thread
119855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             will block indefinitely until the semaphore  is unlocked.
120855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN/OUT) Context of the semaphore
121855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      timeout:(IN) Time out in milliseconds
122855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
123855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
124855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4WAR_TIME_OUT: time out is elapsed before semaphore has been
125855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             available.
126855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
127855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
128855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
129855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_semaphoreWait(M4OSA_Context context, M4OSA_Int32 timeout)
130855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
131855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_SemaphoreContext* semaphoreContext = (M4OSA_SemaphoreContext*)context;
132855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   struct timespec         ts;
133855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   struct timespec         left;
134855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   int                     result;
135855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
136855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_2("M4OSA_semaphoreWait\t\tM4OSA_Context 0x%x\tM4OSA_UInt32 %d",
137855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  context, timeout);
138855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
139855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
140855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_semaphoreWait");
141855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
142855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(semaphoreContext->coreID != M4OSA_SEMAPHORE,
143855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_semaphoreWait");
144855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
145855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if ( (M4OSA_Int32)M4OSA_WAIT_FOREVER == timeout)
146855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
147855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       if ( 0 != sem_wait(&semaphoreContext->semaphore) )
148855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       {
149855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           M4OSA_DEBUG(M4ERR_BAD_CONTEXT,
150855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_semaphoreWait: OS semaphore wait failed");
151855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
152855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           return M4ERR_BAD_CONTEXT ;
153855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       }
154855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
155855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   else
156855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
157855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       result = sem_trywait(&semaphoreContext->semaphore);
158855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       while ( ((EBUSY == result) || (EAGAIN == result)) && ( 0 < timeout ) )
159855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       {
160855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           ts.tv_sec  = 0;
161855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           if (1 <= timeout)
162855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           {
163855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi               ts.tv_nsec = 1000000;
164855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi               timeout -= 1;
165855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           }
166855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           else
167855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           {
168855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi               ts.tv_nsec = timeout * 1000000;
169855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi               timeout = 0;
170855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           }
171855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           nanosleep(&ts, &left);
172855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           result = sem_trywait(&semaphoreContext->semaphore);
173855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       }
174855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       if (0 != result)
175855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       {
176855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           if ((EBUSY == result) || (EAGAIN == result))
177855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           {
178855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi               return M4WAR_TIME_OUT;
179855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           }
180855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           else
181855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           {
182855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi               M4OSA_DEBUG(M4ERR_BAD_CONTEXT, "M4OSA_semaphoreWait: OS semaphore wait failed");
183855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi               return M4ERR_BAD_CONTEXT;
184855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi           }
185855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       }
186855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
187855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
188855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
189855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
190855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
191855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
192855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
193855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
194855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
195855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
196855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
197855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method increments the semaphore counter. The semaphore is
198855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             identified by its context
199855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       If the semaphore counter is upper than zero (after addition),
200855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             the M4OSA_semaphoreWait call of the thread with the highest
201855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             priority is unblocked and made ready to run.
202855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       No hypotheses can be made on which thread will be unblocked
203855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             between threads with the same priority.
204855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN/OUT) Context of the semaphore
205855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
206855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
207855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
208855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi************************************************************************
209855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
210855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_semaphorePost(M4OSA_Context context)
211855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
212855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_SemaphoreContext* semaphoreContext = (M4OSA_SemaphoreContext*)context;
213855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
214855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_1("M4OSA_semaphorePost\t\tM4OSA_Context 0x%x", context);
215855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
216855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
217855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_semaphorePost");
218855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
219855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(semaphoreContext->coreID != M4OSA_SEMAPHORE,
220855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_semaphorePost");
221855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
222855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   sem_post(&semaphoreContext->semaphore);
223855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
224855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
225855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
226855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
227855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
228855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
229855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
230855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
231855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
232855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
233855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method deletes a semaphore (identify by its context).
234855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             After this call the semaphore and its context is no more
235855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             useable. This function frees all the memory related to this
236855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             semaphore.
237855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       It is an application issue to warrant no more threads are locked
238855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             on the deleted semaphore.
239855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN/OUT) Context of the semaphore
240855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
241855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
242855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one.
243855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi************************************************************************
244855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
245855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_semaphoreClose(M4OSA_Context context)
246855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
247855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_SemaphoreContext* semaphoreContext = (M4OSA_SemaphoreContext*)context;
248855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
249855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_1("M4OSA_semaphoreClose\t\tM4OSA_Context 0x%x", context);
250855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
251855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
252855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_semaphoreClose");
253855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
254855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(semaphoreContext->coreID != M4OSA_SEMAPHORE,
255855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_semaphoreClose");
256855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
257855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   sem_destroy(&semaphoreContext->semaphore);
258855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
259694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu   free(semaphoreContext);
260855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
261855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
262855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
263855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
264