mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 11:45:37 +00:00
8eff3a166e
Rust's std::sync::Mutex has some nice properties. Its philosphy is to lock data, rather than code. It wraps data you're trying to make thread safe with a mutex, and in order to get a reference to the wrapped data you need to lock the mutex and access it through an intermediate layer. This is good, as the mutex that's protecting access to the data is explicitly associated with the data, and it's impossible to forget to take the lock before accessing the data. This patch adds a similar mutex wrapper to Media Playback code. If it works well, we can look at moving it into xpcom. MozReview-Commit-ID: 4APAic6Fh8m --HG-- extra : rebase_source : 3dc2b4916d3fd31f622af2b0c26ac3c0707d3300
43 lines
939 B
C++
43 lines
939 B
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "gtest/gtest.h"
|
|
#include "mozilla/DataMutex.h"
|
|
#include "nsTArray.h"
|
|
|
|
using mozilla::DataMutex;
|
|
|
|
struct A
|
|
{
|
|
void Set(int a) { mValue = a; }
|
|
int mValue;
|
|
};
|
|
|
|
TEST(DataMutex, Basic)
|
|
{
|
|
{
|
|
DataMutex<uint32_t> i(1, "1");
|
|
auto x = i.Lock();
|
|
*x = 4;
|
|
ASSERT_EQ(*x, 4u);
|
|
}
|
|
{
|
|
DataMutex<A> a({ 4 }, "StructA");
|
|
auto x = a.Lock();
|
|
ASSERT_EQ(x->mValue, 4);
|
|
x->Set(8);
|
|
ASSERT_EQ(x->mValue, 8);
|
|
}
|
|
{
|
|
DataMutex<nsTArray<uint32_t>> _a("array");
|
|
auto a = _a.Lock();
|
|
auto& x = a.ref();
|
|
ASSERT_EQ(x.Length(), 0u);
|
|
x.AppendElement(1u);
|
|
ASSERT_EQ(x.Length(), 1u);
|
|
ASSERT_EQ(x[0], 1u);
|
|
}
|
|
}
|