16d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn/*
26d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * Copyright (C) 2016 The Android Open Source Project
36d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn *
46d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
56d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * you may not use this file except in compliance with the License.
66d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * You may obtain a copy of the License at
76d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn *
86d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
96d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn *
106d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
116d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
126d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * See the License for the specific language governing permissions and
146d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * limitations under the License.
156d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn */
166d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
17facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#ifndef _LIBLOG_PORTABILITY_H__
18facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define _LIBLOG_PORTABILITY_H__
196d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
206d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#include <sys/cdefs.h>
21facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#include <unistd.h>
22facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn
23facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Helpful private sys/cdefs.h like definitions */
246d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
256d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn/* Declare this library function hidden and internal */
266d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#if defined(_WIN32)
276d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#define LIBLOG_HIDDEN
286d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#else
296d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#define LIBLOG_HIDDEN __attribute__((visibility("hidden")))
306d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#endif
316d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
326d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn/* Declare this library function visible and external */
336d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#if defined(_WIN32)
346d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#define LIBLOG_ABI_PUBLIC
356d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#else
366d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#define LIBLOG_ABI_PUBLIC __attribute__((visibility("default")))
376d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#endif
386d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
396d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn/* Declare this library function visible but private */
406d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#define LIBLOG_ABI_PRIVATE LIBLOG_ABI_PUBLIC
416d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
426d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn/*
436d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * Declare this library function as reimplementation.
446d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn * Prevent circular dependencies, but allow _real_ library to hijack
456d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn */
466d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#if defined(_WIN32)
476d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#define LIBLOG_WEAK static /* Accept that it is totally private */
486d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#else
492ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LIBLOG_WEAK __attribute__((weak, visibility("default")))
506d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#endif
516d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
52facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* possible missing definitions in sys/cdefs.h */
53facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn
54facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* DECLS */
55facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#ifndef __BEGIN_DECLS
56facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#if defined(__cplusplus)
572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __BEGIN_DECLS extern "C" {
582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __END_DECLS }
59facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#else
60facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define __BEGIN_DECLS
61facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#define __END_DECLS
62facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif
63facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif
64facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn
656d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn/* Unused argument. For C code only, remove symbol name for C++ */
666d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#ifndef __unused
672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __unused __attribute__((__unused__))
686d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn#endif
696d753faaf8694792433eb78c5c3572efd74a3d54Mark Salyzyn
70facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* possible missing definitions in unistd.h */
71facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn
72facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#ifndef TEMP_FAILURE_RETRY
73facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn/* Used to retry syscalls that can return EINTR. */
742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define TEMP_FAILURE_RETRY(exp)            \
752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ({                                       \
76facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn    __typeof__(exp) _rc;                   \
77facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn    do {                                   \
782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn      _rc = (exp);                         \
79facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn    } while (_rc == -1 && errno == EINTR); \
802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    _rc;                                   \
812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  })
82facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif
83facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn
84facf94c74a2cc44f294c4789d36d5c7281c7bc3fMark Salyzyn#endif /* _LIBLOG_PORTABILITY_H__ */
85