blob: 3370e225b2e35decac47a4c680af5f74c1872bac [file] [log] [blame]
Elliott Hughes9f2b1b12010-08-06 18:12:14 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ASYNCHRONOUS_SOCKET_CLOSE_MONITOR_H_included
18#define ASYNCHRONOUS_SOCKET_CLOSE_MONITOR_H_included
19
20#include "ScopedPthreadMutexLock.h"
21#include <pthread.h>
22
23/**
24 * AsynchronousSocketCloseMonitor helps implement Java's asynchronous Socket.close semantics.
25 *
26 * AsynchronousSocketCloseMonitor::init must be called before anything else.
27 *
28 * Every blocking network I/O operation must be surrounded by an AsynchronousSocketCloseMonitor
29 * instance. For example:
30 *
31 * {
32 * AsynchronousSocketCloseMonitor monitor(fd);
33 * byteCount = ::read(fd, buf, sizeof(buf));
34 * }
35 *
36 * To interrupt all threads currently blocked on file descriptor 'fd', call signalBlockedThreads:
37 *
38 * AsynchronousSocketCloseMonitor::signalBlockedThreads(fd);
39 */
40class AsynchronousSocketCloseMonitor {
41public:
42 AsynchronousSocketCloseMonitor(int fd);
43 ~AsynchronousSocketCloseMonitor();
44
45 static void init();
46
47 static void signalBlockedThreads(int fd);
48
49private:
50 AsynchronousSocketCloseMonitor* mPrev;
51 AsynchronousSocketCloseMonitor* mNext;
52 pthread_t mThread;
53 int mFd;
54
55 // Disallow copy and assignment.
56 AsynchronousSocketCloseMonitor(const AsynchronousSocketCloseMonitor&);
57 void operator=(const AsynchronousSocketCloseMonitor&);
58};
59
60#endif // ASYNCHRONOUS_SOCKET_CLOSE_MONITOR_H_included