mirror of
https://github.com/servo/servo.git
synced 2025-06-17 04:44:28 +00:00
The Linux kernel imposes a 15-byte limit on thread names[1]. This means information that does not fit in this limit, e.g., the pipeline ID of layout and script threads, is lost in a debugger and profiler (see the first column of the table below). This commit shortens the thread names used in Servo to maximize the amount of information conveyed. It also rectifies some inconsistencies in the names. | Before | After | |-------------------|-------------------| | `BluetoothThread` | `Bluetooth` | | `CanvasThread` | `Canvas` | | `display alert d` | `AlertDialog` | | `FontCacheThread` | `FontCache` | | `GLPlayerThread` | `GLPlayer` | | `HTML Parser` | `Parse:www.examp` | | `LayoutThread Pi` | `Layout(1,1)` | | `Memory profiler` | `MemoryProfiler` | | `Memory profiler` | `MemoryProfTimer` | | `OfflineAudioCon` | `OfflineACResolv` | | `PullTimelineMar` | `PullTimelineDat` | | `ScriptThread Pi` | `Script(1,1)` | | `WebWorker for h` | `WW:www.example.` | | `ServiceWorker f` | `SW:www.example.` | | `ServiceWorkerMa` | `SvcWorkerManage` | | `Time profiler t` | `TimeProfTimer` | | `Time profiler` | `TimeProfiler` | | `WebGL thread` | `WebGL` | | `Choose a device` | `DevicePicker` | | `Pick a file` | `FilePicker` | | `Pick files` | `FilePicker` | [1]: https://stackoverflow.com/questions/5026531/thread-name-longer-than-15-chars
92 lines
3.3 KiB
Rust
92 lines
3.3 KiB
Rust
/* 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 https://mozilla.org/MPL/2.0/. */
|
|
|
|
use crate::media_channel::{glplayer_channel, GLPlayerSender};
|
|
/// GL player threading API entry point that lives in the
|
|
/// constellation.
|
|
use crate::{GLPlayerMsg, GLPlayerMsgForward};
|
|
use fnv::FnvHashMap;
|
|
use std::sync::{Arc, Mutex};
|
|
use std::thread;
|
|
use webrender_traits::{WebrenderExternalImageRegistry, WebrenderImageHandlerType};
|
|
|
|
/// A GLPlayerThread manages the life cycle and message demultiplexing of
|
|
/// a set of video players with GL render.
|
|
pub struct GLPlayerThread {
|
|
/// Map of live players.
|
|
players: FnvHashMap<u64, GLPlayerSender<GLPlayerMsgForward>>,
|
|
/// List of registered webrender external images.
|
|
/// We use it to get an unique ID for new players.
|
|
external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
|
|
}
|
|
|
|
impl GLPlayerThread {
|
|
pub fn new(external_images: Arc<Mutex<WebrenderExternalImageRegistry>>) -> Self {
|
|
GLPlayerThread {
|
|
players: Default::default(),
|
|
external_images,
|
|
}
|
|
}
|
|
|
|
pub fn start(
|
|
external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
|
|
) -> GLPlayerSender<GLPlayerMsg> {
|
|
let (sender, receiver) = glplayer_channel::<GLPlayerMsg>().unwrap();
|
|
thread::Builder::new()
|
|
.name("GLPlayer".to_owned())
|
|
.spawn(move || {
|
|
let mut renderer = GLPlayerThread::new(external_images);
|
|
loop {
|
|
let msg = receiver.recv().unwrap();
|
|
let exit = renderer.handle_msg(msg);
|
|
if exit {
|
|
return;
|
|
}
|
|
}
|
|
})
|
|
.expect("Thread spawning failed");
|
|
|
|
sender
|
|
}
|
|
|
|
/// Handles a generic GLPlayerMsg message
|
|
#[inline]
|
|
fn handle_msg(&mut self, msg: GLPlayerMsg) -> bool {
|
|
trace!("processing {:?}", msg);
|
|
match msg {
|
|
GLPlayerMsg::RegisterPlayer(sender) => {
|
|
let id = self
|
|
.external_images
|
|
.lock()
|
|
.unwrap()
|
|
.next_id(WebrenderImageHandlerType::Media)
|
|
.0;
|
|
self.players.insert(id, sender.clone());
|
|
sender.send(GLPlayerMsgForward::PlayerId(id)).unwrap();
|
|
},
|
|
GLPlayerMsg::UnregisterPlayer(id) => {
|
|
self.external_images
|
|
.lock()
|
|
.unwrap()
|
|
.remove(&webrender_api::ExternalImageId(id));
|
|
if self.players.remove(&id).is_none() {
|
|
warn!("Tried to remove an unknown player");
|
|
}
|
|
},
|
|
GLPlayerMsg::Lock(id, handler_sender) => {
|
|
self.players.get(&id).map(|sender| {
|
|
sender.send(GLPlayerMsgForward::Lock(handler_sender)).ok();
|
|
});
|
|
},
|
|
GLPlayerMsg::Unlock(id) => {
|
|
self.players.get(&id).map(|sender| {
|
|
sender.send(GLPlayerMsgForward::Unlock()).ok();
|
|
});
|
|
},
|
|
GLPlayerMsg::Exit => return true,
|
|
}
|
|
|
|
false
|
|
}
|
|
}
|