socket_notify_export.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 135 行

C
135
字号
/* *    * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */#include <kni.h>#include <sni.h>#include <commonKNIMacros.h>#include <ROMStructs.h>#include <midpError.h>#include <push_server_export.h>#include <midp_properties_port.h>#include <midp_logging.h>#include <midpResourceLimit.h>#include <string.h>#include <pcsl_network.h>#include <midpServices.h>#include <midp_thread.h>#include <socket_notify_export.h>/** * @file *  * The default implementation of the native functions that are needed * for supporting the "socket:" Generic Connection protocols. *//* * IMPL NOTE: the coupling between platform-specific code (i.e., PCSL) and the  * functions in this file is ill-defined. NotifySocketStatusChanged() is a * "hidden" upcall from platform-specific code. The value of waitingFor is not  * the full set of midpSignalType values from midpServices.h, but instead is  * one of SD_RECV (0) or SD_SEND (1). */#define SD_RECV   0#define SD_SEND   1/** * Find the first thread that can be unblocked for a given handle  * and signal type. * * @param handle Platform specific handle * @param signalType Enumerated signal type  * * @return JVMSPI_ThreadID Java thread id that can be unblocked */static JVMSPI_ThreadIDgetBlockedThreadFromHandle(long handle, int waitingFor) {    JVMSPI_BlockedThreadInfo *blocked_threads;    int n;    int i;     blocked_threads = SNI_GetBlockedThreads(&n);      for (i = 0; i < n; i++) {        MidpReentryData *p =             (MidpReentryData*)(blocked_threads[i].reentry_data);        if (p == NULL) {            continue;        }        /* wait policy: 1. threads waiting for network reads                        2. threads waiting for network writes                        3. threads waiting for network push event*/        if (waitingFor == SD_RECV && p->waitingFor == NETWORK_READ_SIGNAL &&                p->descriptor == handle) {            return blocked_threads[i].thread_id;        }            if (waitingFor == SD_SEND && p->waitingFor == NETWORK_WRITE_SIGNAL &&                p->descriptor == handle) {            return blocked_threads[i].thread_id;        }        if ((p->waitingFor == PUSH_SIGNAL) &&             (findPushBlockedHandle(handle) != 0)) {            /*             * Slave Mode (Qt-sockets only)             * No need to explicitly disable the read and write notifiers              * for Qt sockets as it is done immediately upon receiving a              * callback in PCSL Qt-library code (readableSlot() and              * writeableSlot()               */            return blocked_threads[i].thread_id;        }    }      return 0;}/** * Unblock a Java thread and wakeup the VM * * @param handle Platform specific handle * @param signalType Enumerated signal type  * */void NotifySocketStatusChanged(long handle, int waitingFor) {     JVMSPI_ThreadID id = getBlockedThreadFromHandle(handle, waitingFor);    if (id != 0) {        midp_thread_unblock(id);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?