Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update heartbeats-simple dependencies for bug fixes #15458

Merged
merged 4 commits into from Feb 22, 2017

Conversation

@connorimes
Copy link
Contributor

commented Feb 8, 2017

Updates heartbeats-simple dependencies for some bug fixes in native code (primarily for Windows).
Now we create heartbeats as needed so we don't have to maintain a hardcoded list which keeps getting out of sync.


  • ./mach build -d does not report any errors
  • ./mach test-tidy does not report any errors
  • These changes fix #15471 (github issue number if applicable).
  • There are tests for these changes OR
  • These changes do not require tests because it updates a dependency and performs some code maintenance.

This change is Reviewable

@highfive

This comment has been minimized.

Copy link

commented Feb 8, 2017

Heads up! This PR modifies the following files:

  • @fitzgen: components/profile/Cargo.toml, components/profile/heartbeats.rs
@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 8, 2017

Perhaps somebody can answer a Rust question for me as well. For consistency I wanted to transmute the hashmap pointer like so, as is done in at least one place, rather than dereferencing it each time I used it:

let mut hbs: Box<HashMap<ProfilerCategory, Heartbeat>> = mem::transmute(hbs_ptr);

However, when I did this an passed the &mut hbs to maybe_create_heartbeat, I would end up getting an Illegal Instruction deep within the hashmap code. Yet I'm able to (and we already do) operate on a transmuted pointer in the cleanup function without any issues.

FYI, we do this because there are underlying -sys bindings that don't implement Sync and Send, so we can't use lazy_static. I'd of course love it if somebody had a better way than the current approach, but that's for a later PR.

Here's a backtrace for the aforementioned Illegal Instruction - the line numbers won't line up perfectly though:

Stack trace for thread "Time profiler"
stack backtrace:
   0:     0x56151977a1a1 - backtrace::backtrace::libunwind::trace
                        at /local/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.0/src/backtrace/mod.rs:90
                         - backtrace::backtrace::trace<closure>
                        at /local/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.0/src/backtrace/mod.rs:42
   1:     0x561519775164 - backtrace::capture::{{impl}}::new
                        at /local/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.0/src/lib.rs:101
   2:     0x561518993495 - servo::install_crash_handler::handler
                        at /local/servo/ports/servo/main.rs:71
   3:     0x56151da70a13 - AsmJSFaultHandler
                        at /local/servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/7cd72d8/mozjs/js/src/asmjs/WasmSignalHandlers.cpp:1171
   4:     0x7fb6348ad38f - <unknown>
   5:     0x561519299c94 - std::collections::hash::table::{{impl}}::peek<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,&mut std::collections::hash::table::RawTable<profile_traits::time::ProfilerCategory, heartbeats_simple::hbs_pow::HeartbeatPow>>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/table.rs:304
   6:     0x56151922c6b9 - std::collections::hash::map::search_hashed<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,&mut std::collections::hash::table::RawTable<profile_traits::time::ProfilerCategory, heartbeats_simple::hbs_pow::HeartbeatPow>,closure>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/map.rs:383
   7:     0x561519237802 - std::collections::hash::map::{{impl}}::search_mut<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,std::collections::hash::map::RandomState,profile_traits::time::ProfilerCategory>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/map.rs:524
   8:     0x56151923cb5f - std::collections::hash::map::{{impl}}::get_mut<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,std::collections::hash::map::RandomState,profile_traits::time::ProfilerCategory>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/map.rs:1145
   9:     0x5615192a3589 - profile::heartbeats::maybe_heartbeat
                        at /local/servo/components/profile/heartbeats.rs:63
  10:     0x561519243134 - profile::time::{{impl}}::handle_msg
                        at /local/servo/components/profile/time.rs:305
  11:     0x561519242cd0 - profile::time::{{impl}}::start
                        at /local/servo/components/profile/time.rs:292
  12:     0x56151927380b - profile::time::{{impl}}::create::{{closure}}
                        at /local/servo/components/profile/time.rs:185
  13:     0x561519272185 - std::panic::{{impl}}::call_once<(),closure>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panic.rs:296
  14:     0x561519203360 - std::panicking::try::do_call<std::panic::AssertUnwindSafe<closure>,()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:460
  15:     0x56151e69d63a - panic_unwind::__rust_maybe_catch_panic
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libpanic_unwind/lib.rs:98
  16:     0x561519202b6a - std::panicking::try<(),std::panic::AssertUnwindSafe<closure>>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:436
  17:     0x56151925e293 - std::panic::catch_unwind<std::panic::AssertUnwindSafe<closure>,()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panic.rs:361
  18:     0x5615192634b9 - std::thread::{{impl}}::spawn::{{closure}}<closure,()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/thread/mod.rs:357
  19:     0x56151926a006 - alloc::boxed::{{impl}}::call_box<(),closure>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/liballoc/boxed.rs:613
  20:     0x56151e695384 - alloc::boxed::{{impl}}::call_once<(),()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/liballoc/boxed.rs:623
                         - std::sys_common::thread::start_thread
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/sys_common/thread.rs:21
                         - std::sys::imp::thread::{{impl}}::new::thread_start
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/sys/unix/thread.rs:84
  21:     0x7fb6348a36b9 - start_thread
  22:     0x7fb6343c382c - clone
  23:                0x0 - <unknown>
