summaryrefslogtreecommitdiffstats
path: root/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'macosx')
-rw-r--r--macosx/Makefile14
-rw-r--r--macosx/README142
-rw-r--r--macosx/Tcl.pbproj/default.pbxuser173
-rw-r--r--macosx/Tcl.pbproj/jingham.pbxuser154
-rw-r--r--macosx/Tcl.pbproj/project.pbxproj354
-rw-r--r--macosx/tclMacOSXBundle.c4
-rw-r--r--macosx/tclMacOSXNotify.c519
7 files changed, 967 insertions, 393 deletions
diff --git a/macosx/Makefile b/macosx/Makefile
index 105ac08..39779db 100644
--- a/macosx/Makefile
+++ b/macosx/Makefile
@@ -4,7 +4,7 @@
# uses the standard unix build system in tcl/unix (which can be used directly instead of this
# if you are not using the tk/macosx projects).
#
-# RCS: @(#) $Id: Makefile,v 1.5.2.13 2005/06/03 08:53:12 das Exp $
+# RCS: @(#) $Id: Makefile,v 1.5.2.14 2005/11/27 02:34:41 das Exp $
#
########################################################################################################
@@ -89,7 +89,7 @@ UNIX_DIR := ${CURDIR}/../unix
VERSION := $(shell awk -F= '/^TCL_VERSION/ {print $$2; nextfile}' ${UNIX_DIR}/configure.in)
TCLSH := tclsh${VERSION}
-BUILD_TARGET := tclsh tcltest
+BUILD_TARGET := all tcltest
INSTALL_TARGET := install
export CPPROG := cp -p
@@ -108,7 +108,7 @@ endif
MAKE_VARS := INSTALL_ROOT INSTALL_TARGETS VERSION GENERIC_FLAGS
MAKE_ARGS_V = $(foreach v,${MAKE_VARS},$v='${$v}')
-build-${PROJECT}: target = ${TARGET}
+build-${PROJECT}: target = ${BUILD_TARGET}
install-${PROJECT}: target = ${INSTALL_TARGET}
clean-${PROJECT} distclean-${PROJECT} test-${PROJECT}: \
target = $*
@@ -121,11 +121,13 @@ DO_MAKE = +${MAKE} -C ${OBJ_DIR} ${target} ${MAKE_ARGS_V} ${MAKE_ARGS} ${EXTRA
${PROJECT}:
${MAKE} install-${PROJECT} INSTALL_ROOT=${OBJ_DIR}/
-${OBJ_DIR}/Makefile: ${UNIX_DIR}/Makefile.in ${UNIX_DIR}/configure
- mkdir -p ${OBJ_DIR} && cd ${OBJ_DIR} && ${UNIX_DIR}/configure \
+${OBJ_DIR}/Makefile: ${UNIX_DIR}/Makefile.in ${UNIX_DIR}/configure \
+ ${UNIX_DIR}/tclConfig.sh.in Tcl-Info.plist.in
+ mkdir -p ${OBJ_DIR} && cd ${OBJ_DIR} && \
+ if [ ${UNIX_DIR}/configure -nt config.status ]; then ${UNIX_DIR}/configure \
--prefix=${PREFIX} --bindir=${BINDIR} --libdir=${LIBDIR} \
--mandir=${MANDIR} --enable-threads --enable-framework \
- ${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS}
+ ${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS}; else ./config.status; fi
build-${PROJECT}: ${OBJ_DIR}/Makefile
${DO_MAKE}
diff --git a/macosx/README b/macosx/README
index 7c0d4ee..46469cb 100644
--- a/macosx/README
+++ b/macosx/README
@@ -1,107 +1,123 @@
-Tcl MacOSX README
+Tcl Mac OS X README
-----------------
-RCS: @(#) $Id: README,v 1.1.2.3 2005/05/24 04:20:08 das Exp $
+RCS: @(#) $Id: README,v 1.1.2.4 2005/11/27 02:34:41 das Exp $
-This is the README file for the Mac OS X native version of Tcl (framework build).
+This is the README file for the Mac OS X/Darwin version of Tcl.
-1. General
-----------
+1. Where to go for support
+--------------------------
-- The tcl-mac mailing list on sourceforge is the canonical place for questions
+- The tcl-mac mailing list on sourceforge is the best place to ask questions
specific to Tcl & Tk on Mac OS X:
http://lists.sourceforge.net/lists/listinfo/tcl-mac
(this page also has a link to searchable archives of the list, please check them
before asking on the list, many questions have already been answered).
-- For general tcl/tk questions, the newsgroup comp.lang.tcl is your best bet,
-but also check the Tcl'ers Wiki for a wealth of information:
- http://wiki.tcl.tk/
+- For general Tcl/Tk questions, the newsgroup comp.lang.tcl is your best bet:
+ http://groups.google.com/group/comp.lang.tcl/
-- The wiki has a page listing known bugs in Mac OS X Tcl/Tk (and other tips)
- http://wiki.tcl.tk/MacOS%20X
-as well as a page with info on building Tcl/Tk on Mac OS X
- http://wiki.tcl.tk/Steps%20to%20build%20Tcl/Tk%208.4.0%20on%20MacOS%20X
+- The Tcl'ers Wiki also has many pages dealing with Tcl & Tk on Mac OS X, see
+ http://wiki.tcl.tk/references/3753!
+ http://wiki.tcl.tk/references/8361!
-- You should report bugs to the sourceforge bug trackers as usual:
- Tcl: https://sourceforge.net/tracker/?func=add&group_id=10894&atid=110894
- Tk: https://sourceforge.net/tracker/?func=add&group_id=12997&atid=112997
-please make sure that your report Tk specific bugs to the tktoolkit bug
-tracker and not the tcl one.
+- Please report bugs with Tcl or Tk on Mac OS X to the sourceforge bug trackers:
+ Tcl: http://sf.net/tracker/?func=add&group_id=10894&atid=110894
+ Tk: http://sf.net/tracker/?func=add&group_id=12997&atid=112997
+please make sure that your report Tk specific bugs to the tktoolkit project bug
+tracker rather than the tcl project bug tracker.
+Mac OS X specific bugs should usually be assigned to 'das' or 'wolfsuit'.
-2. Using Tcl on MacOSX
-----------------------
+2. Using Tcl on Mac OS X
+------------------------
-- Mac OS X 10.2 (or higher) is required to run Tcl on MacOSX.
+- At a minimum, Mac OS X 10.1 is required to run Tcl, but OS X 10.3 or higher is
+recommended (certain [file] operations behave incorrectly on earlier releases).
-- Tcl built on Mac OS X 10.3 or higher will not run on 10.2 due to missing
-symbols in libSystem, however Tcl built on 10.2 will run on 10.3 (but without
-prebinding and other optimizations).
+- Tcl built on Mac OS X 10.x will not run on 10.y for y < x, on the other hand
+Tcl built on 10.y will run on 10.x for y < x (but without any of the fixes and
+optimizations that would be available in a binary built on 10.x).
-- Tcl extensions will be found in any of:
+- Tcl extensions can be installed in any of:
$HOME/Library/Tcl /Library/Tcl /Network/Library/Tcl /System/Library/Tcl
$HOME/Library/Frameworks /Library/Frameworks /Network/Library/Frameworks
/System/Library/Frameworks (searched in that order).
Given a potential package directory $pkg, Tcl on OSX checks for the file
$pkg/Resources/Scripts/pkgIndex.tcl as well as the usual $pkg/pkgIndex.tcl.
-This allows building extensions as frameworks with all script files contained
-in the Resources/Scripts directory of the framework.
+This allows building extensions as frameworks with all script files contained in
+the Resources/Scripts directory of the framework.
-- The Tcl framework contains documentation in html format in the
-standard location for frameworks:
+- [load]able binary extensions can linked as either ordinary shared libraries
+(.dylib) or as MachO bundles (since 8.4.10/8.5a3); only bundles can be unloaded,
+and bundles are also loaded more efficiently from VFS (no temporary copy to the
+native filesystem required).
+
+- The 'deploy' target of macosx/Makefile installs the html manpages into the
+standard documentation location in the Tcl framework:
Tcl.framework/Resources/Documentation/Reference/Tcl
-No manpages are installed by default.
+No nroff manpages are installed by default by the Makefile.
-- the framework Tcl.framework can be placed in any of the system's standard
+- The Tcl framework can be installed in any of the system's standard
framework directories:
$HOME/Library/Frameworks /Library/Frameworks
/Network/Library/Frameworks /System/Library/Frameworks
-and /usr/bin/tclsh will work.
-
-- the format of binary extensions expected by [load] is that of ordinary shared
-libraries (.dylib) and not MachO bundles, at present loading of MachO bundles is
-not supported.
-3. Building Tcl.framework
--------------------------
+3. Building Tcl on Mac OS X
+---------------------------
-- Mac OS X 10.2 (or higher) is required to build Tcl on MacOSX.
-
-- Apple's Developer Tools CD needs to be installed (the most recent version
-matching your OS release, but no earlier than December 2002). This CD should
-have come with Mac OS X retail or should be present as a disk image on new macs
-that came with OSX preinstalled. It can also be downloaded from
+- At least Mac OS X 10.1 is required to build Tcl, and Apple's Developer Tools
+need to be installed (only the most recent version matching your OS release is
+supported). The Developer Tools installer is available on Mac OS X retail disks
+or is present in /Applications/Installers on Macs that came with OS X
+preinstalled. The most recent version can be downloaded from the ADC website
http://connect.apple.com (after you register for free ADC membership).
-- Tcl is built as a Mac OS X framework via the Makefile in tcl/macosx, but can
-but can also be built directly with the standard unix configure and make
-buildsystem in tcl/unix.
-
-- It is still possible to build with Apple's Xcode IDE using the Tcl.pbproj
-project but this is not recommended anymore (currently Tcl.pbproj calls through
-to the tcl/macosx/Makefile so there should be no build differences).
+- Tcl is most easily built as a Mac OS X framework via Makefile in tcl/macosx
+(see below for details), but can also be built with the standard unix configure
+and make buildsystem in tcl/unix as on any other unix platform (indeed, the
+Makefile is just a wrapper around the unix buildsystem).
+The Mac OS X specifc configure flags are --enable-framework and
+--disable-corefoundation (which disables CF and notably reverts to the standard
+select based notifier, you will only need this if your require use of naked fork
+(i.e. not followed by execve) in an unthreaded core).
+
+- It is also possible to build with Apple's IDE via the tcl/macosx/Tcl.pbproj
+project, this simply calls through to the tcl/macosx/GNUMakefile.
+
+- To build universal binaires, set CFLAGS as follows:
+ export CFLAGS="-arch ppc -arch ppc64 -arch i386 \
+ -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4"
+This requires Mac OS X 10.4 and Xcode 2.2 (_not_ Xcode 2.1) and will work on any
+of the architectures (on i386 DTKs, the -isysroot is not required). Note that it
+is not possible to configure correctly if the current architecture is not
+present in CFLAGS (i.e. -arch `arch` must always be there). Universal builds of
+Tcl TEA extensions are also possible with CFLAGS set as above, they will be
+[load]able by universal as well as thin binaries of Tcl.
+
+Detailed Instructions for building with macosx/Makefile
+-------------------------------------------------------
- Unpack the tcl source release archive.
-- The following instructions assume the tcl source tree is named "tcl${ver}",
-where ${ver} is a shell variable containing the tcl version number (for
-example '8.4.2').
+- The following instructions assume the tcl source tree is named "tcl${ver}",
+where ${ver} is a shell variable containing the tcl version number (for example
+'8.4.12').
Setup the shell variable as follows:
- set ver="8.4.2" ;: if your shell is csh
- ver="8.4.2" ;: if your shell is sh
+ set ver="8.4.12" ;: if your shell is csh
+ ver="8.4.12" ;: if your shell is sh
The source tree will be named this way only if you are building from a release
archive, if you are building from CVS, the version numbers will be missing; so
set ${ver} to the empty string instead:
- set ver="" ;: if your shell is csh
- ver="" ;: if your shell is sh
+ set ver="" ;: if your shell is csh
+ ver="" ;: if your shell is sh
-- The following steps will build Tcl from the Terminal, assuming you are
-located in the directory containing the tcl source tree:
+- The following steps will build Tcl from the Terminal, assuming you are located
+in the directory containing the tcl source tree:
make -C tcl${ver}/macosx
-and the following will then install Tcl onto the root volume (admin password
+and the following will then install Tcl onto the root volume (admin password
required):
sudo make -C tcl${ver}/macosx install
if you don't have the admin password, you can install into your home directory,
@@ -109,8 +125,8 @@ instead by passing an INSTALL_ROOT argument to make:
make -C tcl${ver}/macosx install INSTALL_ROOT="${HOME}/"
- The default Makefile targets will build _both_ debug and optimized versions of
-the Tcl framework with the standard convention of naming the debug
-library Tcl.framework/Tcl_debug.
+the Tcl framework with the standard convention of naming the debug library
+Tcl.framework/Tcl_debug.
This allows you to dynamically link to the debug libraries at runtime by setting
setenv DYLD_IMAGE_SUFFIX _debug
(c.f. man dyld for more details)
diff --git a/macosx/Tcl.pbproj/default.pbxuser b/macosx/Tcl.pbproj/default.pbxuser
new file mode 100644
index 0000000..22035d0
--- /dev/null
+++ b/macosx/Tcl.pbproj/default.pbxuser
@@ -0,0 +1,173 @@
+// !$*UTF8*$!
+{
+ 00E2F845016E82EB0ACA28DC = {
+ activeBuildStyle = 00E2F847016E82EB0ACA28DC;
+ activeExecutable = F594E5F1030774B1016F146B;
+ activeTarget = 00E2F84C016E8B780ACA28DC;
+ addToTargets = (
+ );
+ codeSenseManager = F9D167E40610239A0027C147;
+ executables = (
+ F53ACC52031D9AFE016F146B,
+ F594E5F1030774B1016F146B,
+ );
+ sourceControlManager = F9D167E30610239A0027C147;
+ userBuildSettings = {
+ SYMROOT = "${SRCROOT}/../../build/tcl";
+ };
+ };
+ 00E2F84C016E8B780ACA28DC = {
+ activeExec = 0;
+ };
+ F53ACC52031D9AFE016F146B = {
+ activeArgIndex = 2147483647;
+ activeArgIndices = (
+ NO,
+ NO,
+ );
+ argumentStrings = (
+ "${SRCROOT}/../../tcl/tests/all.tcl",
+ "-verbose \"\"",
+ );
+ configStateDict = {
+ "PBXLSLaunchAction-0" = {
+ PBXLSLaunchAction = 0;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXLSRunLaunchConfig;
+ displayName = "Executable Runner";
+ identifier = com.apple.Xcode.launch.runConfig;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ "PBXLSLaunchAction-1" = {
+ PBXLSLaunchAction = 1;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXGDB_LaunchConfig;
+ displayName = GDB;
+ identifier = com.apple.Xcode.launch.GDBMI_Config;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ };
+ cppStopOnCatchEnabled = 0;
+ cppStopOnThrowEnabled = 0;
+ customDataFormattersEnabled = 1;
+ debuggerPlugin = GDBDebugging;
+ disassemblyDisplayState = 0;
+ dylibVariantSuffix = _debug;
+ enableDebugStr = 0;
+ environmentEntries = (
+ {
+ active = YES;
+ name = TCL_LIBRARY;
+ value = "${SRCROOT}/../../tcl/library";
+ },
+ {
+ active = NO;
+ name = DYLD_PRINT_LIBRARIES;
+ },
+ );
+ isa = PBXExecutable;
+ launchableReference = F5C37CF303D5BEDF016F146B;
+ libgmallocEnabled = 0;
+ name = tcltest;
+ shlibInfoDictList = (
+ );
+ sourceDirectories = (
+ );
+ startupPath = "<<ProductDirectory>>";
+ };
+ F594E5F1030774B1016F146B = {
+ activeArgIndex = 2147483647;
+ activeArgIndices = (
+ );
+ argumentStrings = (
+ );
+ configStateDict = {
+ "PBXLSLaunchAction-0" = {
+ PBXLSLaunchAction = 0;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXLSRunLaunchConfig;
+ displayName = "Executable Runner";
+ identifier = com.apple.Xcode.launch.runConfig;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ "PBXLSLaunchAction-1" = {
+ PBXLSLaunchAction = 1;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXGDB_LaunchConfig;
+ displayName = GDB;
+ identifier = com.apple.Xcode.launch.GDBMI_Config;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ };
+ cppStopOnCatchEnabled = 0;
+ cppStopOnThrowEnabled = 0;
+ customDataFormattersEnabled = 1;
+ debuggerPlugin = GDBDebugging;
+ disassemblyDisplayState = 0;
+ dylibVariantSuffix = _debug;
+ enableDebugStr = 0;
+ environmentEntries = (
+ {
+ active = NO;
+ name = DYLD_PRINT_LIBRARIES;
+ },
+ );
+ isa = PBXExecutable;
+ launchableReference = F98F02E608E7EF9A00D0320A;
+ libgmallocEnabled = 0;
+ name = tclsh;
+ shlibInfoDictList = (
+ );
+ sourceDirectories = (
+ );
+ startupPath = "<<ProductDirectory>>";
+ };
+ F5C37CF303D5BEDF016F146B = {
+ isa = PBXFileReference;
+ lastKnownFileType = "compiled.mach-o.executable";
+ path = tcltest;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ F98F02E608E7EF9A00D0320A = {
+ isa = PBXFileReference;
+ lastKnownFileType = "compiled.mach-o.executable";
+ path = tclsh8.4;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ F9D167E30610239A0027C147 = {
+ fallbackIsa = XCSourceControlManager;
+ isSCMEnabled = 0;
+ isa = PBXSourceControlManager;
+ scmConfiguration = {
+ };
+ scmType = scm.cvs;
+ };
+ F9D167E40610239A0027C147 = {
+ indexTemplatePath = "";
+ isa = PBXCodeSenseManager;
+ usesDefaults = 1;
+ wantsCodeCompletion = 1;
+ wantsCodeCompletionAutoSuggestions = 1;
+ wantsCodeCompletionCaseSensitivity = 1;
+ wantsCodeCompletionListAlways = 1;
+ wantsCodeCompletionOnlyMatchingItems = 1;
+ wantsCodeCompletionParametersIncluded = 1;
+ wantsCodeCompletionPlaceholdersInserted = 1;
+ wantsCodeCompletionTabCompletes = 1;
+ wantsIndex = 1;
+ };
+}
diff --git a/macosx/Tcl.pbproj/jingham.pbxuser b/macosx/Tcl.pbproj/jingham.pbxuser
index 10f0b57..22035d0 100644
--- a/macosx/Tcl.pbproj/jingham.pbxuser
+++ b/macosx/Tcl.pbproj/jingham.pbxuser
@@ -2,78 +2,172 @@
{
00E2F845016E82EB0ACA28DC = {
activeBuildStyle = 00E2F847016E82EB0ACA28DC;
- activeExecutable = F9A61CCE04C2B5A8006F5A0B;
+ activeExecutable = F594E5F1030774B1016F146B;
activeTarget = 00E2F84C016E8B780ACA28DC;
- breakpoints = (
+ addToTargets = (
);
+ codeSenseManager = F9D167E40610239A0027C147;
executables = (
- F9A61CCE04C2B5A8006F5A0B,
- F973FC3204852E75006F146B,
+ F53ACC52031D9AFE016F146B,
+ F594E5F1030774B1016F146B,
);
- perUserDictionary = {
- PBXPerProjectTemplateStateSaveDate = 79872121;
- };
- projectwideBuildSettings = {
+ sourceControlManager = F9D167E30610239A0027C147;
+ userBuildSettings = {
SYMROOT = "${SRCROOT}/../../build/tcl";
};
- wantsIndex = 1;
- wantsSCM = -1;
};
00E2F84C016E8B780ACA28DC = {
activeExec = 0;
};
- F973FC3204852E75006F146B = {
+ F53ACC52031D9AFE016F146B = {
activeArgIndex = 2147483647;
activeArgIndices = (
+ NO,
+ NO,
);
argumentStrings = (
+ "${SRCROOT}/../../tcl/tests/all.tcl",
+ "-verbose \"\"",
);
configStateDict = {
+ "PBXLSLaunchAction-0" = {
+ PBXLSLaunchAction = 0;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXLSRunLaunchConfig;
+ displayName = "Executable Runner";
+ identifier = com.apple.Xcode.launch.runConfig;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ "PBXLSLaunchAction-1" = {
+ PBXLSLaunchAction = 1;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXGDB_LaunchConfig;
+ displayName = GDB;
+ identifier = com.apple.Xcode.launch.GDBMI_Config;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
};
+ cppStopOnCatchEnabled = 0;
+ cppStopOnThrowEnabled = 0;
+ customDataFormattersEnabled = 1;
debuggerPlugin = GDBDebugging;
- dylibVariantSuffix = "";
- enableDebugStr = 1;
+ disassemblyDisplayState = 0;
+ dylibVariantSuffix = _debug;
+ enableDebugStr = 0;
environmentEntries = (
+ {
+ active = YES;
+ name = TCL_LIBRARY;
+ value = "${SRCROOT}/../../tcl/library";
+ },
+ {
+ active = NO;
+ name = DYLD_PRINT_LIBRARIES;
+ },
);
isa = PBXExecutable;
- launchableReference = F9A61CCD04C2B5A5006F5A0B;
- name = tclsh8.4;
+ launchableReference = F5C37CF303D5BEDF016F146B;
+ libgmallocEnabled = 0;
+ name = tcltest;
shlibInfoDictList = (
);
sourceDirectories = (
);
+ startupPath = "<<ProductDirectory>>";
};
- F9A61CCD04C2B5A5006F5A0B = {
- isa = PBXFileReference;
- name = tclsh8.4;
- path = ../../build/tcl/tclsh8.4;
- refType = 4;
- };
- F9A61CCE04C2B5A8006F5A0B = {
+ F594E5F1030774B1016F146B = {
activeArgIndex = 2147483647;
activeArgIndices = (
);
argumentStrings = (
);
configStateDict = {
+ "PBXLSLaunchAction-0" = {
+ PBXLSLaunchAction = 0;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXLSRunLaunchConfig;
+ displayName = "Executable Runner";
+ identifier = com.apple.Xcode.launch.runConfig;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
+ "PBXLSLaunchAction-1" = {
+ PBXLSLaunchAction = 1;
+ PBXLSLaunchStartAction = 1;
+ PBXLSLaunchStdioStyle = 2;
+ PBXLSLaunchStyle = 0;
+ class = PBXGDB_LaunchConfig;
+ displayName = GDB;
+ identifier = com.apple.Xcode.launch.GDBMI_Config;
+ remoteHostInfo = "";
+ startActionInfo = "";
+ };
};
+ cppStopOnCatchEnabled = 0;
+ cppStopOnThrowEnabled = 0;
+ customDataFormattersEnabled = 1;
debuggerPlugin = GDBDebugging;
- dylibVariantSuffix = "";
- enableDebugStr = 1;
+ disassemblyDisplayState = 0;
+ dylibVariantSuffix = _debug;
+ enableDebugStr = 0;
environmentEntries = (
+ {
+ active = NO;
+ name = DYLD_PRINT_LIBRARIES;
+ },
);
isa = PBXExecutable;
- launchableReference = F9A61CD104C2B5B4006F5A0B;
- name = tcltest;
+ launchableReference = F98F02E608E7EF9A00D0320A;
+ libgmallocEnabled = 0;
+ name = tclsh;
shlibInfoDictList = (
);
sourceDirectories = (
);
+ startupPath = "<<ProductDirectory>>";
};
- F9A61CD104C2B5B4006F5A0B = {
+ F5C37CF303D5BEDF016F146B = {
isa = PBXFileReference;
- name = tcltest;
- path = ../../build/tcl/tcltest;
- refType = 4;
+ lastKnownFileType = "compiled.mach-o.executable";
+ path = tcltest;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ F98F02E608E7EF9A00D0320A = {
+ isa = PBXFileReference;
+ lastKnownFileType = "compiled.mach-o.executable";
+ path = tclsh8.4;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ F9D167E30610239A0027C147 = {
+ fallbackIsa = XCSourceControlManager;
+ isSCMEnabled = 0;
+ isa = PBXSourceControlManager;
+ scmConfiguration = {
+ };
+ scmType = scm.cvs;
+ };
+ F9D167E40610239A0027C147 = {
+ indexTemplatePath = "";
+ isa = PBXCodeSenseManager;
+ usesDefaults = 1;
+ wantsCodeCompletion = 1;
+ wantsCodeCompletionAutoSuggestions = 1;
+ wantsCodeCompletionCaseSensitivity = 1;
+ wantsCodeCompletionListAlways = 1;
+ wantsCodeCompletionOnlyMatchingItems = 1;
+ wantsCodeCompletionParametersIncluded = 1;
+ wantsCodeCompletionPlaceholdersInserted = 1;
+ wantsCodeCompletionTabCompletes = 1;
+ wantsIndex = 1;
};
}
diff --git a/macosx/Tcl.pbproj/project.pbxproj b/macosx/Tcl.pbproj/project.pbxproj
index 4d2b2ca..7949108 100644
--- a/macosx/Tcl.pbproj/project.pbxproj
+++ b/macosx/Tcl.pbproj/project.pbxproj
@@ -3,9 +3,11 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 38;
+ objectVersion = 39;
objects = {
00E2F845016E82EB0ACA28DC = {
+ buildSettings = {
+ };
buildStyles = (
00E2F847016E82EB0ACA28DC,
00E2F848016E82EB0ACA28DC,
@@ -32,10 +34,9 @@
);
isa = PBXGroup;
refType = 4;
+ sourceTree = "<group>";
};
00E2F847016E82EB0ACA28DC = {
- buildRules = (
- );
buildSettings = {
MAKE_TARGET = develop;
};
@@ -43,8 +44,6 @@
name = Development;
};
00E2F848016E82EB0ACA28DC = {
- buildRules = (
- );
buildSettings = {
MAKE_TARGET = deploy;
};
@@ -53,38 +52,36 @@
};
00E2F84A016E8A830ACA28DC = {
children = (
- F9A61C9D04C2B4E3006F5A0B,
- F53ACC5C031D9D11016F146B,
F53ACC73031DA405016F146B,
+ F53ACC5C031D9D11016F146B,
+ F9A61C9D04C2B4E3006F5A0B,
);
isa = PBXGroup;
name = Products;
refType = 4;
+ sourceTree = "<group>";
};
00E2F84C016E8B780ACA28DC = {
- buildArgumentsString = "-c \"if [ \\\"${ACTION}\\\" != \\\"clean\\\" ]; then if [ \\\"${ACTION}\\\" = \\\"install\\\" ]; then MAKE_ACTION=\"install-\"; fi; else MAKE_ACTION=\"distclean-\"; fi; gnumake \\${MAKE_ACTION:-}${MAKE_TARGET}";
+ buildArgumentsString = "-c \"cd \\\"${TCL_SRCROOT}/macosx\\\" && ACTION=${ACTION} && gnumake \\${ACTION:+\\${ACTION/clean/distclean}-}${MAKE_TARGET} INSTALL_ROOT=\\\"${DSTROOT}\\\" INSTALL_PATH=\\\"${INSTALL_PATH}\\\" PREFIX=\\\"${PREFIX}\\\" BINDIR=\\\"${BINDIR}\\\" MANDIR=\\\"${MANDIR}\\\" \\${EXTRA_MAKE_FLAGS} ${ALL_SETTINGS}\"";
buildPhases = (
);
buildSettings = {
- EXTRA_CONFIGURE_ARGS = "";
- EXTRA_MAKE_ARGS = "";
+ BINDIR = "${PREFIX}/bin";
INSTALL_PATH = /Library/Frameworks;
- INSTALL_ROOT = "${DSTROOT}";
- PREFIX = /usr;
+ MANDIR = "${PREFIX}/man";
+ PREFIX = /usr/local;
PRODUCT_NAME = Tcl;
- SYMROOT = "${SRCROOT}/../../build/tcl";
+ TCL_SRCROOT = "${SRCROOT}/../../tcl";
+ TEMP_DIR = "${PROJECT_TEMP_DIR}";
};
- buildToolPath = /bin/sh;
+ buildToolPath = /bin/bash;
buildWorkingDirectory = "${SRCROOT}";
dependencies = (
);
isa = PBXLegacyTarget;
name = Tcl;
- passBuildSettingsInEnvironment = 1;
+ passBuildSettingsInEnvironment = 0;
productName = Tcl;
- settingsToExpand = 6;
- settingsToPassInEnvironment = 287;
- settingsToPassOnCommandLine = 280;
};
00E2F854016E922C0ACA28DC = {
children = (
@@ -168,6 +165,7 @@
name = Sources;
path = "";
refType = 4;
+ sourceTree = "<group>";
};
00E2F855016E922C0ACA28DC = {
children = (
@@ -177,6 +175,7 @@
isa = PBXGroup;
name = generic;
refType = 4;
+ sourceTree = "<group>";
};
00E2F856016E92B00ACA28DC = {
children = (
@@ -200,6 +199,7 @@
isa = PBXGroup;
name = Headers;
refType = 4;
+ sourceTree = "<group>";
};
00E2F857016E92B00ACA28DC = {
children = (
@@ -209,6 +209,7 @@
isa = PBXGroup;
name = macosx;
refType = 4;
+ sourceTree = "<group>";
};
00E2F858016E92B00ACA28DC = {
children = (
@@ -216,6 +217,7 @@
isa = PBXGroup;
name = Headers;
refType = 4;
+ sourceTree = "<group>";
};
00E2F859016E92B00ACA28DC = {
children = (
@@ -224,6 +226,7 @@
isa = PBXGroup;
name = Sources;
refType = 4;
+ sourceTree = "<group>";
};
00E2F85A016E92B00ACA28DC = {
children = (
@@ -233,6 +236,7 @@
isa = PBXGroup;
name = unix;
refType = 4;
+ sourceTree = "<group>";
};
00E2F85B016E92B00ACA28DC = {
children = (
@@ -242,6 +246,7 @@
isa = PBXGroup;
name = Headers;
refType = 4;
+ sourceTree = "<group>";
};
00E2F85C016E92B00ACA28DC = {
children = (
@@ -264,6 +269,7 @@
isa = PBXGroup;
name = Sources;
refType = 4;
+ sourceTree = "<group>";
};
//000
//001
@@ -284,51 +290,64 @@
isa = PBXGroup;
name = "Build System";
refType = 4;
+ sourceTree = "<group>";
};
F5306CA003CAC9AE016F146B = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = text;
name = ChangeLog;
path = ../ChangeLog;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5306CA103CAC9DE016F146B = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = text.script.sh;
name = configure.in;
path = ../unix/configure.in;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5306CA203CAC9DE016F146B = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = text;
name = Makefile.in;
path = ../unix/Makefile.in;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5306CA303CAC9DE016F146B = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = tcl.m4;
path = ../unix/tcl.m4;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F53ACC5C031D9D11016F146B = {
- isa = PBXExecutableFileReference;
- name = tclsh8.4;
- path = ../../build/tcl/tclsh8.4;
- refType = 2;
+ isa = PBXFileReference;
+ lastKnownFileType = "compiled.mach-o.executable";
+ path = tclsh8.4;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
};
F53ACC73031DA405016F146B = {
- isa = PBXExecutableFileReference;
- name = tcltest;
- path = ../../build/tcl/tcltest;
- refType = 2;
+ isa = PBXFileReference;
+ lastKnownFileType = "compiled.mach-o.executable";
+ path = tcltest;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
};
F5A1836F018242A501DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
path = tclMacOSXBundle.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5C88655017D604601DC9062 = {
children = (
@@ -339,780 +358,1003 @@
isa = PBXGroup;
name = "Header Tools";
refType = 4;
+ sourceTree = "<group>";
};
F5C88656017D604601DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = genStubs.tcl;
path = ../tools/genStubs.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5C88657017D60C901DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = tcl.decls;
path = ../generic/tcl.decls;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5C88658017D60C901DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = tclInt.decls;
path = ../generic/tclInt.decls;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F6B016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = regcustom.h;
path = ../generic/regcustom.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F6C016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = regerrs.h;
path = ../generic/regerrs.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F6D016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = regguts.h;
path = ../generic/regguts.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F6E016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tcl.h;
path = ../generic/tcl.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F6F016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclCompile.h;
path = ../generic/tclCompile.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F70016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclDecls.h;
path = ../generic/tclDecls.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F71016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclInitScript.h;
path = ../generic/tclInitScript.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F72016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclInt.h;
path = ../generic/tclInt.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F73016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclIntDecls.h;
path = ../generic/tclIntDecls.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F74016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclIntPlatDecls.h;
path = ../generic/tclIntPlatDecls.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F75016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclIO.h;
path = ../generic/tclIO.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F76016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclMath.h;
path = ../generic/tclMath.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F77016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclPlatDecls.h;
path = ../generic/tclPlatDecls.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F78016ECAA401DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclRegexp.h;
path = ../generic/tclRegexp.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F87016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regc_color.c;
path = ../generic/regc_color.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F88016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regc_cvec.c;
path = ../generic/regc_cvec.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F89016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regc_lex.c;
path = ../generic/regc_lex.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F8A016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regc_locale.c;
path = ../generic/regc_locale.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F8B016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regc_nfa.c;
path = ../generic/regc_nfa.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F8C016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regcomp.c;
path = ../generic/regcomp.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F8D016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = rege_dfa.c;
path = ../generic/rege_dfa.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F8E016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regerror.c;
path = ../generic/regerror.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F8F016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regexec.c;
path = ../generic/regexec.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F90016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regfree.c;
path = ../generic/regfree.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F91016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = regfronts.c;
path = ../generic/regfronts.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F92016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclAlloc.c;
path = ../generic/tclAlloc.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F93016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclAsync.c;
path = ../generic/tclAsync.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F94016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclBasic.c;
path = ../generic/tclBasic.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F95016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclBinary.c;
path = ../generic/tclBinary.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F96016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclCkalloc.c;
path = ../generic/tclCkalloc.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F97016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclClock.c;
path = ../generic/tclClock.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F98016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclCmdAH.c;
path = ../generic/tclCmdAH.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F99016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclCmdIL.c;
path = ../generic/tclCmdIL.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F9A016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclCmdMZ.c;
path = ../generic/tclCmdMZ.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F9B016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclCompCmds.c;
path = ../generic/tclCompCmds.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F9C016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclCompExpr.c;
path = ../generic/tclCompExpr.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F9D016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclCompile.c;
path = ../generic/tclCompile.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F9E016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclDate.c;
path = ../generic/tclDate.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24F9F016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclEncoding.c;
path = ../generic/tclEncoding.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA0016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclEnv.c;
path = ../generic/tclEnv.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA1016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclEvent.c;
path = ../generic/tclEvent.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA2016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclExecute.c;
path = ../generic/tclExecute.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA3016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclFCmd.c;
path = ../generic/tclFCmd.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA4016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclFileName.c;
path = ../generic/tclFileName.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA5016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclGet.c;
path = ../generic/tclGet.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA6016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclHash.c;
path = ../generic/tclHash.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA7016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclHistory.c;
path = ../generic/tclHistory.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA8016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclIndexObj.c;
path = ../generic/tclIndexObj.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FA9016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclInterp.c;
path = ../generic/tclInterp.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FAA016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclIO.c;
path = ../generic/tclIO.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FAB016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclIOCmd.c;
path = ../generic/tclIOCmd.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FAC016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclIOGT.c;
path = ../generic/tclIOGT.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FAD016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclIOSock.c;
path = ../generic/tclIOSock.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FAE016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclIOUtil.c;
path = ../generic/tclIOUtil.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FAF016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclLink.c;
path = ../generic/tclLink.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB0016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclListObj.c;
path = ../generic/tclListObj.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB1016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclLiteral.c;
path = ../generic/tclLiteral.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB2016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclLoad.c;
path = ../generic/tclLoad.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB3016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclLoadNone.c;
path = ../generic/tclLoadNone.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB4016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclMain.c;
path = ../generic/tclMain.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB5016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclNamesp.c;
path = ../generic/tclNamesp.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB6016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclNotify.c;
path = ../generic/tclNotify.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB7016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclObj.c;
path = ../generic/tclObj.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB8016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclPanic.c;
path = ../generic/tclPanic.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FB9016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclParse.c;
path = ../generic/tclParse.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FBA016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclParseExpr.c;
path = ../generic/tclParseExpr.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FBB016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclPipe.c;
path = ../generic/tclPipe.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FBC016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclPosixStr.c;
path = ../generic/tclPosixStr.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FBD016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclPreserve.c;
path = ../generic/tclPreserve.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FBE016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclProc.c;
path = ../generic/tclProc.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FBF016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclRegexp.c;
path = ../generic/tclRegexp.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC0016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclResolve.c;
path = ../generic/tclResolve.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC1016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclResult.c;
path = ../generic/tclResult.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC2016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclScan.c;
path = ../generic/tclScan.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC3016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclStringObj.c;
path = ../generic/tclStringObj.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC4016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclStubInit.c;
path = ../generic/tclStubInit.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC5016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclStubLib.c;
path = ../generic/tclStubLib.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC6016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclTest.c;
path = ../generic/tclTest.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC7016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclTestObj.c;
path = ../generic/tclTestObj.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC8016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclTestProcBodyObj.c;
path = ../generic/tclTestProcBodyObj.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FC9016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclThread.c;
path = ../generic/tclThread.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FCA016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclThreadJoin.c;
path = ../generic/tclThreadJoin.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FCB016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclThreadTest.c;
path = ../generic/tclThreadTest.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FCC016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclTimer.c;
path = ../generic/tclTimer.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FCD016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUniData.c;
path = ../generic/tclUniData.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FCE016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUtf.c;
path = ../generic/tclUtf.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FCF016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUtil.c;
path = ../generic/tclUtil.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD0016ECAFC01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclVar.c;
path = ../generic/tclVar.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD1016ECB1E01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = regex.h;
path = ../generic/regex.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD2016ECB1E01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclPort.h;
path = ../generic/tclPort.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD3016ECB4901DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclPkg.c;
path = ../generic/tclPkg.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD6016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclUnixPort.h;
path = ../unix/tclUnixPort.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD7016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
name = tclUnixThrd.h;
path = ../unix/tclUnixThrd.h;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD8016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclAppInit.c;
path = ../unix/tclAppInit.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FD9016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclLoadDyld.c;
path = ../unix/tclLoadDyld.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FDB016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixChan.c;
path = ../unix/tclUnixChan.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FDC016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixEvent.c;
path = ../unix/tclUnixEvent.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FDD016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixFCmd.c;
path = ../unix/tclUnixFCmd.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FDE016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixFile.c;
path = ../unix/tclUnixFile.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FDF016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixInit.c;
path = ../unix/tclUnixInit.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE0016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixNotfy.c;
path = ../unix/tclUnixNotfy.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE1016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixPipe.c;
path = ../unix/tclUnixPipe.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE2016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixSock.c;
path = ../unix/tclUnixSock.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE3016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixTest.c;
path = ../unix/tclUnixTest.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE4016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixThrd.c;
path = ../unix/tclUnixThrd.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE5016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclUnixTime.c;
path = ../unix/tclUnixTime.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE6016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclXtNotify.c;
path = ../unix/tclXtNotify.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FE7016ECC0F01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.c;
name = tclXtTest.c;
path = ../unix/tclXtTest.c;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FEE016ED0DF01DC9062 = {
children = (
@@ -1137,117 +1379,152 @@
isa = PBXGroup;
name = Scripts;
refType = 4;
+ sourceTree = "<group>";
};
F5F24FEF016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = auto.tcl;
path = ../library/auto.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FF0016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = dde;
path = ../library/dde;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FF3016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = encoding;
path = ../library/encoding;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FF4016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = history.tcl;
path = ../library/history.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FF5016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = http;
path = ../library/http;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FF6016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = http1.0;
path = ../library/http1.0;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FFA016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = init.tcl;
path = ../library/init.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FFB016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = ldAout.tcl;
path = ../library/ldAout.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FFC016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = msgcat;
path = ../library/msgcat;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F24FFE016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = opt;
path = ../library/opt;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F25001016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = package.tcl;
path = ../library/package.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F25002016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = parray.tcl;
path = ../library/parray.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F25003016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = reg;
path = ../library/reg;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F25005016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = safe.tcl;
path = ../library/safe.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F25007016ED0DF01DC9062 = {
fileEncoding = 5;
isa = PBXFileReference;
+ lastKnownFileType = text;
name = tclIndex;
path = ../library/tclIndex;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F25008016ED0DF01DC9062 = {
includeInIndex = 0;
- isa = PBXFolderReference;
+ isa = PBXFileReference;
+ lastKnownFileType = folder;
name = tcltest;
path = ../library/tcltest;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
F5F2500A016ED0DF01DC9062 = {
isa = PBXFileReference;
+ lastKnownFileType = text;
name = word.tcl;
path = ../library/word.tcl;
refType = 2;
+ sourceTree = SOURCE_ROOT;
};
//F50
//F51
@@ -1260,10 +1537,11 @@
//F93
//F94
F9A61C9D04C2B4E3006F5A0B = {
- isa = PBXFrameworkReference;
- name = Tcl.framework;
- path = ../../build/tcl/Tcl.framework;
- refType = 2;
+ explicitFileType = wrapper.framework;
+ isa = PBXFileReference;
+ path = Tcl.framework;
+ refType = 3;
+ sourceTree = BUILT_PRODUCTS_DIR;
};
};
rootObject = 00E2F845016E82EB0ACA28DC;
diff --git a/macosx/tclMacOSXBundle.c b/macosx/tclMacOSXBundle.c
index 75b871c..28e4977 100644
--- a/macosx/tclMacOSXBundle.c
+++ b/macosx/tclMacOSXBundle.c
@@ -51,13 +51,13 @@
* license.
*/
+#include "tclPort.h"
+
#ifdef HAVE_COREFOUNDATION
#include <CoreFoundation/CoreFoundation.h>
#include <mach-o/dyld.h>
#endif /* HAVE_COREFOUNDATION */
-#include "tcl.h"
-
/*
*----------------------------------------------------------------------
*
diff --git a/macosx/tclMacOSXNotify.c b/macosx/tclMacOSXNotify.c
index 898d075..cd09ccf 100644
--- a/macosx/tclMacOSXNotify.c
+++ b/macosx/tclMacOSXNotify.c
@@ -1,25 +1,25 @@
/*
* tclMacOSXNotify.c --
*
- * This file contains the implementation of a merged
- * CFRunLoop/select-based notifier, which is the lowest-level part
- * of the Tcl event loop. This file works together with
- * generic/tclNotify.c.
+ * This file contains the implementation of a merged CFRunLoop/select()
+ * based notifier, which is the lowest-level part of the Tcl event loop.
+ * This file works together with generic/tclNotify.c.
*
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
- * Copyright 2005, Tcl Core Team.
+ * Copyright (c) 2005 Tcl Core Team.
+ * Copyright (c) 2005 Daniel A. Steffen <das@users.sourceforge.net>
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclMacOSXNotify.c,v 1.1.2.4 2005/05/20 02:50:36 das Exp $
+ * RCS: @(#) $Id: tclMacOSXNotify.c,v 1.1.2.5 2005/11/27 02:34:41 das Exp $
*/
-#ifdef HAVE_COREFOUNDATION /* Traditional unix select-based notifier
- * is in tclUnixNotfy.c */
#include "tclInt.h"
#include "tclPort.h"
+#ifdef HAVE_COREFOUNDATION /* Traditional unix select-based notifier is
+ * in tclUnixNotfy.c */
#include <CoreFoundation/CoreFoundation.h>
#include <pthread.h>
@@ -27,42 +27,41 @@ extern TclStubs tclStubs;
extern Tcl_NotifierProcs tclOriginalNotifier;
/*
- * This structure is used to keep track of the notifier info for a
- * a registered file.
+ * This structure is used to keep track of the notifier info for a registered
+ * file.
*/
typedef struct FileHandler {
int fd;
int mask; /* Mask of desired events: TCL_READABLE,
* etc. */
- int readyMask; /* Mask of events that have been seen since the
- * last time file handlers were invoked for
- * this file. */
- Tcl_FileProc *proc; /* Procedure to call, in the style of
+ int readyMask; /* Mask of events that have been seen since
+ * the last time file handlers were invoked
+ * for this file. */
+ Tcl_FileProc *proc; /* Function to call, in the style of
* Tcl_CreateFileHandler. */
ClientData clientData; /* Argument to pass to proc. */
struct FileHandler *nextPtr;/* Next in list of all files we care about. */
} FileHandler;
/*
- * The following structure is what is added to the Tcl event queue when
- * file handlers are ready to fire.
+ * The following structure is what is added to the Tcl event queue when file
+ * handlers are ready to fire.
*/
typedef struct FileHandlerEvent {
- Tcl_Event header; /* Information that is standard for
- * all events. */
- int fd; /* File descriptor that is ready. Used
- * to find the FileHandler structure for
- * the file (can't point directly to the
- * FileHandler structure because it could
- * go away while the event is queued). */
+ Tcl_Event header; /* Information that is standard for all
+ * events. */
+ int fd; /* File descriptor that is ready. Used to find
+ * the FileHandler structure for the file
+ * (can't point directly to the FileHandler
+ * structure because it could go away while
+ * the event is queued). */
} FileHandlerEvent;
/*
- *
- * The following structure contains a set of select() masks to track
- * readable, writable, and exceptional conditions.
+ * The following structure contains a set of select() masks to track readable,
+ * writable, and exceptional conditions.
*/
typedef struct SelectMasks {
@@ -73,49 +72,50 @@ typedef struct SelectMasks {
/*
* The following static structure contains the state information for the
- * select based implementation of the Tcl notifier. One of these structures
- * is created for each thread that is using the notifier.
+ * select based implementation of the Tcl notifier. One of these structures is
+ * created for each thread that is using the notifier.
*/
typedef struct ThreadSpecificData {
FileHandler *firstFileHandlerPtr;
/* Pointer to head of file handler list. */
-
- SelectMasks checkMasks; /* This structure is used to build up the masks
- * to be used in the next call to select.
- * Bits are set in response to calls to
- * Tcl_CreateFileHandler. */
+ SelectMasks checkMasks; /* This structure is used to build up the
+ * masks to be used in the next call to
+ * select. Bits are set in response to calls
+ * to Tcl_CreateFileHandler. */
SelectMasks readyMasks; /* This array reflects the readable/writable
* conditions that were found to exist by the
* last call to select. */
- int numFdBits; /* Number of valid bits in checkMasks
- * (one more than highest fd for which
+ int numFdBits; /* Number of valid bits in checkMasks (one
+ * more than highest fd for which
* Tcl_WatchFile has been called). */
int onList; /* True if it is in this list */
- unsigned int pollState; /* pollState is used to implement a polling
+ unsigned int pollState; /* pollState is used to implement a polling
* handshake between each thread and the
* notifier thread. Bits defined below. */
struct ThreadSpecificData *nextPtr, *prevPtr;
- /* All threads that are currently waiting on
+ /* All threads that are currently waiting on
* an event have their ThreadSpecificData
* structure on a doubly-linked listed formed
- * from these pointers. You must hold the
+ * from these pointers. You must hold the
* notifierLock before accessing these
* fields. */
CFRunLoopSourceRef runLoopSource;
- /* Any other thread alerts a notifier
- * that an event is ready to be processed
- * by signaling this CFRunLoopSource. */
- CFRunLoopRef runLoop; /* This thread's CFRunLoop, needs to be woken
- * up whenever the runLoopSource is signaled. */
- int eventReady; /* True if an event is ready to be processed. */
+ /* Any other thread alerts a notifier that an
+ * event is ready to be processed by signaling
+ * this CFRunLoopSource. */
+ CFRunLoopRef runLoop; /* This thread's CFRunLoop, needs to be woken
+ * up whenever the runLoopSource is
+ * signaled. */
+ int eventReady; /* True if an event is ready to be
+ * processed. */
} ThreadSpecificData;
static Tcl_ThreadDataKey dataKey;
/*
- * The following static indicates the number of threads that have
- * initialized notifiers.
+ * The following static indicates the number of threads that have initialized
+ * notifiers.
*
* You must hold the notifierInitLock before accessing this variable.
*/
@@ -123,9 +123,9 @@ static Tcl_ThreadDataKey dataKey;
static int notifierCount = 0;
/*
- * The following variable points to the head of a doubly-linked list of
- * of ThreadSpecificData structures for all threads that are currently
- * waiting on an event.
+ * The following variable points to the head of a doubly-linked list of
+ * ThreadSpecificData structures for all threads that are currently waiting on
+ * an event.
*
* You must hold the notifierLock before accessing this list.
*/
@@ -133,16 +133,15 @@ static int notifierCount = 0;
static ThreadSpecificData *waitingListPtr = NULL;
/*
- * The notifier thread spends all its time in select() waiting for a
- * file descriptor associated with one of the threads on the waitingListPtr
- * list to do something interesting. But if the contents of the
- * waitingListPtr list ever changes, we need to wake up and restart
- * the select() system call. You can wake up the notifier thread by
- * writing a single byte to the file descriptor defined below. This
- * file descriptor is the input-end of a pipe and the notifier thread is
- * listening for data on the output-end of the same pipe. Hence writing
- * to this file descriptor will cause the select() system call to return
- * and wake up the notifier thread.
+ * The notifier thread spends all its time in select() waiting for a file
+ * descriptor associated with one of the threads on the waitingListPtr list to
+ * do something interesting. But if the contents of the waitingListPtr list
+ * ever changes, we need to wake up and restart the select() system call. You
+ * can wake up the notifier thread by writing a single byte to the file
+ * descriptor defined below. This file descriptor is the input-end of a pipe
+ * and the notifier thread is listening for data on the output-end of the same
+ * pipe. Hence writing to this file descriptor will cause the select() system
+ * call to return and wake up the notifier thread.
*
* You must hold the notifierLock lock before writing to the pipe.
*/
@@ -152,55 +151,64 @@ static int receivePipe = -1; /* Output end of triggerPipe */
/*
* We use Darwin-native spinlocks instead of pthread mutexes for notifier
- * locking: this radically simplifies the implementation and lowers
- * overhead. Note that these are not pure spinlocks, they employ various
- * strategies to back off, making them immune to most priority-inversion
- * livelocks (c.f. man 3 OSSpinLockLock).
+ * locking: this radically simplifies the implementation and lowers overhead.
+ * Note that these are not pure spinlocks, they employ various strategies to
+ * back off, making them immune to most priority-inversion livelocks (c.f. man
+ * 3 OSSpinLockLock).
*/
#if defined(HAVE_LIBKERN_OSATOMIC_H) && defined(HAVE_OSSPINLOCKLOCK)
-/* Use OSSpinLock API where available (Tiger or later) */
+/*
+ * Use OSSpinLock API where available (Tiger or later).
+ */
+
#include <libkern/OSAtomic.h>
+
#else
-/* Otherwise, use commpage spinlock SPI directly */
+/*
+ * Otherwise, use commpage spinlock SPI directly.
+ */
+
typedef uint32_t OSSpinLock;
-extern void _spin_lock(OSSpinLock *lock);
-extern void _spin_unlock(OSSpinLock *lock);
-#define OSSpinLockLock(p) _spin_lock(p)
-#define OSSpinLockUnlock(p) _spin_unlock(p)
-#endif
+extern void _spin_lock(OSSpinLock *lock);
+extern void _spin_unlock(OSSpinLock *lock);
+#define OSSpinLockLock(p) _spin_lock(p)
+#define OSSpinLockUnlock(p) _spin_unlock(p)
+
+#endif /* HAVE_LIBKERN_OSATOMIC_H && HAVE_OSSPINLOCKLOCK */
/*
- * These spinlocks lock access to the global notifier state.
+ * These spinlocks lock access to the global notifier state.
*/
static OSSpinLock notifierInitLock = 0;
static OSSpinLock notifierLock = 0;
-/*
+/*
* Macros abstracting notifier locking/unlocking
*/
-#define LOCK_NOTIFIER_INIT OSSpinLockLock(&notifierInitLock)
-#define UNLOCK_NOTIFIER_INIT OSSpinLockUnlock(&notifierInitLock)
-#define LOCK_NOTIFIER OSSpinLockLock(&notifierLock)
-#define UNLOCK_NOTIFIER OSSpinLockUnlock(&notifierLock)
+#define LOCK_NOTIFIER_INIT OSSpinLockLock(&notifierInitLock)
+#define UNLOCK_NOTIFIER_INIT OSSpinLockUnlock(&notifierInitLock)
+#define LOCK_NOTIFIER OSSpinLockLock(&notifierLock)
+#define UNLOCK_NOTIFIER OSSpinLockUnlock(&notifierLock)
/*
* The pollState bits
* POLL_WANT is set by each thread before it waits on its condition
- * variable. It is checked by the notifier before it does
- * select.
- * POLL_DONE is set by the notifier if it goes into select after
- * seeing POLL_WANT. The idea is to ensure it tries a select
- * with the same bits the initial thread had set.
+ * variable. It is checked by the notifier before it does select.
+ * POLL_DONE is set by the notifier if it goes into select after seeing
+ * POLL_WANT. The idea is to ensure it tries a select with the
+ * same bits the initial thread had set.
*/
+
#define POLL_WANT 0x1
#define POLL_DONE 0x2
/*
* This is the thread ID of the notifier thread that does select.
*/
+
static pthread_t notifierThread;
/*
@@ -227,30 +235,30 @@ static int FileHandlerEventProc(Tcl_Event *evPtr, int flags);
*/
ClientData
-Tcl_InitNotifier()
+Tcl_InitNotifier(void)
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
tsdPtr->eventReady = 0;
-
- /*
+
+ /*
* Initialize CFRunLoopSource and add it to CFRunLoop of this thread
*/
-
+
if (!tsdPtr->runLoop) {
- CFRunLoopRef runLoop = CFRunLoopGetCurrent();
- CFRunLoopSourceRef runLoopSource;
- CFRunLoopSourceContext runLoopSourceContext;
-
- bzero(&runLoopSourceContext, sizeof(CFRunLoopSourceContext));
- runLoopSourceContext.info = tsdPtr;
- runLoopSource = CFRunLoopSourceCreate(NULL, 0, &runLoopSourceContext);
- if (!runLoopSource) {
- Tcl_Panic("Tcl_InitNotifier: could not create CFRunLoopSource.");
- }
- CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopCommonModes);
- tsdPtr->runLoopSource = runLoopSource;
- tsdPtr->runLoop = runLoop;
+ CFRunLoopRef runLoop = CFRunLoopGetCurrent();
+ CFRunLoopSourceRef runLoopSource;
+ CFRunLoopSourceContext runLoopSourceContext;
+
+ bzero(&runLoopSourceContext, sizeof(CFRunLoopSourceContext));
+ runLoopSourceContext.info = tsdPtr;
+ runLoopSource = CFRunLoopSourceCreate(NULL, 0, &runLoopSourceContext);
+ if (!runLoopSource) {
+ Tcl_Panic("Tcl_InitNotifier: could not create CFRunLoopSource.");
+ }
+ CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopCommonModes);
+ tsdPtr->runLoopSource = runLoopSource;
+ tsdPtr->runLoop = runLoop;
}
/*
@@ -259,40 +267,41 @@ Tcl_InitNotifier()
LOCK_NOTIFIER_INIT;
if (notifierCount == 0) {
- int fds[2], status, result;
- pthread_attr_t attr;
-
- if (pipe(fds) != 0) {
- Tcl_Panic("Tcl_InitNotifier: could not create trigger pipe.");
- }
-
- status = fcntl(fds[0], F_GETFL);
- status |= O_NONBLOCK;
- if (fcntl(fds[0], F_SETFL, status) < 0) {
- Tcl_Panic("Tcl_InitNotifier: could not make receive pipe non blocking.");
- }
- status = fcntl(fds[1], F_GETFL);
- status |= O_NONBLOCK;
- if (fcntl(fds[1], F_SETFL, status) < 0) {
- Tcl_Panic("Tcl_InitNotifier: could not make trigger pipe non blocking.");
- }
-
- receivePipe = fds[0];
- triggerPipe = fds[1];
-
- pthread_attr_init(&attr);
- pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
- pthread_attr_setstacksize(&attr, 60 * 1024);
- result = pthread_create(&notifierThread, &attr, (void * (*)(void *))NotifierThreadProc, NULL);
- pthread_attr_destroy(&attr);
+ int fds[2], status, result;
+ pthread_attr_t attr;
+
+ if (pipe(fds) != 0) {
+ Tcl_Panic("Tcl_InitNotifier: could not create trigger pipe.");
+ }
+
+ status = fcntl(fds[0], F_GETFL);
+ status |= O_NONBLOCK;
+ if (fcntl(fds[0], F_SETFL, status) < 0) {
+ Tcl_Panic("Tcl_InitNotifier: could not make receive pipe non blocking.");
+ }
+ status = fcntl(fds[1], F_GETFL);
+ status |= O_NONBLOCK;
+ if (fcntl(fds[1], F_SETFL, status) < 0) {
+ Tcl_Panic("Tcl_InitNotifier: could not make trigger pipe non blocking.");
+ }
+
+ receivePipe = fds[0];
+ triggerPipe = fds[1];
+
+ pthread_attr_init(&attr);
+ pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ pthread_attr_setstacksize(&attr, 60 * 1024);
+ result = pthread_create(&notifierThread, &attr,
+ (void * (*)(void *))NotifierThreadProc, NULL);
+ pthread_attr_destroy(&attr);
if (result) {
Tcl_Panic("Tcl_InitNotifier: unable to start notifier thread.");
}
}
notifierCount++;
UNLOCK_NOTIFIER_INIT;
-
+
return (ClientData) tsdPtr;
}
@@ -301,15 +310,15 @@ Tcl_InitNotifier()
*
* Tcl_FinalizeNotifier --
*
- * This function is called to cleanup the notifier state before
- * a thread is terminated.
+ * This function is called to cleanup the notifier state before a thread
+ * is terminated.
*
* Results:
* None.
*
* Side effects:
- * May terminate the background notifier thread if this is the
- * last notifier instance.
+ * May terminate the background notifier thread if this is the last
+ * notifier instance.
*
*----------------------------------------------------------------------
*/
@@ -324,47 +333,52 @@ Tcl_FinalizeNotifier(clientData)
notifierCount--;
/*
- * If this is the last thread to use the notifier, close the notifier
- * pipe and wait for the background thread to terminate.
+ * If this is the last thread to use the notifier, close the notifier pipe
+ * and wait for the background thread to terminate.
*/
if (notifierCount == 0) {
- int result;
-
+ int result;
+
if (triggerPipe < 0) {
Tcl_Panic("Tcl_FinalizeNotifier: notifier pipe not initialized.");
}
/*
- * Send "q" message to the notifier thread so that it will
- * terminate. The notifier will return from its call to select()
- * and notice that a "q" message has arrived, it will then close
- * its side of the pipe and terminate its thread. Note the we can
- * not just close the pipe and check for EOF in the notifier
- * thread because if a background child process was created with
- * exec, select() would not register the EOF on the pipe until the
- * child processes had terminated. [Bug: 4139]
+ * Send "q" message to the notifier thread so that it will terminate.
+ * The notifier will return from its call to select() and notice that
+ * a "q" message has arrived, it will then close its side of the pipe
+ * and terminate its thread. Note the we can not just close the pipe
+ * and check for EOF in the notifier thread because if a background
+ * child process was created with exec, select() would not register
+ * the EOF on the pipe until the child processes had terminated. [Bug:
+ * 4139] [Bug: 1222872]
*/
+
write(triggerPipe, "q", 1);
close(triggerPipe);
- result = pthread_join(notifierThread, NULL);
+ result = pthread_join(notifierThread, NULL);
if (result) {
Tcl_Panic("Tcl_FinalizeNotifier: unable to join notifier thread.");
}
-
+
close(receivePipe);
- triggerPipe = -1;
+ triggerPipe = -1;
}
UNLOCK_NOTIFIER_INIT;
-
- LOCK_NOTIFIER; /* for concurrency with Tcl_AlertNotifier */
+
+ LOCK_NOTIFIER; /* for concurrency with Tcl_AlertNotifier */
if (tsdPtr->runLoop) {
- tsdPtr->runLoop = NULL;
- /* Remove runLoopSource from all CFRunLoops and release it */
- CFRunLoopSourceInvalidate(tsdPtr->runLoopSource);
- CFRelease(tsdPtr->runLoopSource);
- tsdPtr->runLoopSource = NULL;
+ tsdPtr->runLoop = NULL;
+
+ /*
+ * Remove runLoopSource from all CFRunLoops and release it.
+ */
+
+ CFRunLoopSourceInvalidate(tsdPtr->runLoopSource);
+ CFRelease(tsdPtr->runLoopSource);
+ tsdPtr->runLoopSource = NULL;
}
UNLOCK_NOTIFIER;
}
@@ -374,18 +388,16 @@ Tcl_FinalizeNotifier(clientData)
*
* Tcl_AlertNotifier --
*
- * Wake up the specified notifier from any thread. This routine
- * is called by the platform independent notifier code whenever
- * the Tcl_ThreadAlert routine is called. This routine is
- * guaranteed not to be called on a given notifier after
- * Tcl_FinalizeNotifier is called for that notifier.
+ * Wake up the specified notifier from any thread. This routine is called
+ * by the platform independent notifier code whenever the Tcl_ThreadAlert
+ * routine is called. This routine is guaranteed not to be called on a
+ * given notifier after Tcl_FinalizeNotifier is called for that notifier.
*
* Results:
* None.
*
* Side effects:
- * Signals the notifier condition variable for the specified
- * notifier.
+ * Signals the notifier condition variable for the specified notifier.
*
*----------------------------------------------------------------------
*/
@@ -395,11 +407,12 @@ Tcl_AlertNotifier(clientData)
ClientData clientData;
{
ThreadSpecificData *tsdPtr = (ThreadSpecificData *) clientData;
+
LOCK_NOTIFIER;
if (tsdPtr->runLoop) {
- tsdPtr->eventReady = 1;
- CFRunLoopSourceSignal(tsdPtr->runLoopSource);
- CFRunLoopWakeUp(tsdPtr->runLoop);
+ tsdPtr->eventReady = 1;
+ CFRunLoopSourceSignal(tsdPtr->runLoopSource);
+ CFRunLoopWakeUp(tsdPtr->runLoop);
}
UNLOCK_NOTIFIER;
}
@@ -409,9 +422,9 @@ Tcl_AlertNotifier(clientData)
*
* Tcl_SetTimer --
*
- * This procedure sets the current notifier timer value. This
- * interface is not implemented in this notifier because we are
- * always running inside of Tcl_DoOneEvent.
+ * This function sets the current notifier timer value. This interface is
+ * not implemented in this notifier because we are always running inside
+ * of Tcl_DoOneEvent.
*
* Results:
* None.
@@ -427,9 +440,9 @@ Tcl_SetTimer(timePtr)
Tcl_Time *timePtr; /* Timeout value, may be NULL. */
{
/*
- * The interval timer doesn't do anything in this implementation,
- * because the only event loop is via Tcl_DoOneEvent, which passes
- * timeout values to Tcl_WaitForEvent.
+ * The interval timer doesn't do anything in this implementation, because
+ * the only event loop is via Tcl_DoOneEvent, which passes timeout values
+ * to Tcl_WaitForEvent.
*/
if (tclStubs.tcl_SetTimer != tclOriginalNotifier.setTimerProc) {
@@ -465,7 +478,7 @@ Tcl_ServiceModeHook(mode)
*
* Tcl_CreateFileHandler --
*
- * This procedure registers a file handler with the select notifier.
+ * This function registers a file handler with the select notifier.
*
* Results:
* None.
@@ -480,17 +493,18 @@ void
Tcl_CreateFileHandler(fd, mask, proc, clientData)
int fd; /* Handle of stream to watch. */
int mask; /* OR'ed combination of TCL_READABLE,
- * TCL_WRITABLE, and TCL_EXCEPTION:
- * indicates conditions under which
- * proc should be called. */
- Tcl_FileProc *proc; /* Procedure to call for each
- * selected event. */
+ * TCL_WRITABLE, and TCL_EXCEPTION: indicates
+ * conditions under which proc should be
+ * called. */
+ Tcl_FileProc *proc; /* Function to call for each selected
+ * event. */
ClientData clientData; /* Arbitrary data to pass to proc. */
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
FileHandler *filePtr;
- if (tclStubs.tcl_CreateFileHandler != tclOriginalNotifier.createFileHandlerProc) {
+ if (tclStubs.tcl_CreateFileHandler !=
+ tclOriginalNotifier.createFileHandlerProc) {
tclStubs.tcl_CreateFileHandler(fd, mask, proc, clientData);
return;
}
@@ -541,8 +555,7 @@ Tcl_CreateFileHandler(fd, mask, proc, clientData)
*
* Tcl_DeleteFileHandler --
*
- * Cancel a previously-arranged callback arrangement for
- * a file.
+ * Cancel a previously-arranged callback arrangement for a file.
*
* Results:
* None.
@@ -555,13 +568,15 @@ Tcl_CreateFileHandler(fd, mask, proc, clientData)
void
Tcl_DeleteFileHandler(fd)
- int fd; /* Stream id for which to remove callback procedure. */
+ int fd; /* Stream id for which to remove callback
+ * function. */
{
FileHandler *filePtr, *prevPtr;
int i;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
- if (tclStubs.tcl_DeleteFileHandler != tclOriginalNotifier.deleteFileHandlerProc) {
+ if (tclStubs.tcl_DeleteFileHandler !=
+ tclOriginalNotifier.deleteFileHandlerProc) {
tclStubs.tcl_DeleteFileHandler(fd);
return;
}
@@ -627,19 +642,19 @@ Tcl_DeleteFileHandler(fd)
*
* FileHandlerEventProc --
*
- * This procedure is called by Tcl_ServiceEvent when a file event
- * reaches the front of the event queue. This procedure is
- * responsible for actually handling the event by invoking the
- * callback for the file handler.
+ * This function is called by Tcl_ServiceEvent when a file event reaches
+ * the front of the event queue. This function is responsible for
+ * actually handling the event by invoking the callback for the file
+ * handler.
*
* Results:
- * Returns 1 if the event was handled, meaning it should be removed
- * from the queue. Returns 0 if the event was not handled, meaning
- * it should stay on the queue. The only time the event isn't
- * handled is if the TCL_FILE_EVENTS flag bit isn't set.
+ * Returns 1 if the event was handled, meaning it should be removed from
+ * the queue. Returns 0 if the event was not handled, meaning it should
+ * stay on the queue. The only time the event isn't handled is if the
+ * TCL_FILE_EVENTS flag bit isn't set.
*
* Side effects:
- * Whatever the file handler's callback procedure does.
+ * Whatever the file handler's callback function does.
*
*----------------------------------------------------------------------
*/
@@ -647,8 +662,8 @@ Tcl_DeleteFileHandler(fd)
static int
FileHandlerEventProc(evPtr, flags)
Tcl_Event *evPtr; /* Event to service. */
- int flags; /* Flags that indicate what events to
- * handle, such as TCL_FILE_EVENTS. */
+ int flags; /* Flags that indicate what events to handle,
+ * such as TCL_FILE_EVENTS. */
{
int mask;
FileHandler *filePtr;
@@ -661,9 +676,9 @@ FileHandlerEventProc(evPtr, flags)
/*
* Search through the file handlers to find the one whose handle matches
- * the event. We do this rather than keeping a pointer to the file
- * handler directly in the event, so that the handler can be deleted
- * while the event is queued without leaving a dangling pointer.
+ * the event. We do this rather than keeping a pointer to the file handler
+ * directly in the event, so that the handler can be deleted while the
+ * event is queued without leaving a dangling pointer.
*/
tsdPtr = TCL_TSD_INIT(&dataKey);
@@ -675,14 +690,14 @@ FileHandlerEventProc(evPtr, flags)
/*
* The code is tricky for two reasons:
- * 1. The file handler's desired events could have changed
- * since the time when the event was queued, so AND the
- * ready mask with the desired mask.
- * 2. The file could have been closed and re-opened since
- * the time when the event was queued. This is why the
- * ready mask is stored in the file handler rather than
- * the queued event: it will be zeroed when a new
- * file handler is created for the newly opened file.
+ * 1. The file handler's desired events could have changed since the
+ * time when the event was queued, so AND the ready mask with the
+ * desired mask.
+ * 2. The file could have been closed and re-opened since the time
+ * when the event was queued. This is why the ready mask is stored
+ * in the file handler rather than the queued event: it will be
+ * zeroed when a new file handler is created for the newly opened
+ * file.
*/
mask = filePtr->readyMask & filePtr->mask;
@@ -700,13 +715,12 @@ FileHandlerEventProc(evPtr, flags)
*
* Tcl_WaitForEvent --
*
- * This function is called by Tcl_DoOneEvent to wait for new
- * events on the message queue. If the block time is 0, then
- * Tcl_WaitForEvent just polls without blocking.
+ * This function is called by Tcl_DoOneEvent to wait for new events on
+ * the message queue. If the block time is 0, then Tcl_WaitForEvent just
+ * polls without blocking.
*
* Results:
- * Returns -1 if the select would block forever, otherwise
- * returns 0.
+ * Returns -1 if the select would block forever, otherwise returns 0.
*
* Side effects:
* Queues file events that are detected by the select.
@@ -739,10 +753,10 @@ Tcl_WaitForEvent(timePtr)
if (timePtr != NULL && timePtr->sec == 0 && timePtr->usec == 0) {
/*
* Cannot emulate a polling select with a polling condition variable.
- * Instead, pretend to wait for files and tell the notifier
- * thread what we are doing. The notifier thread makes sure
- * it goes through select with its select mask in the same state
- * as ours currently is. We block until that happens.
+ * Instead, pretend to wait for files and tell the notifier thread
+ * what we are doing. The notifier thread makes sure it goes through
+ * select with its select mask in the same state as ours currently is.
+ * We block until that happens.
*/
waitForFiles = 1;
@@ -754,9 +768,9 @@ Tcl_WaitForEvent(timePtr)
if (waitForFiles) {
/*
- * Add the ThreadSpecificData structure of this thread to the list
- * of ThreadSpecificData structures of all threads that are waiting
- * on file events.
+ * Add the ThreadSpecificData structure of this thread to the list of
+ * ThreadSpecificData structures of all threads that are waiting on
+ * file events.
*/
tsdPtr->nextPtr = waitingListPtr;
@@ -775,23 +789,23 @@ Tcl_WaitForEvent(timePtr)
FD_ZERO(&(tsdPtr->readyMasks.exceptional));
if (!tsdPtr->eventReady) {
- CFTimeInterval waitTime;
-
- if (timePtr == NULL) {
- waitTime = 1.0e10; /* Wait forever, as per CFRunLoop.c */
- } else {
- waitTime = timePtr->sec + 1.0e-6 * timePtr->usec;
- }
- UNLOCK_NOTIFIER;
- CFRunLoopRunInMode(kCFRunLoopDefaultMode, waitTime, TRUE);
- LOCK_NOTIFIER;
+ CFTimeInterval waitTime;
+
+ if (timePtr == NULL) {
+ waitTime = 1.0e10; /* Wait forever, as per CFRunLoop.c */
+ } else {
+ waitTime = timePtr->sec + 1.0e-6 * timePtr->usec;
+ }
+ UNLOCK_NOTIFIER;
+ CFRunLoopRunInMode(kCFRunLoopDefaultMode, waitTime, TRUE);
+ LOCK_NOTIFIER;
}
tsdPtr->eventReady = 0;
if (waitForFiles && tsdPtr->onList) {
/*
* Remove the ThreadSpecificData structure of this thread from the
- * waiting list. Alert the notifier thread to recompute its select
+ * waiting list. Alert the notifier thread to recompute its select
* masks - skipping this caused a hang when trying to close a pipe
* which the notifier thread was still doing a select on.
*/
@@ -809,7 +823,6 @@ Tcl_WaitForEvent(timePtr)
write(triggerPipe, "", 1);
}
-
/*
* Queue all detected file events before returning.
*/
@@ -833,8 +846,8 @@ Tcl_WaitForEvent(timePtr)
}
/*
- * Don't bother to queue an event if the mask was previously
- * non-zero since an event must still be on the queue.
+ * Don't bother to queue an event if the mask was previously non-zero
+ * since an event must still be on the queue.
*/
if (filePtr->readyMask == 0) {
@@ -855,21 +868,20 @@ Tcl_WaitForEvent(timePtr)
* NotifierThreadProc --
*
* This routine is the initial (and only) function executed by the
- * special notifier thread. Its job is to wait for file descriptors
- * to become readable or writable or to have an exception condition
- * and then to notify other threads who are interested in this
- * information by signalling a condition variable. Other threads
- * can signal this notifier thread of a change in their interests
- * by writing a single byte to a special pipe that the notifier
- * thread is monitoring.
+ * special notifier thread. Its job is to wait for file descriptors to
+ * become readable or writable or to have an exception condition and then
+ * to notify other threads who are interested in this information by
+ * signalling a condition variable. Other threads can signal this
+ * notifier thread of a change in their interests by writing a single
+ * byte to a special pipe that the notifier thread is monitoring.
*
* Result:
- * None. Once started, this routine never exits. It dies with
- * the overall process.
+ * None. Once started, this routine never exits. It dies with the overall
+ * process.
*
* Side effects:
- * The trigger pipe used to signal the notifier thread is created
- * when the notifier thread first starts.
+ * The trigger pipe used to signal the notifier thread is created when
+ * the notifier thread first starts.
*
*----------------------------------------------------------------------
*/
@@ -897,8 +909,8 @@ NotifierThreadProc(clientData)
FD_ZERO(&exceptionalMask);
/*
- * Compute the logical OR of the select masks from all the
- * waiting notifiers.
+ * Compute the logical OR of the select masks from all the waiting
+ * notifiers.
*/
LOCK_NOTIFIER;
@@ -920,8 +932,8 @@ NotifierThreadProc(clientData)
}
if (tsdPtr->pollState & POLL_WANT) {
/*
- * Here we make sure we go through select() with the same
- * mask bits that were present when the thread tried to poll.
+ * Here we make sure we go through select() with the same mask
+ * bits that were present when the thread tried to poll.
*/
tsdPtr->pollState |= POLL_DONE;
@@ -978,10 +990,10 @@ NotifierThreadProc(clientData)
tsdPtr->eventReady = 1;
if (tsdPtr->onList) {
/*
- * Remove the ThreadSpecificData structure of this
- * thread from the waiting list. This prevents us from
- * continuously spining on select until the other
- * threads runs and services the file event.
+ * Remove the ThreadSpecificData structure of this thread
+ * from the waiting list. This prevents us from
+ * continuously spining on select until the other threads
+ * runs and services the file event.
*/
if (tsdPtr->prevPtr) {
@@ -1006,8 +1018,8 @@ NotifierThreadProc(clientData)
/*
* Consume the next byte from the notifier pipe if the pipe was
- * readable. Note that there may be multiple bytes pending, but
- * to avoid a race condition we only read one at a time.
+ * readable. Note that there may be multiple bytes pending, but to
+ * avoid a race condition we only read one at a time.
*/
if (FD_ISSET(receivePipe, &readableMask)) {
@@ -1015,9 +1027,9 @@ NotifierThreadProc(clientData)
if ((i == 0) || ((i == 1) && (buf[0] == 'q'))) {
/*
- * Someone closed the write end of the pipe or sent us a
- * Quit message [Bug: 4139] and then closed the write end
- * of the pipe so we need to shut down the notifier thread.
+ * Someone closed the write end of the pipe or sent us a Quit
+ * message [Bug: 4139] and then closed the write end of the
+ * pipe so we need to shut down the notifier thread.
*/
break;
@@ -1026,5 +1038,4 @@ NotifierThreadProc(clientData)
}
pthread_exit (0);
}
-
#endif /* HAVE_COREFOUNDATION */