src/jdk.net/linux/native/libextnet/rdma_util_md.c
author chegar
Thu, 31 Jan 2019 14:12:49 +0000
branchrsocket-branch
changeset 57129 1e1db86ea836
parent 57115 512e7cc6ccce
child 57134 096bba76efd1
permissions -rw-r--r--
rsocket-branch: Review comments from Brian, A, B, and D Contributed-by: Lucy Lu <yingqi.lu@intel.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57115
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     1
/*
57129
1e1db86ea836 rsocket-branch: Review comments from Brian, A, B, and D
chegar
parents: 57115
diff changeset
     2
 * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
57115
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     4
 *
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    10
 *
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    15
 * accompanied this code).
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    16
 *
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    20
 *
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    23
 * questions.
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    24
 */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    25
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    26
#include <assert.h>
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    27
#include "java_net_SocketOptions.h"
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    28
#include "jdk_net_RdmaSocketOptions.h"
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    29
#include "jvm.h"
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    30
#include <netinet/tcp.h> // defines TCP_NODELAY
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    31
#include "net_util.h"
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    32
#include "rdma_util_md.h"
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    33
#include "Rsocket.h"
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    34
#include <stdlib.h>
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    35
#include <sys/ioctl.h>
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    36
#include <sys/resource.h>
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    37
#include <pthread.h>
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    38
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    39
#define BLOCKING_IO_RETURN_INT(FD, FUNC) {      \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    40
    int ret;                                    \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    41
    threadEntry_t self;                         \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    42
    fdEntry_t *fdEntry = getFdEntry(FD);        \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    43
    if (fdEntry == NULL) {                      \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    44
        errno = EBADF;                          \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    45
        return -1;                              \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    46
    }                                           \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    47
    do {                                        \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    48
        startOp(fdEntry, &self);                \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    49
        ret = FUNC;                             \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    50
        endOp(fdEntry, &self);                  \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    51
    } while (ret == -1 && errno == EINTR);      \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    52
    return ret;                                 \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    53
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    54
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    55
typedef struct threadEntry {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    56
    pthread_t thr;                      /* this thread */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    57
    struct threadEntry *next;           /* next thread */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    58
    int intr;                           /* interrupted */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    59
} threadEntry_t;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    60
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    61
typedef struct {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    62
    pthread_mutex_t lock;               /* fd lock */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    63
    threadEntry_t *threads;             /* threads blocked on fd */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    64
} fdEntry_t;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    65
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    66
static int sigWakeup = (__SIGRTMAX - 2);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    67
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    68
static fdEntry_t* fdTable = NULL;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    69
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    70
static const int fdTableMaxSize = 0x1000; /* 4K */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    71
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    72
static int fdTableLen = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    73
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    74
static int fdLimit = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    75
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    76
static fdEntry_t** fdOverflowTable = NULL;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    77
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    78
static int fdOverflowTableLen = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    79
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    80
static const int fdOverflowTableSlabSize = 0x10000; /* 64k */
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    81
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    82
pthread_mutex_t fdOverflowTableLock = PTHREAD_MUTEX_INITIALIZER;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    83
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    84
static void sig_wakeup(int sig) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    85
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    86
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    87
static void __attribute((constructor)) init() {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    88
    struct rlimit nbr_files;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    89
    sigset_t sigset;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    90
    struct sigaction sa;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    91
    int i = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    92
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    93
    if (-1 == getrlimit(RLIMIT_NOFILE, &nbr_files)) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    94
        fprintf(stderr, "library initialization failed - "
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    95
                "unable to get max # of allocated fds\n");
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    96
        abort();
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    97
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    98
    if (nbr_files.rlim_max != RLIM_INFINITY) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
    99
        fdLimit = nbr_files.rlim_max;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   100
    } else {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   101
        fdLimit = INT_MAX;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   102
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   103
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   104
    fdTableLen = fdLimit < fdTableMaxSize ? fdLimit : fdTableMaxSize;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   105
    fdTable = (fdEntry_t*) calloc(fdTableLen, sizeof(fdEntry_t));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   106
    if (fdTable == NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   107
        fprintf(stderr, "library initialization failed - "
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   108
                "unable to allocate file descriptor table - out of memory");
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   109
        abort();
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   110
    } else {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   111
        for (i = 0; i < fdTableLen; i ++) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   112
            pthread_mutex_init(&fdTable[i].lock, NULL);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   113
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   114
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   115
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   116
    if (fdLimit > fdTableMaxSize) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   117
        fdOverflowTableLen = ((fdLimit - fdTableMaxSize) / fdOverflowTableSlabSize) + 1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   118
        fdOverflowTable = (fdEntry_t**) calloc(fdOverflowTableLen, sizeof(fdEntry_t*));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   119
        if (fdOverflowTable == NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   120
            fprintf(stderr, "library initialization failed - "
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   121
                    "unable to allocate file descriptor overflow table - out of memory");
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   122
            abort();
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   123
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   124
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   125
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   126
    sa.sa_handler = sig_wakeup;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   127
    sa.sa_flags   = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   128
    sigemptyset(&sa.sa_mask);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   129
    sigaction(sigWakeup, &sa, NULL);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   130
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   131
    sigemptyset(&sigset);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   132
    sigaddset(&sigset, sigWakeup);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   133
    sigprocmask(SIG_UNBLOCK, &sigset, NULL);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   134
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   135
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   136
static inline fdEntry_t *getFdEntry(int fd) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   137
    fdEntry_t* result = NULL;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   138
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   139
    if (fd < 0) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   140
        return NULL;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   141
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   142
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   143
    assert(fd < fdLimit);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   144
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   145
    if (fd < fdTableMaxSize) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   146
        assert(fd < fdTableLen);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   147
        result = &fdTable[fd];
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   148
    } else {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   149
        const int indexInOverflowTable = fd - fdTableMaxSize;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   150
        const int rootindex = indexInOverflowTable / fdOverflowTableSlabSize;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   151
        const int slabindex = indexInOverflowTable % fdOverflowTableSlabSize;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   152
        fdEntry_t* slab = NULL;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   153
        assert(rootindex < fdOverflowTableLen);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   154
        assert(slabindex < fdOverflowTableSlabSize);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   155
        pthread_mutex_lock(&fdOverflowTableLock);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   156
        if (fdOverflowTable[rootindex] == NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   157
            fdEntry_t* const newSlab =
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   158
                (fdEntry_t*)calloc(fdOverflowTableSlabSize, sizeof(fdEntry_t));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   159
            if (newSlab == NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   160
                fprintf(stderr, "Unable to allocate file descriptor overflow"
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   161
                        " table slab - out of memory");
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   162
                pthread_mutex_unlock(&fdOverflowTableLock);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   163
                abort();
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   164
            } else {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   165
                int i;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   166
                for (i = 0; i < fdOverflowTableSlabSize; i ++) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   167
                    pthread_mutex_init(&newSlab[i].lock, NULL);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   168
                }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   169
                fdOverflowTable[rootindex] = newSlab;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   170
            }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   171
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   172
        pthread_mutex_unlock(&fdOverflowTableLock);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   173
        slab = fdOverflowTable[rootindex];
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   174
        result = &slab[slabindex];
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   175
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   176
    return result;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   177
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   178
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   179
static inline void startOp(fdEntry_t *fdEntry, threadEntry_t *self) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   180
    self->thr = pthread_self();
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   181
    self->intr = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   182
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   183
    pthread_mutex_lock(&(fdEntry->lock));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   184
    {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   185
        self->next = fdEntry->threads;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   186
        fdEntry->threads = self;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   187
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   188
    pthread_mutex_unlock(&(fdEntry->lock));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   189
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   190
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   191
static inline void endOp (fdEntry_t *fdEntry, threadEntry_t *self) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   192
    int orig_errno = errno;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   193
    pthread_mutex_lock(&(fdEntry->lock));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   194
    {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   195
        threadEntry_t *curr, *prev=NULL;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   196
        curr = fdEntry->threads;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   197
        while (curr != NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   198
            if (curr == self) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   199
                if (curr->intr) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   200
                    orig_errno = EBADF;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   201
                }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   202
                if (prev == NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   203
                    fdEntry->threads = curr->next;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   204
                } else {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   205
                    prev->next = curr->next;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   206
                }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   207
                break;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   208
            }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   209
            prev = curr;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   210
            curr = curr->next;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   211
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   212
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   213
    pthread_mutex_unlock(&(fdEntry->lock));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   214
    errno = orig_errno;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   215
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   216
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   217
#define RESTARTABLE(_cmd, _result) do { \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   218
    do { \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   219
        _result = _cmd; \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   220
    } while((_result == -1) && (errno == EINTR)); \
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   221
} while(0)
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   222
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   223
int rdma_supported() {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   224
    int one = 1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   225
    int rv, s;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   226
    s = rs_socket(PF_INET, SOCK_STREAM, 0);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   227
    if (s < 0) {
57129
1e1db86ea836 rsocket-branch: Review comments from Brian, A, B, and D
chegar
parents: 57115
diff changeset
   228
        rs_close(s);
57115
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   229
        return JNI_FALSE;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   230
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   231
    return JNI_TRUE;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   232
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   233
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   234
int RDMA_MapSocketOption(jint cmd, int *level, int *optname) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   235
    static struct {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   236
        jint cmd;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   237
        int level;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   238
        int optname;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   239
    } const opts[] = {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   240
        { java_net_SocketOptions_TCP_NODELAY,           IPPROTO_TCP,    TCP_NODELAY },
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   241
        { java_net_SocketOptions_SO_SNDBUF,             SOL_SOCKET,     SO_SNDBUF },
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   242
        { java_net_SocketOptions_SO_RCVBUF,             SOL_SOCKET,     SO_RCVBUF },
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   243
        { java_net_SocketOptions_SO_REUSEADDR,          SOL_SOCKET,     SO_REUSEADDR },
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   244
        { jdk_net_RdmaSocketOptions_SQSIZE,             SOL_RDMA,       RDMA_SQSIZE },
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   245
        { jdk_net_RdmaSocketOptions_RQSIZE,             SOL_RDMA,       RDMA_RQSIZE },
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   246
        { jdk_net_RdmaSocketOptions_INLINE,             SOL_RDMA,       RDMA_INLINE },
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   247
    };
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   248
    int i;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   249
    for (i=0; i<(int)(sizeof(opts) / sizeof(opts[0])); i++) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   250
        if (cmd == opts[i].cmd) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   251
            *level = opts[i].level;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   252
            *optname = opts[i].optname;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   253
            return 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   254
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   255
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   256
    return -1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   257
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   258
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   259
int RDMA_GetSockOpt(int fd, int level, int opt, void *result, int *len) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   260
    int rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   261
    socklen_t socklen = *len;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   262
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   263
    rv = rs_getsockopt(fd, level, opt, result, &socklen);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   264
    *len = socklen;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   265
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   266
    if (rv < 0) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   267
        return rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   268
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   269
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   270
    if ((level == SOL_SOCKET) && ((opt == SO_SNDBUF)
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   271
                                  || (opt == SO_RCVBUF))) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   272
        int n = *((int *)result);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   273
        n /= 2;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   274
        *((int *)result) = n;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   275
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   276
    return rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   277
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   278
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   279
int RDMA_SetSockOpt(int fd, int level, int  opt, const void *arg, int len) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   280
    int *bufsize;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   281
    if (level == SOL_SOCKET && opt == SO_RCVBUF) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   282
        int *bufsize = (int *)arg;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   283
        if (*bufsize < 1024) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   284
            *bufsize = 1024;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   285
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   286
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   287
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   288
    return rs_setsockopt(fd, level, opt, arg, len);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   289
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   290
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   291
int RDMA_Bind(int fd, SOCKETADDRESS *sa, int len) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   292
    int rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   293
    int arg, alen;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   294
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   295
    if (sa->sa.sa_family == AF_INET) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   296
        if ((ntohl(sa->sa4.sin_addr.s_addr) & 0x7f0000ff) == 0x7f0000ff) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   297
            errno = EADDRNOTAVAIL;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   298
            return -1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   299
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   300
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   301
    rv = rs_bind(fd, &sa->sa, len);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   302
    return rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   303
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   304
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   305
jint RDMA_Wait(JNIEnv *env, jint fd, jint flags, jint timeout) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   306
    jlong prevNanoTime = JVM_NanoTime(env, 0);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   307
    jlong nanoTimeout = (jlong) timeout * NET_NSEC_PER_MSEC;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   308
    jint read_rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   309
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   310
    while (1) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   311
        jlong newNanoTime;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   312
        struct pollfd pfd;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   313
        pfd.fd = fd;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   314
        pfd.events = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   315
        if (flags & NET_WAIT_READ)
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   316
          pfd.events |= POLLIN;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   317
        if (flags & NET_WAIT_WRITE)
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   318
          pfd.events |= POLLOUT;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   319
        if (flags & NET_WAIT_CONNECT)
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   320
          pfd.events |= POLLOUT;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   321
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   322
        errno = 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   323
        read_rv = RDMA_Poll(&pfd, 1, nanoTimeout / NET_NSEC_PER_MSEC);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   324
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   325
        newNanoTime = JVM_NanoTime(env, 0);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   326
        nanoTimeout -= (newNanoTime - prevNanoTime);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   327
        if (nanoTimeout < NET_NSEC_PER_MSEC) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   328
          return read_rv > 0 ? 0 : -1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   329
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   330
        prevNanoTime = newNanoTime;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   331
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   332
        if (read_rv > 0) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   333
          break;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   334
        }
57129
1e1db86ea836 rsocket-branch: Review comments from Brian, A, B, and D
chegar
parents: 57115
diff changeset
   335
      }
57115
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   336
    return (nanoTimeout / NET_NSEC_PER_MSEC);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   337
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   338
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   339
static int rdma_closefd(int fd2) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   340
    int rv, orig_errno;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   341
    fdEntry_t *fdEntry = getFdEntry(fd2);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   342
    if (fdEntry == NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   343
        errno = EBADF;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   344
        return -1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   345
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   346
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   347
    pthread_mutex_lock(&(fdEntry->lock));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   348
    do {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   349
        rv = rs_close(fd2);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   350
    } while (rv == -1 && errno == EINTR);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   351
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   352
    threadEntry_t *curr = fdEntry->threads;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   353
    while (curr != NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   354
        curr->intr = 1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   355
        pthread_kill( curr->thr, sigWakeup );
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   356
        curr = curr->next;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   357
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   358
    orig_errno = errno;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   359
    pthread_mutex_unlock(&(fdEntry->lock));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   360
    errno = orig_errno;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   361
    return rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   362
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   363
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   364
int RDMA_SocketClose(int fd) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   365
    return rdma_closefd(fd);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   366
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   367
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   368
int RDMA_Read(int s, void* buf, size_t len) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   369
    BLOCKING_IO_RETURN_INT(s, rs_recv(s, buf, len, 0));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   370
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   371
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   372
int RDMA_NonBlockingRead(int s, void* buf, size_t len) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   373
    BLOCKING_IO_RETURN_INT(s, rs_recv(s, buf, len, MSG_DONTWAIT));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   374
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   375
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   376
int RDMA_ReadV(int s, const struct iovec * vector, int count) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   377
    BLOCKING_IO_RETURN_INT(s, rs_readv(s, vector, count) );
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   378
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   379
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   380
int RDMA_RecvFrom(int s, void *buf, int len, unsigned int flags,
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   381
        struct sockaddr *from, socklen_t *fromlen) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   382
    BLOCKING_IO_RETURN_INT(s, rs_recvfrom(s, buf, len, flags, from, fromlen));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   383
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   384
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   385
int RDMA_Send(int s, void *msg, int len, unsigned int flags) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   386
    BLOCKING_IO_RETURN_INT(s, rs_send(s, msg, len, flags));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   387
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   388
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   389
int RDMA_WriteV(int s, const struct iovec * vector, int count) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   390
    BLOCKING_IO_RETURN_INT(s, rs_writev(s, vector, count));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   391
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   392
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   393
int NET_RSendTo(int s, const void *msg, int len,  unsigned  int
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   394
       flags, const struct sockaddr *to, int tolen) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   395
    BLOCKING_IO_RETURN_INT(s, rs_sendto(s, msg, len, flags, to, tolen));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   396
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   397
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   398
int RDMA_Accept(int s, struct sockaddr *addr, socklen_t *addrlen) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   399
    BLOCKING_IO_RETURN_INT(s, rs_accept(s, addr, addrlen));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   400
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   401
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   402
int RDMA_Connect(int s, struct sockaddr *addr, int addrlen) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   403
    BLOCKING_IO_RETURN_INT(s, rs_connect(s, addr, addrlen));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   404
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   405
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   406
int RDMA_Poll(struct pollfd *ufds, unsigned int nfds, int timeout) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   407
    BLOCKING_IO_RETURN_INT(ufds[0].fd, rs_poll(ufds, nfds, timeout));
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   408
}
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   409
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   410
int RDMA_Timeout(JNIEnv *env, int s, long timeout, jlong nanoTimeStamp) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   411
    jlong prevNanoTime = nanoTimeStamp;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   412
    jlong nanoTimeout = (jlong)timeout * NET_NSEC_PER_MSEC;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   413
    fdEntry_t *fdEntry = getFdEntry(s);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   414
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   415
    if (fdEntry == NULL) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   416
        errno = EBADF;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   417
        return -1;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   418
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   419
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   420
    for(;;) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   421
        struct pollfd pfd;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   422
        int rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   423
        threadEntry_t self;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   424
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   425
        pfd.fd = s;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   426
        pfd.events = POLLIN | POLLERR;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   427
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   428
        startOp(fdEntry, &self);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   429
        rv = rs_poll(&pfd, 1, nanoTimeout / NET_NSEC_PER_MSEC);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   430
        endOp(fdEntry, &self);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   431
        if (rv < 0 && errno == EINTR) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   432
            jlong newNanoTime = JVM_NanoTime(env, 0);
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   433
            nanoTimeout -= newNanoTime - prevNanoTime;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   434
            if (nanoTimeout < NET_NSEC_PER_MSEC) {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   435
                return 0;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   436
            }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   437
            prevNanoTime = newNanoTime;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   438
        } else {
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   439
            return rv;
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   440
        }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   441
    }
512e7cc6ccce Initial load of JEP 337 implementation
alanb
parents:
diff changeset
   442
}