Stack trace for thread "Time profiler"
stack backtrace:
   0:     0x56151977a1a1 - backtrace::backtrace::libunwind::trace
                        at /local/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.0/src/backtrace/mod.rs:90
                         - backtrace::backtrace::trace<closure>
                        at /local/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.0/src/backtrace/mod.rs:42
   1:     0x561519775164 - backtrace::capture::{{impl}}::new
                        at /local/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.0/src/lib.rs:101
   2:     0x561518993495 - servo::install_crash_handler::handler
                        at /local/servo/ports/servo/main.rs:71
   3:     0x7fb6342f24af - <unknown>
   4:     0x56151899357e - servo::install_crash_handler::handler
                        at /local/servo/ports/servo/main.rs:73
   5:     0x56151da70a13 - AsmJSFaultHandler
                        at /local/servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/7cd72d8/mozjs/js/src/asmjs/WasmSignalHandlers.cpp:1171
   6:     0x7fb6348ad38f - <unknown>
   7:     0x561519299c94 - std::collections::hash::table::{{impl}}::peek<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,&mut std::collections::hash::table::RawTable<profile_traits::time::ProfilerCategory, heartbeats_simple::hbs_pow::HeartbeatPow>>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/table.rs:304
   8:     0x56151922c6b9 - std::collections::hash::map::search_hashed<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,&mut std::collections::hash::table::RawTable<profile_traits::time::ProfilerCategory, heartbeats_simple::hbs_pow::HeartbeatPow>,closure>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/map.rs:383
   9:     0x561519237802 - std::collections::hash::map::{{impl}}::search_mut<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,std::collections::hash::map::RandomState,profile_traits::time::ProfilerCategory>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/map.rs:524
  10:     0x56151923cb5f - std::collections::hash::map::{{impl}}::get_mut<profile_traits::time::ProfilerCategory,heartbeats_simple::hbs_pow::HeartbeatPow,std::collections::hash::map::RandomState,profile_traits::time::ProfilerCategory>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/collections/hash/map.rs:1145
  11:     0x5615192a3589 - profile::heartbeats::maybe_heartbeat
                        at /local/servo/components/profile/heartbeats.rs:63
  12:     0x561519243134 - profile::time::{{impl}}::handle_msg
                        at /local/servo/components/profile/time.rs:305
  13:     0x561519242cd0 - profile::time::{{impl}}::start
                        at /local/servo/components/profile/time.rs:292
  14:     0x56151927380b - profile::time::{{impl}}::create::{{closure}}
                        at /local/servo/components/profile/time.rs:185
  15:     0x561519272185 - std::panic::{{impl}}::call_once<(),closure>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panic.rs:296
  16:     0x561519203360 - std::panicking::try::do_call<std::panic::AssertUnwindSafe<closure>,()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:460
  17:     0x56151e69d63a - panic_unwind::__rust_maybe_catch_panic
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libpanic_unwind/lib.rs:98
  18:     0x561519202b6a - std::panicking::try<(),std::panic::AssertUnwindSafe<closure>>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panicking.rs:436
  19:     0x56151925e293 - std::panic::catch_unwind<std::panic::AssertUnwindSafe<closure>,()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/panic.rs:361
  20:     0x5615192634b9 - std::thread::{{impl}}::spawn::{{closure}}<closure,()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/thread/mod.rs:357
  21:     0x56151926a006 - alloc::boxed::{{impl}}::call_box<(),closure>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/liballoc/boxed.rs:613
  22:     0x56151e695384 - alloc::boxed::{{impl}}::call_once<(),()>
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/liballoc/boxed.rs:623
                         - std::sys_common::thread::start_thread
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/sys_common/thread.rs:21
                         - std::sys::imp::thread::{{impl}}::new::thread_start
                        at /buildslave/rust-buildbot/slave/nightly-dist-rustc-linux/build/src/libstd/sys/unix/thread.rs:84
  23:     0x7fb6348a36b9 - start_thread
  24:     0x7fb6343c382c - clone
  25:                0x0 - <unknown>
