midp_thread.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 154 行
C
154 行
/* * * * 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 <stdlib.h>#include <kni.h>#include <jvm.h>#include <jvmspi.h>#include <sni.h>#include <midp_logging.h>#include <midp_thread.h>static VmThreadTimesliceProc vm_thread_timeslice_proc = NULL;/** * Sets the routine for implementation-specific request for a VM time slice. * This routine will be called every time after a VM thread is unblocked. * If NULL is passed as an argument, no requests will be done. * * @param p routine to request for a VM time slice */void midp_thread_set_timeslice_proc(VmThreadTimesliceProc p) { vm_thread_timeslice_proc = p;}/** * Blocks the current Java thread. The MidpReentryData block for * the current Java thread is set to the passed values. * * @param waitingFor set into MidpReentryData.waitingFor * @param descriptor set into MidpReentryData.descriptor * @param pResult set into MidpReentryData.pResult */void midp_thread_wait(midpSignalType waitingFor, int descriptor, void* pResult){ MidpReentryData* p = (MidpReentryData*)SNI_GetReentryData(NULL); if (p == NULL) { p = (MidpReentryData*) (SNI_AllocateReentryData(sizeof (MidpReentryData))); if (p == NULL) { REPORT_CRIT(LC_CORE, "midp_cond_wait: failed to allocate reentry data"); } } p->descriptor = descriptor; p->waitingFor = waitingFor; p->status = 0; p->pResult = pResult; SNI_BlockThread();}/** * Find and unblock all Java threads based on what the thread is waiting * for and which descriptor it is waiting on. * * @param waitingFor used to match MidpReentryData.waitingFor * @param descriptor used to match MidpReentryData.descriptor * @param status the value stored into MidpReentryData.status for every * thread that is unblocked */void midp_thread_signal(midpSignalType waitingFor, int descriptor, int status){ int blocked_threads_count; JVMSPI_BlockedThreadInfo *blocked_threads; blocked_threads = SNI_GetBlockedThreads(&blocked_threads_count); midp_thread_signal_list(blocked_threads, blocked_threads_count, waitingFor, descriptor, status);}/** * Find and unblock all Java threads based on what the thread is waiting * for and which descriptor it is waiting on. * * @param blocked_threads list of blocked threads * @param blocked_threads_count number of blocked threads in the list * @param waitingFor used to match MidpReentryData.waitingFor * @param descriptor used to match MidpReentryData.descriptor * @param status the value stored into MidpReentryData.status for every * thread that is unblocked */void midp_thread_signal_list( JVMSPI_BlockedThreadInfo *blocked_threads, int blocked_threads_count, midpSignalType waitingFor, int descriptor, int status){ int i; MidpReentryData* pThreadReentryData; for (i = 0; i < blocked_threads_count; i++) { pThreadReentryData = (MidpReentryData*)(blocked_threads[i].reentry_data); if (pThreadReentryData != NULL && pThreadReentryData->descriptor == descriptor && pThreadReentryData->waitingFor == waitingFor) { pThreadReentryData->status = status; midp_thread_unblock(blocked_threads[i].thread_id); } }}/** * A midp internal function that unblocks the given Java thread. This should * be called in preference to calling SNI_UnblockThread directly, since * depending upon how the VM is scheduled (master mode or slave mode) * additional work may need to be done. In particular, in slave mode, this * function will need to arrange for a VM time slice to occur quickly. * * @param thr the Java thread to unblock */voidmidp_thread_unblock(JVMSPI_ThreadID thr) { /* * Tell the VM to unblock the thread, and then tell the platform-specific * code to schedule the VM. */ SNI_UnblockThread(thr); if (vm_thread_timeslice_proc != NULL) { vm_thread_timeslice_proc(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?