• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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  * JDWP internal interfaces.
18  */
19 #ifndef DALVIK_JDWP_JDWPPRIV_H_
20 #define DALVIK_JDWP_JDWPPRIV_H_
21 
22 #define LOG_TAG "jdwp"
23 
24 #include "jdwp/Jdwp.h"
25 #include "jdwp/JdwpEvent.h"
26 #include "Debugger.h"
27 
28 #include <pthread.h>
29 #include <sys/uio.h>
30 
31 /*
32  * JDWP constants.
33  */
34 #define kJDWPHeaderLen  11
35 #define kJDWPFlagReply  0x80
36 
37 /* DDM support */
38 #define kJDWPDdmCmdSet  199     /* 0xc7, or 'G'+128 */
39 #define kJDWPDdmCmd     1
40 
41 
42 /*
43  * Transport-specific network status.
44  */
45 struct JdwpNetState;
46 struct JdwpState;
47 
48 /*
49  * Transport functions.
50  */
51 struct JdwpTransport {
52     bool (*startup)(struct JdwpState* state, const JdwpStartupParams* pParams);
53     bool (*accept)(struct JdwpState* state);
54     bool (*establish)(struct JdwpState* state);
55     void (*close)(struct JdwpState* state);
56     void (*shutdown)(struct JdwpState* state);
57     void (*free)(struct JdwpState* state);
58     bool (*isConnected)(struct JdwpState* state);
59     bool (*awaitingHandshake)(struct JdwpState* state);
60     bool (*processIncoming)(struct JdwpState* state);
61     bool (*sendRequest)(struct JdwpState* state, ExpandBuf* pReq);
62     bool (*sendBufferedRequest)(struct JdwpState* state,
63         const struct iovec* iov, int iovcnt);
64 };
65 
66 const JdwpTransport* dvmJdwpSocketTransport();
67 const JdwpTransport* dvmJdwpAndroidAdbTransport();
68 
69 
70 /*
71  * State for JDWP functions.
72  */
73 struct JdwpState {
74     JdwpStartupParams   params;
75 
76     /* wait for creation of the JDWP thread */
77     pthread_mutex_t threadStartLock;
78     pthread_cond_t  threadStartCond;
79 
80     int             debugThreadStarted;
81     pthread_t       debugThreadHandle;
82     ObjectId        debugThreadId;
83     bool            run;
84 
85     const JdwpTransport*    transport;
86     JdwpNetState*   netState;
87 
88     /* for wait-for-debugger */
89     pthread_mutex_t attachLock;
90     pthread_cond_t  attachCond;
91 
92     /* time of last debugger activity, in milliseconds */
93     s8              lastActivityWhen;
94 
95     /* global counters and a mutex to protect them */
96     u4              requestSerial;
97     u4              eventSerial;
98     pthread_mutex_t serialLock;
99 
100     /*
101      * Events requested by the debugger (breakpoints, class prep, etc).
102      */
103     int             numEvents;      /* #of elements in eventList */
104     JdwpEvent*      eventList;      /* linked list of events */
105     pthread_mutex_t eventLock;      /* guards numEvents/eventList */
106 
107     /*
108      * Synchronize suspension of event thread (to avoid receiving "resume"
109      * events before the thread has finished suspending itself).
110      */
111     pthread_mutex_t eventThreadLock;
112     pthread_cond_t  eventThreadCond;
113     ObjectId        eventThreadId;
114 
115     /*
116      * DDM support.
117      */
118     bool            ddmActive;
119 };
120 
121 /*
122  * Base class for JdwpNetState
123  */
124 class JdwpNetStateBase {
125 public:
126     int             clientSock;     /* active connection to debugger */
127 
128     JdwpNetStateBase();
129     ssize_t writePacket(ExpandBuf* pReply);
130     ssize_t writeBufferedPacket(const struct iovec* iov, int iovcnt);
131 
132 private:
133     pthread_mutex_t socketLock;     /* socket synchronization */
134 };
135 
136 
137 /* reset all session-specific data */
138 void dvmJdwpResetState(JdwpState* state);
139 
140 /* atomic ops to get next serial number */
141 u4 dvmJdwpNextRequestSerial(JdwpState* state);
142 u4 dvmJdwpNextEventSerial(JdwpState* state);
143 
144 /* get current time, in msec */
145 s8 dvmJdwpGetNowMsec(void);
146 
147 
148 /*
149  * Transport functions.
150  */
dvmJdwpNetStartup(JdwpState * state,const JdwpStartupParams * pParams)151 INLINE bool dvmJdwpNetStartup(JdwpState* state,
152     const JdwpStartupParams* pParams)
153 {
154     return (*state->transport->startup)(state, pParams);
155 }
dvmJdwpAcceptConnection(JdwpState * state)156 INLINE bool dvmJdwpAcceptConnection(JdwpState* state) {
157     return (*state->transport->accept)(state);
158 }
dvmJdwpEstablishConnection(JdwpState * state)159 INLINE bool dvmJdwpEstablishConnection(JdwpState* state) {
160     return (*state->transport->establish)(state);
161 }
dvmJdwpCloseConnection(JdwpState * state)162 INLINE void dvmJdwpCloseConnection(JdwpState* state) {
163     (*state->transport->close)(state);
164 }
dvmJdwpNetShutdown(JdwpState * state)165 INLINE void dvmJdwpNetShutdown(JdwpState* state) {
166     (*state->transport->shutdown)(state);
167 }
dvmJdwpNetFree(JdwpState * state)168 INLINE void dvmJdwpNetFree(JdwpState* state) {
169     (*state->transport->free)(state);
170 }
dvmJdwpIsTransportDefined(JdwpState * state)171 INLINE bool dvmJdwpIsTransportDefined(JdwpState* state) {
172     return state != NULL && state->transport != NULL;
173 }
dvmJdwpIsConnected(JdwpState * state)174 INLINE bool dvmJdwpIsConnected(JdwpState* state) {
175     return state != NULL && (*state->transport->isConnected)(state);
176 }
dvmJdwpAwaitingHandshake(JdwpState * state)177 INLINE bool dvmJdwpAwaitingHandshake(JdwpState* state) {
178     return (*state->transport->awaitingHandshake)(state);
179 }
dvmJdwpProcessIncoming(JdwpState * state)180 INLINE bool dvmJdwpProcessIncoming(JdwpState* state) {
181     return (*state->transport->processIncoming)(state);
182 }
dvmJdwpSendRequest(JdwpState * state,ExpandBuf * pReq)183 INLINE bool dvmJdwpSendRequest(JdwpState* state, ExpandBuf* pReq) {
184     return (*state->transport->sendRequest)(state, pReq);
185 }
dvmJdwpSendBufferedRequest(JdwpState * state,const struct iovec * iov,int iovcnt)186 INLINE bool dvmJdwpSendBufferedRequest(JdwpState* state,
187     const struct iovec* iov, int iovcnt)
188 {
189     return (*state->transport->sendBufferedRequest)(state, iov, iovcnt);
190 }
191 
192 #endif  // DALVIK_JDWP_JDWPPRIV_H_
193