Illegal instruction (core dumped)
@emilio

This comment has been minimized.

Copy link
Member

commented Feb 8, 2017

let mut hbs: Box<HashMap<ProfilerCategory, Heartbeat>> = mem::transmute(hbs_ptr);

I believe the standard way of doing that is using Box::from_raw and Box::into_raw

@jdm

This comment has been minimized.

Copy link
Member

commented Feb 8, 2017

I suspect that the Box goes out of scope at some point and frees the memory that it points to.

@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 8, 2017

I figured it was something like that but don't understand Rust in enough detail to say for sure. I tried reproducing it with a minimal test program but wasn't able to. I'll check out Box::from_raw and Box::into_raw.

@connorimes connorimes force-pushed the connorimes:hbs-0.4 branch from b37e30b to b5272c2 Feb 8, 2017
@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 8, 2017

I switched to using into_raw and from_raw instead of transmute.

@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 8, 2017

Although we've never had any problems that I'm aware of, I am a little concerned about race conditions in accessing the raw HashMap pointer which is dropped in the cleanup function (esp. now given that from_raw documentation states that it transfers ownership of the pointer). There could potentially be a race condition if some thread is still issuing profiling commands. Due to aforementioned problems with -sys bindings, I can't use lazy_static around the HBS HashMap or put a Mutex in there.

I could create a separate Mutex that is init'd with lazy_static and perform a more classic manual acquisition of the lock where needed. In my local checkout, I implemented this, though had to do something silly to avoid an unused warnings, like performing assert_eq!(*lock, 0); where I would normally release a lock so that the compiler doesn't optimize-out the call. Alternatively I could do a spinlock with an atomic variable. I'm open to suggestions. Thanks.

@Ms2ger

This comment has been minimized.

Copy link
Contributor

commented Feb 9, 2017

I filed #15471 about the preexisting unsynchronized access here.

@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 9, 2017

Thanks @Ms2ger . I can commit a locking strategy as described above to this PR if you want to see it. Unfortunately I don't think I can wrap the Option or pointer in a Mutex though, so it's a manual approach.

@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 10, 2017

I pushed a new commit which adds synchronization using a spinlock. Please comment.

I suspect this would be better done with a function like lock_and_work which could take a closure as an argument and perform locking/unlocking around the closure rather than manually locking/unlocking in the few different functions that require synchronization. However I'm not sure how to do this correctly with my limited Rust as at least one work operation needs to return a value (a bool). I suppose I could have the other work operations return dummy values, but that's kind of dirty and doesn't seem very extensible should we have to introduce a new work routine that returns something other than a bool.

@Ms2ger

This comment has been minimized.

Copy link
Contributor

commented Feb 13, 2017

You can use something like

pub fn foo<F, R>(function: F) -> R
    where F: FnOnce() -> R
{
    lock;
    let result = function();
    unlock;
    result
}
@connorimes connorimes force-pushed the connorimes:hbs-0.4 branch from 88f7a1b to c3fc78c Feb 13, 2017
@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 13, 2017

Thanks @Ms2ger , that's what I'm looking for. I've updated the commit to use that approach. I think this PR is ready for a final review.



static mut HBS: Option<*mut HashMap<ProfilerCategory, Heartbeat>> = None;

// unfortunately can't encompass the actual hashmap in a Mutex (Heartbeat isn't Send/Sync), so we'll use a spinlock
static mut HBS_SPINLOCK: AtomicBool = ATOMIC_BOOL_INIT;

This comment has been minimized.

Copy link
@Ms2ger

Ms2ger Feb 14, 2017

Contributor

This should not need to be mut.

This comment has been minimized.

Copy link
@connorimes

connorimes Feb 14, 2017

Author Contributor

