Hello Miguel,

You can see in the code, the last timed element is fclose(f), which is just closing the file used for diagnostics writing in the timing code, which when removed, still leaves 6900ms (it varies between 5000ms and > 10000ms).

But I will look at if there is something else I can do based on your hint.

Regards,
Jason.

NSERIAL_EXPORT int WINAPI serial_close(struct serialhandle *handle)
{
  clock_t start, end;

  FILE *f;
f = fopen("/home/jcurl/Programming/SerialPortStream/dll/serialunix/build/out.txt", "a");
  fprintf(f, "c: serial_close(handle=%p)\n", handle);
  start = clock();

  if (handle == NULL) {
    errno = EINVAL;
    return -1;
  }

  fprintf(f, "c: serial_close(handle=%p) fd=%d\n", handle, handle->fd);
  if (handle->fd == -1) return 0;
  flushbuffer(handle);
  end = clock();
  fprintf(f, "c: serial_close(handle=%p) flushbuffer elapsed=%f\n",
     handle,
     ((double)1000.0*(end-start))/CLOCKS_PER_SEC);

  if (handle->prfd != -1) {
    close(handle->prfd);
    handle->prfd = -1;
  }
  end = clock();
  fprintf(f, "c: serial_close(handle=%p) close(prfd) elapsed=%f\n",
     handle,
     ((double)1000.0*(end-start))/CLOCKS_PER_SEC);
  if (handle->pwfd != -1) {
    close(handle->pwfd);
    handle->pwfd = -1;
  }
  end = clock();
  fprintf(f, "c: serial_close(handle=%p) close(pwfd) elapsed=%f\n",
     handle,
     ((double)1000.0*(end-start))/CLOCKS_PER_SEC);

  close(handle->fd);
  handle->fd = -1;

  end = clock();
  fprintf(f, "c: serial_close(handle=%p) close(fd) elapsed=%f\n",
     handle,
     ((double)1000.0*(end-start))/CLOCKS_PER_SEC);
  fclose(f);

  return 0;
}


On 23/04/2016 17:40, Jason Curl wrote:
Hello Miguel,

> c: serial_close(handle=0x7fe044008d80) close(fd) elapsed=21,530000

The time is from when the function entered (using the clock() function) and the end.

There seems to be about 6900ms between calling the P/Invoke method and when the function actually gets called. You'll see a second call later works as expected (the C method takes 0,066000ms and the .NET says 0ms using).

