| // Copyright 2014 The Android Open Source Project |
| // |
| // This software is licensed under the terms of the GNU General Public |
| // License version 2, as published by the Free Software Foundation, and |
| // may be copied, distributed, and modified under those terms. |
| // |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| #ifndef ANDROID_UTILS_SOCKET_DRAINER_H |
| #define ANDROID_UTILS_SOCKET_DRAINER_H |
| |
| #include "android/looper.h" |
| #include "android/utils/compiler.h" |
| |
| ANDROID_BEGIN_HEADER |
| |
| // The following functions are used to manage graceful close of sockets |
| // as described by "The ultimate SO_LINGER page" [1], which requires |
| // several steps to do properly. |
| // |
| // This is really a C wrapper around android/base/sockets/SocketDrainer.h |
| // See the comments in that header for more details. |
| // |
| // To use this header from C code, call the following after creating a |
| // looper: |
| // |
| // socket_drainer_start(looper); |
| // |
| // When a socket needs to be gracefully closed, call the following: |
| // |
| // socket_drainer_drain_and_close(socket_fd); |
| // |
| // After the looper run completes, call the following: |
| // |
| // socket_drainer_stop(); |
| // |
| // Note: socket_drainer_drain_and_close() can be called before |
| // socket_drainer_start() or after socket_drainer_stop(). In those cases |
| // the socket is simply shutdown and closed without receiving all pending |
| // data. |
| |
| void socket_drainer_start(Looper* looper); |
| void socket_drainer_drain_and_close(int socket_fd); |
| void socket_drainer_stop(); |
| |
| ANDROID_END_HEADER |
| |
| #endif // ANDROID_UTILS_SOCKET_DRAINER_H |