[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/mac.c,v [EMACS_22_BASE]
From: |
YAMAMOTO Mitsuharu |
Subject: |
[Emacs-diffs] Changes to emacs/src/mac.c,v [EMACS_22_BASE] |
Date: |
Fri, 30 Nov 2007 08:19:36 +0000 |
CVSROOT: /sources/emacs
Module name: emacs
Branch: EMACS_22_BASE
Changes by: YAMAMOTO Mitsuharu <mituharu> 07/11/30 08:19:36
Index: mac.c
===================================================================
RCS file: /sources/emacs/emacs/src/mac.c,v
retrieving revision 1.77.2.3
retrieving revision 1.77.2.4
diff -u -b -r1.77.2.3 -r1.77.2.4
--- mac.c 1 Aug 2007 22:20:41 -0000 1.77.2.3
+++ mac.c 30 Nov 2007 08:19:36 -0000 1.77.2.4
@@ -5009,6 +5009,10 @@
#if SELECT_USE_CFSOCKET
#define SELECT_TIMEOUT_THRESHOLD_RUNLOOP 0.2
+/* Dictionary of file descriptors vs CFSocketRef's allocated in
+ sys_select. */
+static CFMutableDictionaryRef cfsockets_for_select;
+
static void
socket_callback (s, type, address, data, info)
CFSocketRef s;
@@ -5078,6 +5082,43 @@
return 0;
}
+/* Clean up the CFSocket associated with the file descriptor FD in
+ case the same descriptor is used in other threads later. If no
+ CFSocket is associated with FD, then return 0 without closing FD.
+ Otherwise, return 1 with closing FD. */
+
+int
+mac_try_close_socket (fd)
+ int fd;
+{
+#if SELECT_USE_CFSOCKET
+ if (cfsockets_for_select)
+ {
+ void *key = (void *) fd;
+ CFSocketRef socket =
+ (CFSocketRef) CFDictionaryGetValue (cfsockets_for_select, key);
+
+ if (socket)
+ {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
+ CFOptionFlags flags = CFSocketGetSocketFlags (socket);
+
+ if (!(flags & kCFSocketCloseOnInvalidate))
+ CFSocketSetSocketFlags (socket, flags | kCFSocketCloseOnInvalidate);
+#endif
+ BLOCK_INPUT;
+ CFSocketInvalidate (socket);
+ CFDictionaryRemoveValue (cfsockets_for_select, key);
+ UNBLOCK_INPUT;
+
+ return 1;
+ }
+ }
+#endif
+
+ return 0;
+}
+
int
sys_select (nfds, rfds, wfds, efds, timeout)
int nfds;
@@ -5156,6 +5197,11 @@
CFDictionaryCreateMutable (NULL, 0, NULL,
&kCFTypeDictionaryValueCallBacks);
+ if (cfsockets_for_select == NULL)
+ cfsockets_for_select =
+ CFDictionaryCreateMutable (NULL, 0, NULL,
+ &kCFTypeDictionaryValueCallBacks);
+
for (minfd = 1; ; minfd++) /* nfds-1 works as a sentinel. */
if (FD_ISSET (minfd, rfds) || (wfds && FD_ISSET (minfd, wfds)))
break;
@@ -5167,7 +5213,7 @@
CFRunLoopSourceRef source =
(CFRunLoopSourceRef) CFDictionaryGetValue (sources, key);
- if (source == NULL)
+ if (source == NULL || !CFRunLoopSourceIsValid (source))
{
CFSocketRef socket =
CFSocketCreateWithNative (NULL, fd,
@@ -5177,11 +5223,12 @@
if (socket == NULL)
continue;
+ CFDictionarySetValue (cfsockets_for_select, key, socket);
source = CFSocketCreateRunLoopSource (NULL, socket, 0);
CFRelease (socket);
if (source == NULL)
continue;
- CFDictionaryAddValue (sources, key, source);
+ CFDictionarySetValue (sources, key, source);
CFRelease (source);
}
CFRunLoopAddSource (runloop, source, kCFRunLoopDefaultMode);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/src/mac.c,v [EMACS_22_BASE],
YAMAMOTO Mitsuharu <=