On 23/04/2016 17:15, Miguel de Icaza wrote:
Time the C calls, it is possible that close is flushing the data and is not returning until that happebs
On Sat, Apr 23, 2016 at 9:33 AM Jason Curl <jcurln...@arcor.de> wrote:

    I've tested the latest snapshot of Mono and the problem remains:

    Mono JIT compiler version 4.5.0 (Nightly 4.5.0.421/c5789eb Thu Mar 24
    18:42:59 UTC 2016)
    Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors.
    www.mono-project.com <http://www.mono-project.com>
         TLS:           __thread
         SIGSEGV:       altstack
         Notifications: epoll
         Architecture:  amd64
         Disabled:      none
         Misc:          softdebug
         LLVM:          supported, not enabled.
         GC:            sgen

    nUnit-gui now works properly (4.2.3.4 would hang when trying to
    close)
    and using MONO debug variables (MONO_LOG_MASK="dll";
    MONO_LOG_LEVEL="debug", I can see that the method "serial_close" is
    called at the correct time, but I don't see any other activity while
    blocked.

    Mono: DllImport searching in: 'nserial' ('libnserial.so').
    Mono: Searching for 'serial_close'.
    Mono: Probing 'serial_close'.
    Mono: Found as 'serial_close'.

    PAUSE FOR 6 SECONDS

    Mono: DllImport searching in: 'nserial' ('libnserial.so').
    Mono: Searching for 'serial_read'.
    Mono: Probing 'serial_read'.
    Mono: Found as 'serial_read'.
    Mono: DllImport searching in: 'nserial' ('libnserial.so').
    Mono: Searching for 'serial_terminate'.
    Mono: Probing 'serial_terminate'.
    Mono: Found as 'serial_terminate'.

    Any help is appreciated.

    On 22.04.2016 23:37, Jason Curl wrote:
    > I've generally got my library working
    > (github.com/jcurl/serialportstream
    <http://github.com/jcurl/serialportstream>) on Linux with Mono
    4.2.3.4 from
    > the Xamarin repositories on Ubuntu 16.04, with one small problem.
    >
    > One new test case (ClosedWhenBlocked) takes 6923ms for a simple
    > close() function using marshalling, where the function in C
    only needs
    > 22ms. It's called twice (there's two instances), the second is
    > effectively instantaneous. On my machine, the issue is 100%
    > reproducible. My C code and .NET is OK (as far as I can tell) and
    > appears to be some blocking behaviour in the Marshalling code
    of the
    > .NET framework. How can I debug further if it's me or .NET?
    >
    > Note, I can't compare on Windows as it's Linux specific code.
    >
    >
    > Closing serialSource
    > ...
    > --> serial_close(140601190288768)   => 0x7FE044008D80
    > ...
    > -->  serial_close(140601190288768) took 6916 ms
    > IO.Ports.SerialPortStream Verbose: 0 : -->
    > serial_close(140601190288768) took 6916 ms
    > ...
    > Closed serialSource after 6923 ms
    > ...
    > --> serial_close(140601190278688)  => 0x7FE044006620
    > -->  serial_close(140601190278688) took 0 ms
    > -->  serial_close(140601190278688) took 0 ms
    >
    >
    >
    > The code in question is
    >         [DllImport("nserial", EntryPoint="serial_close",
    > SetLastError=true)]
    >         private static extern int nserial_close(IntPtr handle);
    >         public int serial_close(IntPtr handle)
    >         {
    >             System.Diagnostics.Stopwatch sw = new
    > System.Diagnostics.Stopwatch();
    >             sw.Start();
    >             Console.WriteLine("--> serial_close({0})", handle);
    >             int result = nserial_close(handle);
    >             Console.WriteLine("--> serial_close({0}) took {1} ms",
    > handle, sw.ElapsedMilliseconds);
    >             errno = Marshal.GetLastWin32Error();
    >             Console.WriteLine("--> serial_close({0}) took {1} ms",
    > handle, sw.ElapsedMilliseconds);
    >             return result;
    >         }
    >
    > I added diagnostics to my C code to write performance data to
    disk and
    > it is:
    > c: serial_close(handle=0x7fe044008d80)
    > c: serial_close(handle=0x7fe044008d80) fd=4
    > c: serial_close(handle=0x7fe044008d80) flushbuffer elapsed=0,005000
    > c: serial_close(handle=0x7fe044008d80) close(prfd) elapsed=0,028000
    > c: serial_close(handle=0x7fe044008d80) close(pwfd) elapsed=0,046000
    > c: serial_close(handle=0x7fe044008d80) close(fd) elapsed=21,530000
    > c: serial_close(handle=0x7fe044006620)
    > c: serial_close(handle=0x7fe044006620) fd=14
    > c: serial_close(handle=0x7fe044006620) flushbuffer elapsed=0,004000
    > c: serial_close(handle=0x7fe044006620) close(prfd) elapsed=0,048000
    > c: serial_close(handle=0x7fe044006620) close(pwfd) elapsed=0,062000
    > c: serial_close(handle=0x7fe044006620) close(fd) elapsed=0,066000
    >
    > _______________________________________________
    > Mono-devel-list mailing list
    > Mono-devel-list@lists.ximian.com
    <mailto:Mono-devel-list@lists.ximian.com>
    > http://lists.ximian.com/mailman/listinfo/mono-devel-list
    >

    _______________________________________________
    Mono-devel-list mailing list
    Mono-devel-list@lists.ximian.com
    <mailto:Mono-devel-list@lists.ximian.com>
    http://lists.ximian.com/mailman/listinfo/mono-devel-list




_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to