forked from apache/nuttx
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sched/semaphore: Move cancel point and errno handling to libc / user-…
…space This moves all the public POSIX semaphore functions into libc and with this most of the user-space logic is also moved; namely cancel point and errno handling. This also removes the need for the _SEM_XX macros used to differentiate which API is used per user-/kernel mode. Such macros are henceforth unnecessary.
- Loading branch information
Showing
24 changed files
with
566 additions
and
470 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/**************************************************************************** | ||
* libs/libc/semaphore/sem_clockwait.c | ||
* | ||
* Licensed to the Apache Software Foundation (ASF) under one or more | ||
* contributor license agreements. See the NOTICE file distributed with | ||
* this work for additional information regarding copyright ownership. The | ||
* ASF licenses this file to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance with the | ||
* License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
* License for the specific language governing permissions and limitations | ||
* under the License. | ||
* | ||
****************************************************************************/ | ||
|
||
/**************************************************************************** | ||
* Included Files | ||
****************************************************************************/ | ||
|
||
#include <nuttx/config.h> | ||
|
||
#include <time.h> | ||
#include <errno.h> | ||
|
||
#include <nuttx/cancelpt.h> | ||
#include <nuttx/semaphore.h> | ||
|
||
/**************************************************************************** | ||
* Public Functions | ||
****************************************************************************/ | ||
|
||
/**************************************************************************** | ||
* Name: sem_clockwait | ||
* | ||
* Description: | ||
* This function will lock the semaphore referenced by sem as in the | ||
* sem_wait() function. However, if the semaphore cannot be locked without | ||
* waiting for another process or thread to unlock the semaphore by | ||
* performing a sem_post() function, this wait will be terminated when the | ||
* specified timeout expires. | ||
* | ||
* The timeout will expire when the absolute time specified by abstime | ||
* passes, as measured by the clock on which timeouts are based (that is, | ||
* when the value of that clock equals or exceeds abstime), or if the | ||
* absolute time specified by abstime has already been passed at the | ||
* time of the call. | ||
* | ||
* Input Parameters: | ||
* sem - Semaphore object | ||
* clockid - The timing source to use in the conversion | ||
* abstime - The absolute time to wait until a timeout is declared. | ||
* | ||
* Returned Value: | ||
* Zero (OK) is returned on success. On failure, -1 (ERROR) is returned | ||
* and the errno is set appropriately: | ||
* | ||
* EINVAL The sem argument does not refer to a valid semaphore. Or the | ||
* thread would have blocked, and the abstime parameter specified | ||
* a nanoseconds field value less than zero or greater than or | ||
* equal to 1000 million. | ||
* ETIMEDOUT The semaphore could not be locked before the specified timeout | ||
* expired. | ||
* EDEADLK A deadlock condition was detected. | ||
* EINTR A signal interrupted this function. | ||
* ECANCELED May be returned if the thread is canceled while waiting. | ||
* | ||
****************************************************************************/ | ||
|
||
int sem_clockwait(FAR sem_t *sem, clockid_t clockid, | ||
FAR const struct timespec *abstime) | ||
{ | ||
int ret; | ||
|
||
/* Verify the input parameters and, in case of an error, set | ||
* errno appropriately. | ||
*/ | ||
|
||
if (sem == NULL || abstime == NULL) | ||
{ | ||
set_errno(EINVAL); | ||
return ERROR; | ||
} | ||
|
||
/* sem_timedwait() is a cancellation point */ | ||
|
||
enter_cancellation_point(); | ||
|
||
/* Let nxsem_timedout() do the work */ | ||
|
||
ret = nxsem_clockwait(sem, clockid, abstime); | ||
if (ret < 0) | ||
{ | ||
set_errno(-ret); | ||
ret = ERROR; | ||
} | ||
|
||
leave_cancellation_point(); | ||
return ret; | ||
} |
Oops, something went wrong.