Awesome, that also avoids needing unsafe during lock/unlock. Thanks.

}
lock_and_work(||
unsafe {
HBS = Some(Box::into_raw(hbs));

This comment has been minimized.

Copy link
@Ms2ger

Ms2ger Feb 14, 2017

Contributor

Let's pass &mut HBS to the callback, then the code that uses it can be... more safe.

This comment has been minimized.

Copy link
@connorimes

connorimes Feb 14, 2017

Author Contributor

Can we safely touch HBS like that outside of the locking? Also, are you talking about doing this everywhere we use lock_and_work? My Rust is apparently really rusty - would I need to first define the closure outside of the call to lock_and_work in order to pass &mut HBS to it? Thanks.

This comment has been minimized.

Copy link
@Ms2ger

Ms2ger Feb 14, 2017

Contributor

Something like

fn lock_and_work<F, R>(work: F) -> R
    where F: FnOnce(&mut Option<*mut HashMap<ProfilerCategory, Heartbeat>>) -> R
{
    work(&mut HBS)
}
// unfortunately can't encompass the actual hashmap in a Mutex (Heartbeat isn't Send/Sync), so we'll use a spinlock
static mut HBS_SPINLOCK: AtomicBool = ATOMIC_BOOL_INIT;

fn lock_and_work<F, R>(work: F) -> R where F: FnOnce() -> R {

This comment has been minimized.

Copy link
@emilio

emilio Feb 14, 2017

Member

To enforce that HBS is only used in a sound way you can move the declaration inside this function I believe (or in another module, so it's private to everything except this function), and give it as a parameter to work.

This comment has been minimized.

Copy link
@connorimes

connorimes Feb 14, 2017

Author Contributor

Thanks. I'm trying out this approach which makes sense. However, when trying to assign the global HBS by way of the closure parameter, I get

133 |         lock_and_work(|&mut hbs_opt|
    |                             ------- first assignment to `hbs_opt`
134 |             hbs_opt = Some(Box::into_raw(hbs))
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ re-assignment of immutable variable

The only way I have around this is to move the init and cleanup functions to the private module and still assign HBS directly using an unsafe block. So the old approach works for these two functions, but doesn't completely limit access to HBS to the lock_and_work function, which is what I think we were after. For reference within lock_and_work, I do:

work(&mut HBS)

This comment has been minimized.

Copy link
@emilio

emilio Feb 14, 2017

Member

That code needs to use *hbs_opt, right?

This comment has been minimized.

Copy link
@connorimes

connorimes Feb 14, 2017

Author Contributor

Ah, I was using |&mut hbs_opt| instead of just |hbs_opt| as the closure parameter.

@connorimes connorimes force-pushed the connorimes:hbs-0.4 branch from b4985dd to 0105a2e Feb 14, 2017
@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 14, 2017

Thanks again for the all the feedback (this has turned into way more than the original PR was for). I've pushed a new commit in response to your suggestions.

unsafe {
HBS = Some(Box::into_raw(hbs));
lock_and_work(|hbs_opt|
if (*hbs_opt).is_none() {

This comment has been minimized.

Copy link
@emilio

emilio Feb 14, 2017

Member

nit: You shouldn't need (*hbs_opt), hbs_opt should be enough in this case (the compiler auto-dereferences).

None => None,
}
let hbs_opt_box: Option<Box<HashMap<ProfilerCategory, Heartbeat>>> = lock_and_work(|hbs_opt|
match *hbs_opt {

This comment has been minimized.

Copy link
@emilio

emilio Feb 14, 2017

Member

nit: you can write this as:

unsafe {
    hbs_opt.take().map(Box::from_raw)
}

This comment has been minimized.

Copy link
@connorimes

connorimes Feb 14, 2017

Author Contributor

I see what you're getting at, though that produced an error:

30 |             hbs_opt.take().map(Box::from_raw)
   |                            ^^^ the trait `std::ops::FnOnce<(*mut std::collections::HashMap<profile_traits::time::ProfilerCategory, heartbeats_simple::HeartbeatPow>,)>` is not implemented for `unsafe fn(*mut _) -> std::boxed::Box<_> {<std::boxed::Box<T>><_>::from_raw}`

It works if I give it a closure though:

    let hbs_opt_box: Option<Box<HashMap<ProfilerCategory, Heartbeat>>> = lock_and_work(|hbs_opt|
        hbs_opt.take().map(|hbs_ptr| unsafe {Box::from_raw(hbs_ptr)})
    );

The take documentation seems to support this approach, but it's not obvious to the the layman (me), so I'll double check - you're certain this will set the hbs_opt (and thus HBS) option to None afterward?

This comment has been minimized.

Copy link
@emilio

emilio Feb 14, 2017

Member

Yes, I'm pretty confident that it will do that :)

HBS.map_or(false, |hbs_ptr| (*hbs_ptr).contains_key(category))
}
let is_enabled = lock_and_work(|hbs_opt|
(*hbs_opt).map_or(false, |hbs_ptr|

This comment has been minimized.

Copy link
@emilio

emilio Feb 14, 2017

Member

no need for parens or dereference here.

@connorimes connorimes force-pushed the connorimes:hbs-0.4 branch from 0105a2e to 199f2bb Feb 14, 2017
@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 14, 2017

OK, I cleaned up those lines. I'd still like to verify #15458 (comment) though. Cheers.

@emilio

This comment has been minimized.

Copy link
Member

commented Feb 14, 2017

This looks ok to me, r=me unless @Ms2ger has any more comments?

@bors-servo

This comment has been minimized.

Copy link
Contributor

commented Feb 16, 2017

☔️ The latest upstream changes (presumably #15537) made this pull request unmergeable. Please resolve the merge conflicts.

@connorimes connorimes force-pushed the connorimes:hbs-0.4 branch from 199f2bb to e3b50a1 Feb 16, 2017
@connorimes

This comment has been minimized.

Copy link
Contributor Author

commented Feb 17, 2017

FYI, I rebased yesterday but I guess the S-need-rebase tag doesn't get removed automatically. @Ms2ger did you have any further comments on this PR? Thanks.

@jdm jdm removed the S-needs-rebase label Feb 17, 2017
@bors-servo

This comment has been minimized.

Copy link
Contributor

commented Feb 18, 2017

☔️ The latest upstream changes (presumably #15588) made this pull request unmergeable. Please resolve the merge conflicts.

connorimes added 4 commits Feb 7, 2017
…ing and maintaining heartbeats for profiler categories.

Use consistent variable names.
Use Box::into_raw and Box::from_raw instead of std::mem::transmute.
@connorimes connorimes force-pushed the connorimes:hbs-0.4 branch from e3b50a1 to ab3a3b4 Feb 20, 2017
@Ms2ger

This comment has been minimized.

Copy link
Contributor

commented Feb 22, 2017

@bors-servo r=emilio

@bors-servo

This comment has been minimized.

Copy link
Contributor

commented Feb 22, 2017

📌 Commit ab3a3b4 has been approved by emilio

@bors-servo

This comment has been minimized.

Copy link
Contributor

commented Feb 22, 2017

⌛️ Testing commit ab3a3b4 with merge f2216d7...

bors-servo added a commit that referenced this pull request Feb 22, 2017
Update heartbeats-simple dependencies for bug fixes

<!-- Please describe your changes on the following line: -->

Updates heartbeats-simple dependencies for some bug fixes in native code (primarily for Windows).
Now we create heartbeats as needed so we don't have to maintain a hardcoded list which keeps getting out of sync.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #15471 (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [X] These changes do not require tests because it updates a dependency and performs some code maintenance.

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15458)
<!-- Reviewable:end -->
@bors-servo

This comment has been minimized.

Copy link
Contributor

commented Feb 22, 2017

💔 Test failed - windows-gnu-dev

@larsbergstrom

This comment has been minimized.

Copy link
Contributor

commented Feb 22, 2017

@bors-servo retry

  • Was doing maintenance on failing builder servo-windows2 during this test's run.
bors-servo added a commit that referenced this pull request Feb 22, 2017
Update heartbeats-simple dependencies for bug fixes

<!-- Please describe your changes on the following line: -->

Updates heartbeats-simple dependencies for some bug fixes in native code (primarily for Windows).
Now we create heartbeats as needed so we don't have to maintain a hardcoded list which keeps getting out of sync.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #15471 (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [X] These changes do not require tests because it updates a dependency and performs some code maintenance.

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/15458)
<!-- Reviewable:end -->
@bors-servo

This comment has been minimized.

Copy link
Contributor

commented Feb 22, 2017

⌛️ Testing commit ab3a3b4 with merge 2bfea91...

@bors-servo

This comment has been minimized.

Copy link
Contributor

commented Feb 22, 2017

@bors-servo bors-servo merged commit ab3a3b4 into servo:master Feb 22, 2017
3 checks passed
3 checks passed
continuous-integration/appveyor/pr AppVeyor build succeeded
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details
homu Test successful
Details
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
7 participants
You can’t perform that action at this time.