Function report |
Source Code:ipc\sem.c |
Create Date:2022-07-28 16:45:37 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:do_semtimedop
Proto:static long do_semtimedop(int semid, struct sembuf __user *tsops, unsigned nsops, const struct timespec64 *timeout)
Type:long
Parameter:
| Type | Parameter | Name |
|---|---|---|
| int | semid | |
| struct sembuf __user * | tsops | |
| unsigned | nsops | |
| const struct timespec64 * | timeout |
| 1977 | dup = 0 , jiffies_left = 0 |
| 1986 | If nsops > ~ 372 bytes on stack Then |
| 1987 | sops = kvmalloc_array(nsops, size of sops , GFP_KERNEL) |
| 1992 | If copy_from_user(sops, tsops, nsops * size of tsops ) Then |
| 1997 | If timeout Then |
| 1998 | If seconds < 0 || nanoseconds < 0 || nanoseconds >= 1000000000L Then |
| 2003 | jiffies_left = timespec64_to_jiffies(timeout) |
| 2006 | max = 0 |
| 2008 | mask = 1ULL << semaphore index in array % BITS_PER_LONG |
| 2010 | If semaphore index in array >= max Then max = semaphore index in array |
| 2012 | If peration flags & undo the operation on exit Then undos = true |
| 2021 | dupsop = true |
| 2023 | If semaphore operation != 0 Then |
| 2029 | If undos Then |
| 2036 | Else |
| 2037 | un = NULL |
| 2041 | sma = sem_obtain_object_check(ns, semid) |
| 2045 | Go to out_free |
| 2049 | If max >= . of semaphores in array Then |
| 2051 | Go to out_free |
| 2057 | Go to out_free |
| 2060 | error = security_sem_semop( & permissions .. see ipc.h , sops, nsops, alter) |
| 2061 | If error Then |
| 2063 | Go to out_free |
| 2067 | locknum = If the request contains only one semaphore operation, and there are* no complex transactions pending, lock only the semaphore involved |
| 2085 | If un && semaphore set identifier == -1 Then Go to out_unlock_free |
| 2088 | array of pending operations = sops |
| 2089 | umber of operations = nsops |
| 2090 | undo structure = un |
| 2092 | does *sops alter the array? = alter |
| 2095 | error = perform_atomic_semop(sma, & queue) |
| 2096 | If error == 0 Then |
| 2108 | sem_unlock(sma, locknum) |
| 2112 | Go to out_free |
| 2114 | If error < 0 Then Go to out_unlock_free |
| 2121 | If nsops == 1 Then |
| 2126 | If alter Then |
| 2127 | If pending complex operations Then |
| 2130 | Else |
| 2135 | Else |
| 2138 | Else |
| 2147 | pending complex operations ++ |
| 2150 | Do |
| 2151 | WRITE_ONCE(completion status of operation , - EINTR) |
| 2152 | his process = current process |
| 2155 | sem_unlock(sma, locknum) |
| 2158 | If timeout Then jiffies_left = schedule_timeout - sleep until timeout*@timeout: timeout value in jiffies* Make the current task sleep until @timeout jiffies have* elapsed |
| 2160 | Else schedule() |
| 2174 | error = READ_ONCE(completion status of operation ) |
| 2187 | locknum = If the request contains only one semaphore operation, and there are* no complex transactions pending, lock only the semaphore involved |
| 2192 | error = READ_ONCE(completion status of operation ) |
| 2198 | If error != -EINTR Then Go to out_unlock_free |
| 2204 | If timeout && jiffies_left == 0 Then error = -EAGAIN |
| 2206 | When error == -EINTR && Not signal_pending(current process) cycle |
| 2208 | unlink_queue(sma, & queue) |
| 2210 | out_unlock_free : |
| 2211 | sem_unlock(sma, locknum) |
| 2213 | out_free : |
| 2216 | Return error |
| Name | Describe |
|---|---|
| ksys_semtimedop | |
| SYSCALL_DEFINE3 |
| Source code conversion tool public plug-in interface | X |
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |