| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <lib/syslog/cpp/macros.h> |
| #include <unistd.h> |
| #include <zircon/syscalls.h> |
| #include <zircon/threads.h> |
| |
| // This binary is meant to be a test ground for thread signaling. |
| // The first iteration shows how ZX_THREAD_SUSPENDED and ZX_THREAD_RUNNING |
| // signals are used. |
| // |
| // No code should depends on this, but rather is meant to be a sandox for |
| // zxdb developers. |
| |
| namespace { |
| |
| static constexpr char kBeacon[] = "Counter: Thread running.\n"; |
| |
| // This is the code that the new thread will run. |
| // It's meant to be an eternal loop. |
| int ThreadFunction(void*) { |
| while (true) { |
| // We use write to avoid deadlocking with the outside libc calls. |
| write(1, kBeacon, sizeof(kBeacon)); |
| zx_nanosleep(zx_deadline_after(ZX_SEC(1))); |
| } |
| |
| return 0; |
| } |
| |
| } // namespace |
| |
| int main() { |
| FX_LOGS(INFO) << "****** Creating thread."; |
| |
| thrd_t thread; |
| thrd_create(&thread, ThreadFunction, nullptr); |
| zx_handle_t thread_handle = 0; |
| thread_handle = thrd_get_zx_handle(thread); |
| |
| FX_LOGS(INFO) << "****** Suspending thread."; |
| |
| zx_status_t status; |
| zx_handle_t suspend_token; |
| status = zx_task_suspend(thread_handle, &suspend_token); |
| FX_DCHECK(status == ZX_OK) << "Could not suspend thread: " << status; |
| |
| { |
| zx_signals_t observed; |
| status = zx_object_wait_one(thread_handle, ZX_THREAD_SUSPENDED, zx_deadline_after(ZX_SEC(1)), |
| &observed); |
| FX_DCHECK(status == ZX_OK) << "Could not get suspended signal: " << status; |
| FX_DCHECK((observed & ZX_THREAD_SUSPENDED) != 0); |
| } |
| |
| // Resuming the thread should get a signal. |
| FX_LOGS(INFO) << "****** Resuming thread."; |
| zx_handle_close(suspend_token); |
| { |
| zx_signals_t observed; |
| status = zx_object_wait_one(thread_handle, ZX_THREAD_RUNNING, zx_deadline_after(ZX_SEC(1)), |
| &observed); |
| FX_DCHECK(status == ZX_OK) << "Could not get running signal: " << status; |
| FX_DCHECK((observed & ZX_THREAD_RUNNING) != 0); |
| } |
| |
| FX_LOGS(INFO) << "****** Success."; |
| } |