test test test

Dependencies:   mbed

Committer:
mohamedmoawya
Date:
Mon May 25 19:06:11 2020 +0000
Revision:
0:e4c5e6ec922e
snake game tteest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mohamedmoawya 0:e4c5e6ec922e 1
mohamedmoawya 0:e4c5e6ec922e 2 /** \addtogroup platform */
mohamedmoawya 0:e4c5e6ec922e 3 /** @{*/
mohamedmoawya 0:e4c5e6ec922e 4 /**
mohamedmoawya 0:e4c5e6ec922e 5 * \defgroup platform_SingletonPtr SingletonPtr class
mohamedmoawya 0:e4c5e6ec922e 6 * @{
mohamedmoawya 0:e4c5e6ec922e 7 */
mohamedmoawya 0:e4c5e6ec922e 8 /* mbed Microcontroller Library
mohamedmoawya 0:e4c5e6ec922e 9 * Copyright (c) 2006-2013 ARM Limited
mohamedmoawya 0:e4c5e6ec922e 10 *
mohamedmoawya 0:e4c5e6ec922e 11 * Licensed under the Apache License, Version 2.0 (the "License");
mohamedmoawya 0:e4c5e6ec922e 12 * you may not use this file except in compliance with the License.
mohamedmoawya 0:e4c5e6ec922e 13 * You may obtain a copy of the License at
mohamedmoawya 0:e4c5e6ec922e 14 *
mohamedmoawya 0:e4c5e6ec922e 15 * http://www.apache.org/licenses/LICENSE-2.0
mohamedmoawya 0:e4c5e6ec922e 16 *
mohamedmoawya 0:e4c5e6ec922e 17 * Unless required by applicable law or agreed to in writing, software
mohamedmoawya 0:e4c5e6ec922e 18 * distributed under the License is distributed on an "AS IS" BASIS,
mohamedmoawya 0:e4c5e6ec922e 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mohamedmoawya 0:e4c5e6ec922e 20 * See the License for the specific language governing permissions and
mohamedmoawya 0:e4c5e6ec922e 21 * limitations under the License.
mohamedmoawya 0:e4c5e6ec922e 22 */
mohamedmoawya 0:e4c5e6ec922e 23 #ifndef SINGLETONPTR_H
mohamedmoawya 0:e4c5e6ec922e 24 #define SINGLETONPTR_H
mohamedmoawya 0:e4c5e6ec922e 25
mohamedmoawya 0:e4c5e6ec922e 26 #include <stdint.h>
mohamedmoawya 0:e4c5e6ec922e 27 #include <new>
mohamedmoawya 0:e4c5e6ec922e 28 #include "platform/mbed_assert.h"
mohamedmoawya 0:e4c5e6ec922e 29 #ifdef MBED_CONF_RTOS_PRESENT
mohamedmoawya 0:e4c5e6ec922e 30 #include "cmsis_os2.h"
mohamedmoawya 0:e4c5e6ec922e 31 #endif
mohamedmoawya 0:e4c5e6ec922e 32
mohamedmoawya 0:e4c5e6ec922e 33 #ifdef MBED_CONF_RTOS_PRESENT
mohamedmoawya 0:e4c5e6ec922e 34 extern osMutexId_t singleton_mutex_id;
mohamedmoawya 0:e4c5e6ec922e 35 #endif
mohamedmoawya 0:e4c5e6ec922e 36
mohamedmoawya 0:e4c5e6ec922e 37 /** Lock the singleton mutex
mohamedmoawya 0:e4c5e6ec922e 38 *
mohamedmoawya 0:e4c5e6ec922e 39 * This function is typically used to provide
mohamedmoawya 0:e4c5e6ec922e 40 * exclusive access when initializing a
mohamedmoawya 0:e4c5e6ec922e 41 * global object.
mohamedmoawya 0:e4c5e6ec922e 42 */
mohamedmoawya 0:e4c5e6ec922e 43 inline static void singleton_lock(void)
mohamedmoawya 0:e4c5e6ec922e 44 {
mohamedmoawya 0:e4c5e6ec922e 45 #ifdef MBED_CONF_RTOS_PRESENT
mohamedmoawya 0:e4c5e6ec922e 46 if (!singleton_mutex_id) {
mohamedmoawya 0:e4c5e6ec922e 47 // RTOS has not booted yet so no mutex is needed
mohamedmoawya 0:e4c5e6ec922e 48 return;
mohamedmoawya 0:e4c5e6ec922e 49 }
mohamedmoawya 0:e4c5e6ec922e 50 osMutexAcquire(singleton_mutex_id, osWaitForever);
mohamedmoawya 0:e4c5e6ec922e 51 #endif
mohamedmoawya 0:e4c5e6ec922e 52 }
mohamedmoawya 0:e4c5e6ec922e 53
mohamedmoawya 0:e4c5e6ec922e 54 /** Unlock the singleton mutex
mohamedmoawya 0:e4c5e6ec922e 55 *
mohamedmoawya 0:e4c5e6ec922e 56 * This function is typically used to provide
mohamedmoawya 0:e4c5e6ec922e 57 * exclusive access when initializing a
mohamedmoawya 0:e4c5e6ec922e 58 * global object.
mohamedmoawya 0:e4c5e6ec922e 59 */
mohamedmoawya 0:e4c5e6ec922e 60 inline static void singleton_unlock(void)
mohamedmoawya 0:e4c5e6ec922e 61 {
mohamedmoawya 0:e4c5e6ec922e 62 #ifdef MBED_CONF_RTOS_PRESENT
mohamedmoawya 0:e4c5e6ec922e 63 if (!singleton_mutex_id) {
mohamedmoawya 0:e4c5e6ec922e 64 // RTOS has not booted yet so no mutex is needed
mohamedmoawya 0:e4c5e6ec922e 65 return;
mohamedmoawya 0:e4c5e6ec922e 66 }
mohamedmoawya 0:e4c5e6ec922e 67 osMutexRelease(singleton_mutex_id);
mohamedmoawya 0:e4c5e6ec922e 68 #endif
mohamedmoawya 0:e4c5e6ec922e 69 }
mohamedmoawya 0:e4c5e6ec922e 70
mohamedmoawya 0:e4c5e6ec922e 71 /** Utility class for creating an using a singleton
mohamedmoawya 0:e4c5e6ec922e 72 *
mohamedmoawya 0:e4c5e6ec922e 73 * @note Synchronization level: Thread safe
mohamedmoawya 0:e4c5e6ec922e 74 *
mohamedmoawya 0:e4c5e6ec922e 75 * @note: This class must only be used in a static context -
mohamedmoawya 0:e4c5e6ec922e 76 * this class must never be allocated or created on the
mohamedmoawya 0:e4c5e6ec922e 77 * stack.
mohamedmoawya 0:e4c5e6ec922e 78 *
mohamedmoawya 0:e4c5e6ec922e 79 * @note: This class is lazily initialized on first use.
mohamedmoawya 0:e4c5e6ec922e 80 * This class is a POD type so if it is not used it will
mohamedmoawya 0:e4c5e6ec922e 81 * be garbage collected.
mohamedmoawya 0:e4c5e6ec922e 82 */
mohamedmoawya 0:e4c5e6ec922e 83 template <class T>
mohamedmoawya 0:e4c5e6ec922e 84 struct SingletonPtr {
mohamedmoawya 0:e4c5e6ec922e 85
mohamedmoawya 0:e4c5e6ec922e 86 /** Get a pointer to the underlying singleton
mohamedmoawya 0:e4c5e6ec922e 87 *
mohamedmoawya 0:e4c5e6ec922e 88 * @returns
mohamedmoawya 0:e4c5e6ec922e 89 * A pointer to the singleton
mohamedmoawya 0:e4c5e6ec922e 90 */
mohamedmoawya 0:e4c5e6ec922e 91 T *get()
mohamedmoawya 0:e4c5e6ec922e 92 {
mohamedmoawya 0:e4c5e6ec922e 93 if (NULL == _ptr) {
mohamedmoawya 0:e4c5e6ec922e 94 singleton_lock();
mohamedmoawya 0:e4c5e6ec922e 95 if (NULL == _ptr) {
mohamedmoawya 0:e4c5e6ec922e 96 _ptr = new (_data) T();
mohamedmoawya 0:e4c5e6ec922e 97 }
mohamedmoawya 0:e4c5e6ec922e 98 singleton_unlock();
mohamedmoawya 0:e4c5e6ec922e 99 }
mohamedmoawya 0:e4c5e6ec922e 100 // _ptr was not zero initialized or was
mohamedmoawya 0:e4c5e6ec922e 101 // corrupted if this assert is hit
mohamedmoawya 0:e4c5e6ec922e 102 MBED_ASSERT(_ptr == (T *)&_data);
mohamedmoawya 0:e4c5e6ec922e 103 return _ptr;
mohamedmoawya 0:e4c5e6ec922e 104 }
mohamedmoawya 0:e4c5e6ec922e 105
mohamedmoawya 0:e4c5e6ec922e 106 /** Get a pointer to the underlying singleton
mohamedmoawya 0:e4c5e6ec922e 107 *
mohamedmoawya 0:e4c5e6ec922e 108 * @returns
mohamedmoawya 0:e4c5e6ec922e 109 * A pointer to the singleton
mohamedmoawya 0:e4c5e6ec922e 110 */
mohamedmoawya 0:e4c5e6ec922e 111 T *operator->()
mohamedmoawya 0:e4c5e6ec922e 112 {
mohamedmoawya 0:e4c5e6ec922e 113 return get();
mohamedmoawya 0:e4c5e6ec922e 114 }
mohamedmoawya 0:e4c5e6ec922e 115
mohamedmoawya 0:e4c5e6ec922e 116 // This is zero initialized when in global scope
mohamedmoawya 0:e4c5e6ec922e 117 T *_ptr;
mohamedmoawya 0:e4c5e6ec922e 118 // Force data to be 4 byte aligned
mohamedmoawya 0:e4c5e6ec922e 119 uint32_t _data[(sizeof(T) + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
mohamedmoawya 0:e4c5e6ec922e 120 };
mohamedmoawya 0:e4c5e6ec922e 121
mohamedmoawya 0:e4c5e6ec922e 122 #endif
mohamedmoawya 0:e4c5e6ec922e 123 /**@}*/
mohamedmoawya 0:e4c5e6ec922e 124
mohamedmoawya 0:e4c5e6ec922e 125 /**@}*/