Mach ports problem

  1. last year

    Beatrix W

    9 Jan 2019 Pre-Release Testers, Third Party Store Europe (Germany)
    Edited last year

    Got a crash from a user "system has no mach ports available". Checking the crash log I see some information about ports

    0 0x00007fff36d7ddb7 __THE_SYSTEM_HAS_NO_PORTS_AVAILABLE__ + 4
    1 0x00007fff36c7874c __CFRunLoopCreate + 555
    2 0x00007fff36c78499 _CFRunLoopGet0 + 194

    But there also is a thread on printing

    12 0x00007fff3455be71 -[NSPrintInfo(NSInternal) _printSessionForGetting] + 43
    13 0x00007fff345619d8 -[NSPrintInfo(NSInternal) _createDefaultOrUnflattenPrintSettingsIfNecessary] + 188
    14 0x00007fff345618f0 -[NSPrintInfo(NSInternal) _printSettingsForSetting] + 22
    15 0x00007fff3492ffcb -[NSConcretePrintOperation runOperation] + 514
    16 MBS_MacControls_HTMLViewerPrint_Plugin_19729.dylib 0x0000000109e1e45b PrintToPDFFile(REALobjectStruct*, REALfolderItemStruct*, double, double, double, double) + 1323
    17 com.mothsoftware.mailarchiverx 0x0000000101fe34af HTMLViewerHTMLViewerPrintExtensionMBS.$PrintToPDFFileMBS%b%o<HTMLViewer>o<FolderItem>f8f8f8f8 + 111

    So I think that printing is somehow messing up the mach ports. After some emails exchanged with Christian and further testing it seems that executing AppleScripts with Mail as target is opening mach ports by the dozen. Those are closed very slowly as I can see in the Activity Viewer. It's not even my app. Simply executing a script in the ScriptViewer

    property Mailbox0 : "iCloud"
    property Mailbox1 : "Newsletters"
    property currentMessageStr : "1"
    with timeout of 10000 seconds
    	set currentMessage to currentMessageStr as integer
    	set AllHeaders to {}
    	tell application id ""
    			repeat with messageNo from currentMessage to currentMessage + 9
    				set theMessage to (message messageNo of mailbox (Mailbox1) of account (Mailbox0))
    				if not deleted status of theMessage then
    					set theRes to (all headers of theMessage)
    					if theRes = "" then
    						copy ("empty") to end of AllHeaders
    						copy theRes to end of AllHeaders
    					end if
    					copy ("deleted") to end of AllHeaders
    				end if
    			end repeat
    			return AllHeaders
    		on error errMsg number errNr
    			if errNr = -1719 then
    				return AllHeaders
    			end if
    		end try
    	end tell
    end timeout

    opens like 20 - 30 mach ports per single execution. My app can do this hundreds or thousands of times.

    I'm not an expert in low level macOS stuff. From Goggling I think that mach ports are used for low level communication. But I haven't the foggiest what those things are.

    Questions: can I change the number of available mach ports? Can I force/encourage Mail to close the mach ports faster?

  2. Sam R

    10 Jan 2019 Pre-Release Testers, Xojo Pro, Third Party Store Hengchun, Pingtung, Taiwan
    Edited last year

    File a bug report with Apple and include as much detail as possible. It sounds to me like a bug in Mail and/or AppleScript.

    Is it related to a particular version of the macOS (like say 10.14 or 10.13.6)?

    p.s. My guess is unless you have a reference to each and every port, you cannot manually close them, and as you didn't directly create them...

  3. Beatrix W

    10 Jan 2019 Pre-Release Testers, Third Party Store Europe (Germany)

    Sigh... yes, this seems a bug in macOS.

    I can see the bug here with High Sierra and the user has Mojave.

  4. Tim J

    10 Jan 2019 Pre-Release Testers N. Phoenix, AZ
    Edited last year

    You will discover that this is as designed (like with tcp/udp ports). They are held for a period after they are "closed" to prevent malicious kernel level attacks and to insure that all packages/buffers have been sent. When the port is released, it goes into the TIME_WAIT state to prevent duplicate packets that were delayed en route to the first connection from being delivered to the second connection.

  5. Beatrix W

    10 Jan 2019 Pre-Release Testers, Third Party Store Europe (Germany)

    @Time Jones: and how can you then run out of ports?

  6. Tim J

    10 Jan 2019 Pre-Release Testers N. Phoenix, AZ

    Until the TIME_WAIT state is cleared, the released port is not removed from the ports list. Because Mach Ports set up kernel level IPC, I don't know why you would need so many of them when mail operations should be occurring in user space, not kernel space.

    What if you were to stop using AppleScript and instead include a mail handler directly within your app? The Xojo mail example is pretty thorough as a starting point.

  7. Beatrix W

    10 Jan 2019 Pre-Release Testers, Third Party Store Europe (Germany)

    @Tim Jones: my app archives emails either with AppleScript from Mail/Outlook or with IMAP from any IMAP account. The app handles GBs of data. The AppleScripts are created dynamically and can be executed 10k times or more.

    The Xojo email example is for sending mails. Very very simple mails.

or Sign Up to reply!