| // 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."; | |
| } |