| 
									
										
										
										
											2019-04-17 10:49:11 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2020-03-02 22:13:38 +08:00
										 |  |  | //  MNNMemoryUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2019-04-17 10:49:11 +08:00
										 |  |  | //  MNN
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  Created by MNN on 2018/07/14.
 | 
					
						
							|  |  |  | //  Copyright © 2018, Alibaba Group Holding Limited
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 16:41:56 +08:00
										 |  |  | #include "core/MNNMemoryUtils.h"
 | 
					
						
							| 
									
										
										
										
											2019-04-17 10:49:11 +08:00
										 |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2019-12-27 22:16:57 +08:00
										 |  |  | #include "core/Macro.h"
 | 
					
						
							| 
									
										
										
										
											2020-02-26 09:57:17 +08:00
										 |  |  | //#define MNN_DEBUG_MEMORY
 | 
					
						
							| 
									
										
										
										
											2019-04-17 10:49:11 +08:00
										 |  |  | static inline void **alignPointer(void **ptr, size_t alignment) { | 
					
						
							|  |  |  |     return (void **)((intptr_t)((unsigned char *)ptr + alignment - 1) & -alignment); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-27 22:16:57 +08:00
										 |  |  | extern "C" void *MNNMemoryAllocAlign(size_t size, size_t alignment) { | 
					
						
							| 
									
										
										
										
											2019-04-17 10:49:11 +08:00
										 |  |  |     MNN_ASSERT(size > 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef MNN_DEBUG_MEMORY
 | 
					
						
							|  |  |  |     return malloc(size); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     void **origin = (void **)malloc(size + sizeof(void *) + alignment); | 
					
						
							|  |  |  |     MNN_ASSERT(origin != NULL); | 
					
						
							|  |  |  |     if (!origin) { | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void **aligned = alignPointer(origin + 1, alignment); | 
					
						
							|  |  |  |     aligned[-1]    = origin; | 
					
						
							|  |  |  |     return aligned; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-27 22:16:57 +08:00
										 |  |  | extern "C" void *MNNMemoryCallocAlign(size_t size, size_t alignment) { | 
					
						
							| 
									
										
										
										
											2019-04-17 10:49:11 +08:00
										 |  |  |     MNN_ASSERT(size > 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef MNN_DEBUG_MEMORY
 | 
					
						
							|  |  |  |     return calloc(size, 1); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     void **origin = (void **)calloc(size + sizeof(void *) + alignment, 1); | 
					
						
							|  |  |  |     MNN_ASSERT(origin != NULL) | 
					
						
							|  |  |  |     if (!origin) { | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     void **aligned = alignPointer(origin + 1, alignment); | 
					
						
							|  |  |  |     aligned[-1]    = origin; | 
					
						
							|  |  |  |     return aligned; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-27 22:16:57 +08:00
										 |  |  | extern "C" void MNNMemoryFreeAlign(void *aligned) { | 
					
						
							| 
									
										
										
										
											2019-04-17 10:49:11 +08:00
										 |  |  | #ifdef MNN_DEBUG_MEMORY
 | 
					
						
							|  |  |  |     free(aligned); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     if (aligned) { | 
					
						
							|  |  |  |         void *origin = ((void **)aligned)[-1]; | 
					
						
							|  |  |  |         free(origin); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } |