/* * Copyright (c) 2019 Apple Inc. All rights reserved. * * @APPLE_APACHE_LICENSE_HEADER_START@ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * @APPLE_APACHE_LICENSE_HEADER_END@ */ #include #include #include #include #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #include #elif defined(_WIN32) #include #endif #include #include "dispatch_test.h" #include int main() { dispatch_test_start(NULL); #if defined(_WIN32) dispatch_fd_t readFD, writeFD; if (!CreatePipe((PHANDLE)&readFD, (PHANDLE)&writeFD, NULL, 0)) { test_long("CreatePipe", GetLastError(), ERROR_SUCCESS); test_stop(); _Exit(EXIT_FAILURE); } #else int pipe_fds[2] = { -1, -1 }; int pipe_err = pipe(pipe_fds); int readFD = pipe_fds[0]; int writeFD = pipe_fds[1]; if (pipe_err) { test_errno("pipe", errno, 0); test_stop(); _Exit(EXIT_FAILURE); } #endif printf("readFD=%lld, writeFD=%lld\n", (long long)readFD, (long long)writeFD); dispatch_queue_t q = dispatch_queue_create("q", NULL); dispatch_io_t io = dispatch_io_create(DISPATCH_IO_STREAM, readFD, q, ^(int err) { printf("cleanup, err=%d\n", err); dispatch_test_fd_close(readFD); printf("all done\n"); test_stop(); _Exit(EXIT_SUCCESS); }); dispatch_io_set_low_water(io, 0); dispatch_io_read(io, 0, UINT_MAX, q, ^(bool done, dispatch_data_t data, int err) { printf("read: \%d, %zu, %d\n", done, data == NULL ? 0 : dispatch_data_get_size(data), err); if (data != NULL && dispatch_data_get_size(data) > 0) { // will only happen once printf("closing writeFD\n"); dispatch_test_fd_close(writeFD); dispatch_after(DISPATCH_TIME_NOW + 1, q, ^{ dispatch_io_close(io, 0); }); } }); dispatch_resume(io); printf("writing\n"); dispatch_test_fd_write(writeFD, "x", 1); printf("wrtten\n"); dispatch_main(); }