857e5ef3ce
Co-authored-by: Eisuke Kawashima <e-kwsm@users.noreply.github.com> Co-authored-by: systems-assistant[bot] <systems-assistant[bot]@users.noreply.github.com> Co-authored-by: Maisam Arif <Maisam.Arif@amd.com>
92 строки
4.0 KiB
C
92 строки
4.0 KiB
C
/*
|
|
Modifications Copyright © 2019 – 2020 Advanced Micro Devices, Inc. All Rights
|
|
Reserved.
|
|
Copyright (c) 2018 Oleg Yamnikov
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef SRC_SHARED_MUTEX_SHARED_MUTEX_H_
|
|
#define SRC_SHARED_MUTEX_SHARED_MUTEX_H_
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <pthread.h> // pthread_mutex_t, pthread_mutexattr_t,
|
|
// pthread_mutexattr_init, pthread_mutexattr_setpshared,
|
|
// pthread_mutex_init, pthread_mutex_destroy
|
|
|
|
// Structure of a shared mutex.
|
|
typedef struct shared_mutex_t {
|
|
pthread_mutex_t *ptr; // Pointer to the pthread mutex and
|
|
// shared memory segment.
|
|
int shm_fd; // Descriptor of shared memory object.
|
|
char* name; // Name of the mutex and associated
|
|
// shared memory object.
|
|
int created; // Equals 1 (true) if initialization
|
|
// of this structure caused creation
|
|
// of a new shared mutex.
|
|
// Equals 0 (false) if this mutex was
|
|
// just retrieved from shared memory.
|
|
} shared_mutex_t;
|
|
|
|
// Initialize a new shared mutex with given `name`. If a mutex
|
|
// with such name exists in the system, it will be loaded.
|
|
// Otherwise a new mutes will by created.
|
|
//
|
|
// In case of any error, it will be printed into the standard output
|
|
// and the returned structure will have `ptr` equal `NULL`.
|
|
// `errno` wil not be reset in such case, so you may used it.
|
|
//
|
|
// **NOTE:** In case when the mutex appears to be uncreated,
|
|
// this function becomes *non-thread-safe*. If multiple threads
|
|
// call it at one moment, there occur several race conditions,
|
|
// in which one call might recreate another's shared memory
|
|
// object or rewrite another's pthread mutex in the shared memory.
|
|
// There is no workaround currently, except to run first
|
|
// initialization only before multi-threaded or multi-process
|
|
// functionality.
|
|
shared_mutex_t shared_mutex_init(const char *name, mode_t mode, bool retried=false);
|
|
|
|
// Close access to the shared mutex and free all the resources,
|
|
// used by the structure.
|
|
//
|
|
// Returns 0 in case of success. If any error occurs, it will be
|
|
// printed into the standard output and the function will return -1.
|
|
// `errno` wil not be reset in such case, so you may used it.
|
|
//
|
|
// **NOTE:** It will not destroy the mutex. The mutex would not
|
|
// only be available to other processes using it right now,
|
|
// but also to any process which might want to use it later on.
|
|
// For complete desctruction use `shared_mutex_destroy` instead.
|
|
//
|
|
// **NOTE:** It will not unlock locked mutex.
|
|
int shared_mutex_close(shared_mutex_t mutex);
|
|
|
|
// Close and destroy shared mutex.
|
|
// Any open pointers to it will be invalidated.
|
|
//
|
|
// Returns 0 in case of success. If any error occurs, it will be
|
|
// printed into the standard output and the function will return -1.
|
|
// `errno` wil not be reset in such case, so you may used it.
|
|
//
|
|
// **NOTE:** It will not unlock locked mutex.
|
|
int shared_mutex_destroy(shared_mutex_t mutex);
|
|
|
|
#endif // SRC_SHARED_MUTEX_SHARED_MUTEX_H_
|