---
# System prepended metadata

title: ScopedClearLastError in base
tags: [Chromium-General, elkurin-daily-note]

---

# ScopedClearLastError in base

baseディレクトリ読みの穴埋めをしていこうの回。

## ScopedClearLastErrorとは何
[ScopedClearLastError](https://source.chromium.org/chromium/chromium/src/+/main:base/scoped_clear_last_error.h)は、errnoを一時的に保存しておくためのScopedオブジェクト。

やることはかんたんで、construct時にerrnoの値を`last_errno_`メンバ変数に格納して`errno`は`0`で上書きし、オブジェクト破壊時にもとの値を復元する。
```cpp
class BASE_EXPORT ScopedClearLastErrorBase {
 public:
  ScopedClearLastErrorBase() : last_errno_(errno) { errno = 0; }
  ~ScopedClearLastErrorBase() { errno = last_errno_; }

 private:
  const int last_errno_;
};
```

### Windows では？
上記のクラスはWindows以外のプラットフォームで使用されている。  
Windows用はScopedClearLastErrorBaseを継承した上で少し違う。

```cpp
ScopedClearLastError::ScopedClearLastError()
    : ScopedClearLastErrorBase(), last_system_error_(GetLastError()) {
  SetLastError(0);
}

ScopedClearLastError::~ScopedClearLastError() {
  SetLastError(last_system_error_);
}
```
[GetLastError](https://learn.microsoft.com/ja-jp/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror)はWindowsプラットフォームでスレッドローカルのエラーコードを取得する。  
一方ScopedClearLastErrorBaseのコンストラクタを呼んでいるのでerrnoも保存している。  
errnoはCの実行時エラーなのでWindowsのエラーとは別に意味を持つ。

## いつつかう？
base::Loggingの中で[`last_error_`](https://source.chromium.org/chromium/chromium/src/+/main:base/logging.h;l=634;drc=1701fd99b91dd2ea8deb3d8744a0bbffc36d02fa)で、ログを出力する際の副作用を回避するためにerrnoを保管している。

今日はここまで。