Port StorageThreadMsg to GenericChannel (#38932)

This change includes the following additions to GenericChannel:
- Add a GenericSend trait which is meant to replace the `IpcSend` trait
over time, as channels are migrated. For the time being this means, that
we often need to use `GenericSend::send()` to disambiguate from the
`IpcSend::send` function, until all usages of `IpcSend` have been
replaced.
- Add an OpaqueSender impl for GenericSender
- Add a profiled version of GenericChannel. The profiling is 1:1 the
same as for the existing profiled IPC channel, namely that only the
blocked time during `recv` is measured.


Testing: No functional changes, covered by existing tests
Part of #38912

---------

Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This commit is contained in:
Jonathan Schwender 2025-08-27 03:58:43 +02:00 committed by GitHub
parent c4dcd17214
commit 32aba08be7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 113 additions and 27 deletions

View file

@ -14,6 +14,7 @@ use std::sync::{Arc, Mutex, RwLock, Weak};
use std::thread;
use std::time::Duration;
use base::generic_channel::GenericSender;
use base::id::CookieStoreId;
use cookie::Cookie;
use crossbeam_channel::Sender;
@ -112,7 +113,7 @@ pub fn new_resource_threads(
protocols,
);
let idb: IpcSender<IndexedDBThreadMsg> = IndexedDBThreadFactory::new(config_dir.clone());
let storage: IpcSender<StorageThreadMsg> =
let storage: GenericSender<StorageThreadMsg> =
StorageThreadFactory::new(config_dir, mem_profiler_chan);
(
ResourceThreads::new(public_core, storage.clone(), idb.clone()),

View file

@ -7,8 +7,9 @@ use std::collections::{BTreeMap, HashMap};
use std::path::PathBuf;
use std::thread;
use base::generic_channel::{self, GenericReceiver, GenericSender};
use base::id::WebViewId;
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use ipc_channel::ipc::IpcSender;
use malloc_size_of::MallocSizeOf;
use net_traits::storage_thread::{StorageThreadMsg, StorageType};
use profile_traits::mem::{
@ -25,13 +26,13 @@ pub trait StorageThreadFactory {
fn new(config_dir: Option<PathBuf>, mem_profiler_chan: MemProfilerChan) -> Self;
}
impl StorageThreadFactory for IpcSender<StorageThreadMsg> {
impl StorageThreadFactory for GenericSender<StorageThreadMsg> {
/// Create a storage thread
fn new(
config_dir: Option<PathBuf>,
mem_profiler_chan: MemProfilerChan,
) -> IpcSender<StorageThreadMsg> {
let (chan, port) = ipc::channel().unwrap();
) -> GenericSender<StorageThreadMsg> {
let (chan, port) = generic_channel::channel().unwrap();
let chan2 = chan.clone();
thread::Builder::new()
.name("StorageManager".to_owned())
@ -51,14 +52,14 @@ impl StorageThreadFactory for IpcSender<StorageThreadMsg> {
type OriginEntry = (usize, BTreeMap<String, String>);
struct StorageManager {
port: IpcReceiver<StorageThreadMsg>,
port: GenericReceiver<StorageThreadMsg>,
session_data: HashMap<WebViewId, HashMap<String, OriginEntry>>,
local_data: HashMap<String, OriginEntry>,
config_dir: Option<PathBuf>,
}
impl StorageManager {
fn new(port: IpcReceiver<StorageThreadMsg>, config_dir: Option<PathBuf>) -> StorageManager {
fn new(port: GenericReceiver<StorageThreadMsg>, config_dir: Option<PathBuf>) -> StorageManager {
let mut local_data = HashMap::new();
if let Some(ref config_dir) = config_dir {
resource_thread::read_json_from_file(&mut local_data, config_dir, "local_data.json");
@ -224,7 +225,7 @@ impl StorageManager {
fn keys(
&self,
sender: IpcSender<Vec<String>>,
sender: GenericSender<Vec<String>>,
storage_type: StorageType,
webview_id: WebViewId,
url: ServoUrl,