|  | //===-- safestack_util.h --------------------------------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file contains utility code for SafeStack implementation. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef SAFESTACK_UTIL_H | 
|  | #define SAFESTACK_UTIL_H | 
|  |  | 
|  | #include <pthread.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  |  | 
|  | namespace safestack { | 
|  |  | 
|  | #define SFS_CHECK(a)                                                  \ | 
|  | do {                                                                \ | 
|  | if (!(a)) {                                                       \ | 
|  | fprintf(stderr, "safestack CHECK failed: %s:%d %s\n", __FILE__, \ | 
|  | __LINE__, #a);                                          \ | 
|  | abort();                                                        \ | 
|  | };                                                                \ | 
|  | } while (false) | 
|  |  | 
|  | inline size_t RoundUpTo(size_t size, size_t boundary) { | 
|  | SFS_CHECK((boundary & (boundary - 1)) == 0); | 
|  | return (size + boundary - 1) & ~(boundary - 1); | 
|  | } | 
|  |  | 
|  | class MutexLock { | 
|  | public: | 
|  | explicit MutexLock(pthread_mutex_t &mutex) : mutex_(&mutex) { | 
|  | pthread_mutex_lock(mutex_); | 
|  | } | 
|  | ~MutexLock() { pthread_mutex_unlock(mutex_); } | 
|  |  | 
|  | private: | 
|  | pthread_mutex_t *mutex_ = nullptr; | 
|  | }; | 
|  |  | 
|  | }  // namespace safestack | 
|  |  | 
|  | #endif  // SAFESTACK_UTIL_H |