mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Bug 1278361 - Step 1: Update eintr_wrapper.h to bring in IGNORE_EINTR. r=froydnj
This is based on the current security/sandbox/chromium version of eintr_wrapper.h, taken from upstream commit 937db09514e061d7983e90e0c448cfa61680f605. I've edited it to remove some things that aren't relevant to us: the debug-mode loop limit in HANDLE_EINTR, because we don't seem to be having the problem it's meant to fix and it risks regressions, and references to Fuchsia, which we don't (yet) support. I also kept the original include guards (the file path has changed upstream). What this patch *does* do is add IGNORE_EINTR and modernize the C++ slightly (using decltype instead of nonstandard typeof). MozReview-Commit-ID: BO4uQL9jUtf --HG-- extra : rebase_source : ab3343c6d93e0ce753859217a55af131a0c4ea68
This commit is contained in:
parent
cc0beb7960
commit
ec48124734
@ -1,13 +1,17 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// This provides a wrapper around system calls which may be interrupted by a
|
||||
// signal and return EINTR. See man 7 signal.
|
||||
//
|
||||
// On Windows, this wrapper macro does nothing.
|
||||
// On Windows, this wrapper macro does nothing because there are no
|
||||
// signals.
|
||||
//
|
||||
// Don't wrap close calls in HANDLE_EINTR. Use IGNORE_EINTR if the return
|
||||
// value of close is significant. See http://crbug.com/269623.
|
||||
|
||||
#ifndef BASE_EINTR_WRAPPER_H_
|
||||
#define BASE_EINTR_WRAPPER_H_
|
||||
@ -19,16 +23,28 @@
|
||||
#include <errno.h>
|
||||
|
||||
#define HANDLE_EINTR(x) ({ \
|
||||
typeof(x) __eintr_result__; \
|
||||
decltype(x) eintr_wrapper_result; \
|
||||
do { \
|
||||
__eintr_result__ = x; \
|
||||
} while (__eintr_result__ == -1 && errno == EINTR); \
|
||||
__eintr_result__;\
|
||||
eintr_wrapper_result = (x); \
|
||||
} while (eintr_wrapper_result == -1 && errno == EINTR); \
|
||||
eintr_wrapper_result; \
|
||||
})
|
||||
|
||||
#define IGNORE_EINTR(x) ({ \
|
||||
decltype(x) eintr_wrapper_result; \
|
||||
do { \
|
||||
eintr_wrapper_result = (x); \
|
||||
if (eintr_wrapper_result == -1 && errno == EINTR) { \
|
||||
eintr_wrapper_result = 0; \
|
||||
} \
|
||||
} while (0); \
|
||||
eintr_wrapper_result; \
|
||||
})
|
||||
|
||||
#else
|
||||
|
||||
#define HANDLE_EINTR(x) x
|
||||
#define HANDLE_EINTR(x) (x)
|
||||
#define IGNORE_EINTR(x) (x)
|
||||
|
||||
#endif // OS_POSIX
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user