@@ -98,8 +98,15 @@ extern char *osx_cfstring_to_cstring(CFStringRef p_string, bool p_release, bool
9898#include " mcssl.h"
9999
100100#if defined(TARGET_SUBPLATFORM_ANDROID)
101- #include < pthread.h>
102101#include " mblandroidjava.h"
102+ #endif
103+
104+ #if defined(_MAC_DESKTOP) || defined(_LINUX_DESKTOP) || defined(TARGET_SUBPLATFORM_IPHONE) || defined(TARGET_SUBPLATFORM_ANDROID)
105+ #define USE_AUX_THREAD
106+ #endif
107+
108+ #if defined(USE_AUX_THREAD)
109+ #include < pthread.h>
103110
104111static pthread_t s_socket_poll_thread = NULL ;
105112static pthread_mutex_t s_socket_list_mutex;
@@ -134,89 +141,28 @@ extern HANDLE g_socket_wakeup;
134141
135142Boolean MCSocket::sslinited = False;
136143
137- #if defined(_MACOSX) || defined(TARGET_SUBPLATFORM_IPHONE)
138- static void socketCallback (CFSocketRef cfsockref, CFSocketCallBackType type, CFDataRef address, const void *pData, void *pInfo)
139- {
140- uint2 i;
141- int fd = CFSocketGetNative (cfsockref);
142- for (i = 0 ; i < MCnsockets ; i++)
143- {
144- if ( fd == MCsockets[i]->fd && !MCsockets[i]->shared )
145- break ;
146- }
147- if (i < MCnsockets)
148- {
149- fd_set rmaskfd, wmaskfd, emaskfd;
150- FD_ZERO (&rmaskfd);
151- FD_ZERO (&wmaskfd);
152- FD_ZERO (&emaskfd);
153- FD_SET (fd, &rmaskfd);
154- struct timeval t_time = {0 ,0 };
155- select (fd, &rmaskfd, &wmaskfd, &emaskfd, &t_time);
156- switch (type)
157- {
158- case kCFSocketReadCallBack :
159- if (FD_ISSET (fd, &rmaskfd))
160- {
161- MCsockets[i]->readsome ();
162- MCsockets[i]->setselect ();
163- }
164- break ;
165- case kCFSocketWriteCallBack :
166- MCsockets[i]->writesome ();
167- MCsockets[i]->setselect ();
168- break ;
169- case kCFSocketConnectCallBack :
170- MCsockets[i]->writesome ();
171- MCsockets[i]->readsome ();
172- break ;
173- }
174- #ifdef _MACOSX
175- MCPlatformBreakWait ();
176- #else
177- extern void MCIPhoneBreakWait (void );
178- MCIPhoneBreakWait ();
179- #endif
180-
181- }
182- MCS_poll (0.0 ,0 );// quick poll of other sockets
183- }
184- #endif
185-
186- #if defined(_MACOSX) || defined(TARGET_SUBPLATFORM_IPHONE)
187- Boolean MCS_handle_sockets ()
188- {
189- return MCS_poll (0.0 ,0 );
190- }
191- #else
192- Boolean MCS_handle_sockets ()
193- {
194- return True;
195- }
196- #endif
197-
198-
199144static void MCSocketsLockSocketList (void )
200145{
201- #if defined(TARGET_SUBPLATFORM_ANDROID )
146+ #if defined(USE_AUX_THREAD )
202147 if (s_socket_poll_thread != NULL )
203148 pthread_mutex_lock (&s_socket_list_mutex);
204149#endif
205150}
206151
207152static void MCSocketsUnlockSocketList (void )
208153{
209- #if defined(TARGET_SUBPLATFORM_ANDROID )
154+ #if defined(USE_AUX_THREAD )
210155 if (s_socket_poll_thread != NULL )
211156 pthread_mutex_unlock (&s_socket_list_mutex);
212157#endif
213158}
214159
215- #if defined(TARGET_SUBPLATFORM_ANDROID )
160+ #if defined(USE_AUX_THREAD )
216161// MM-2015-07-07: [[ MobileSockets ]] Since on Android we can't hook into system
217162// calls to monitor sockets, we instead have an auxiliary thread that polls the
218163// sockets checking for any activity. If any sockets are pending, a notification
219164// is pushed onto the main thread which will complete the read/write.
165+ // MM-2016-01-27: [[ AuxThread ]] Updated to use the auxiliary thread on all platforms other than Windows.
220166
221167struct MCSocketsHandleFileDescriptorsCallbackContext
222168{
@@ -234,7 +180,9 @@ static void MCSocketsHandleFileDescriptorsCallback(void *p_context)
234180
235181static void *MCSocketsPoll (void *p_arg)
236182{
183+ #if defined(TARGET_SUBPLATFORM_ANDROID)
237184 MCJavaAttachCurrentThread ();
185+ #endif
238186
239187 fd_set rmaskfd, wmaskfd, emaskfd;
240188 int4 maxfd;
@@ -278,7 +226,10 @@ static void *MCSocketsPoll(void *p_arg)
278226 }
279227 }
280228
229+ #if defined(TARGET_SUBPLATFORM_ANDROID)
281230 MCJavaDetachCurrentThread ();
231+ #endif
232+
282233 return NULL ;
283234}
284235#endif
@@ -288,7 +239,7 @@ static bool MCSocketsPollInterrupt(void)
288239 bool t_success;
289240 t_success = true ;
290241
291- #if defined(TARGET_SUBPLATFORM_ANDROID )
242+ #if defined(USE_AUX_THREAD )
292243 if (t_success)
293244 {
294245 if (s_socket_poll_thread == NULL )
@@ -313,7 +264,7 @@ static bool MCSocketsPollInterrupt(void)
313264
314265bool MCSocketsInitialize (void )
315266{
316- #if defined(TARGET_SUBPLATFORM_ANDROID )
267+ #if defined(USE_AUX_THREAD )
317268 s_socket_poll_thread = NULL ;
318269 s_socket_poll_run = false ;
319270#endif
@@ -322,7 +273,7 @@ bool MCSocketsInitialize(void)
322273
323274void MCSocketsFinalize (void )
324275{
325- #if defined(TARGET_SUBPLATFORM_ANDROID )
276+ #if defined(USE_AUX_THREAD )
326277 if (s_socket_poll_thread != NULL )
327278 {
328279 s_socket_poll_run = false ;
@@ -1888,32 +1839,11 @@ void MCSocket::setselect(uint2 sflags)
18881839 WSAEventSelect (fd, g_socket_wakeup, event);
18891840 }
18901841#endif
1891- #if defined(_MACOSX) || defined(TARGET_SUBPLATFORM_IPHONE)
1892- if (sflags & BIONB_TESTWRITE)
1893- CFSocketEnableCallBacks (cfsockref,kCFSocketWriteCallBack );
1894- if (sflags & BIONB_TESTREAD)
1895- CFSocketEnableCallBacks (cfsockref,kCFSocketReadCallBack );
1896- #endif
18971842}
18981843
18991844Boolean MCSocket::init (MCSocketHandle newfd)
19001845{
19011846 fd = newfd;
1902- #if defined(_MACOSX) || defined(TARGET_SUBPLATFORM_IPHONE)
1903-
1904- cfsockref = NULL ;
1905- rlref = NULL ;
1906- cfsockref = CFSocketCreateWithNative (kCFAllocatorDefault ,fd, kCFSocketReadCallBack |kCFSocketWriteCallBack ,
1907- (CFSocketCallBack)&socketCallback, NULL );
1908- if (cfsockref)
1909- {
1910- rlref = CFSocketCreateRunLoopSource (kCFAllocatorDefault , cfsockref, 0 );
1911- // MM-2015-06-04: [[ MobileSockets ]] Make sure we post the callbacks to the main thread (since we run a twin thread set up on iOS)
1912- CFRunLoopAddSource ((CFRunLoopRef) CFRunLoopGetMain (), rlref, kCFRunLoopCommonModes );
1913- CFOptionFlags socketOptions = 0 ;
1914- CFSocketSetSocketFlags ( cfsockref, socketOptions );
1915- }
1916- #endif
19171847 return True;
19181848}
19191849
@@ -1924,15 +1854,6 @@ void MCSocket::close()
19241854 {
19251855 if (secure)
19261856 sslclose ();
1927- #if defined(_MACOSX) || defined(TARGET_SUBPLATFORM_IPHONE)
1928-
1929- if (rlref != NULL )
1930- {
1931- CFRunLoopRemoveSource (CFRunLoopGetCurrent (), rlref, kCFRunLoopDefaultMode );
1932- CFRelease (rlref);
1933- rlref = NULL ;
1934- }
1935- #endif
19361857#if defined(_WINDOWS_DESKTOP) || defined(_WINDOWS_SERVER)
19371858 closesocket (fd);
19381859#else
@@ -1941,16 +1862,6 @@ void MCSocket::close()
19411862#endif
19421863
19431864 fd = 0 ;
1944- #if defined(_MACOSX) || defined(TARGET_SUBPLATFORM_IPHONE)
1945-
1946- if (cfsockref != NULL )
1947- {
1948- CFSocketInvalidate (cfsockref);
1949- CFRelease (cfsockref);
1950- cfsockref = NULL ;
1951- }
1952- #endif
1953-
19541865 }
19551866}
19561867
0 commit comments