зеркало из https://github.com/mozilla/gecko-dev.git
149 строки
5.6 KiB
C
149 строки
5.6 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is The Waterfall Java Plugin Module
|
|
*
|
|
* The Initial Developer of the Original Code is Sun Microsystems Inc
|
|
* Portions created by Sun Microsystems Inc are Copyright (C) 2001
|
|
* All Rights Reserved.
|
|
*
|
|
* $Id: shmtran.h,v 1.2 2001/07/12 19:58:08 edburns%acm.org Exp $
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* Nikolay N. Igotti <nikolay.igotti@Sun.Com>
|
|
*/
|
|
|
|
#ifndef _JVMP_SHMTRAN_H
|
|
#define _JVMP_SHMTRAN_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#include "jvmp_caps.h"
|
|
#ifdef JVMP_USE_SHM
|
|
#include <sys/types.h>
|
|
#include <sys/shm.h>
|
|
#include <sys/ipc.h>
|
|
#include <sys/msg.h>
|
|
#include <sys/fcntl.h>
|
|
#endif
|
|
/**
|
|
* SHM transport used by Waterfall in out of proc situation.
|
|
* Typical usage is:
|
|
* Host -> libjvmp.so ->(JNI) Java implementation (no shm case, same process)
|
|
* Host -> libjvmp_shm.so -> (forward request with SHM) ->
|
|
* jvmp process ->(JNI) Java implementation
|
|
* Consider event sending, as generic enough:
|
|
* jint JVMP_SendEvent(JVMP_ExecutionContext* ctx,
|
|
* jint target, jint event, jlong data)
|
|
* To use this transport we need:
|
|
* in JVMP_GetPlugin():
|
|
* - create message queue, using msgget().
|
|
* - start helper JVM process with argument - this queue ID
|
|
* - wait until JVMP send us a message, that it started msg loop
|
|
* in JVMP_GetContext():
|
|
* - fill reserved field with message queue ID
|
|
* in JVMP_SendEvent():
|
|
* - using message queue ID from ctx create SHM request
|
|
* XXX: outdated comment - see sources
|
|
*/
|
|
|
|
struct JVMP_ShmRequest
|
|
{
|
|
unsigned long rid; /* msg ID of message used to pass this request */
|
|
int msg_id; /* ID of message queue */
|
|
unsigned int func_no; /* number of function in JVMP_Context */
|
|
int retval; /* returned by function value */
|
|
int argc; /* number of function arguments */
|
|
char* argt; /* string of arguments types, encoded by chars:
|
|
I - int, J - long, C - character,
|
|
S - zero terminated string, P - any pointer
|
|
also possible to pass/return values - like C's "&" -
|
|
use low register letters
|
|
i - int, j - long, c - character,
|
|
and pass arbitrary length structures:
|
|
A[40] - 40 bytes of data passed
|
|
a[40] - 40 bytes passed/returned.
|
|
If you don't know exact length of returned value
|
|
just pass a[0], but then you must set to 1
|
|
parameter alloc_ref of JVMP_DecodeRequest. */
|
|
int nullmask; /* bitmask of pointers args == 0.
|
|
So you shouldn't
|
|
pass meaningfull == 0 pointers
|
|
as > 32th argument ;) */
|
|
int length; /* length of data */
|
|
char* data; /* marshaled arguments */
|
|
int shmlen; /* length of shm data */
|
|
int shmid; /* cached shmid of this request's data */
|
|
JVMP_SecurityCap caps; /* capabilities of this call */
|
|
char* shmdata; /* marshalled request in SHM */
|
|
};
|
|
|
|
typedef struct JVMP_ShmRequest JVMP_ShmRequest;
|
|
typedef void* jpointer;
|
|
|
|
#ifdef JVMP_USE_SHM
|
|
JVMP_ShmRequest*
|
|
JVMP_NewShmReq(int msg_id, unsigned int func_no);
|
|
/* JVMP_ShmRequest* JVMP_NewEncodedShmReq(int msg_id, unsigned int func_no, */
|
|
/* char* sign, ...); */
|
|
int JVMP_EncodeRequest(JVMP_ShmRequest* req,
|
|
char* sign, ...);
|
|
int JVMP_DecodeRequest(JVMP_ShmRequest* req, int alloc_ref,
|
|
char* sign, ...);
|
|
int JVMP_DeleteShmReq(JVMP_ShmRequest* req);
|
|
int JVMP_GetArgSize(JVMP_ShmRequest* req, int argno);
|
|
int JVMP_SendShmRequest(JVMP_ShmRequest* req, int sync);
|
|
int JVMP_RecvShmRequest(int msg_id, int sync, JVMP_ShmRequest* *preq);
|
|
int JVMP_ExecuteShmRequest(JVMP_ShmRequest* req);
|
|
int JVMP_ConfirmShmRequest(JVMP_ShmRequest* req);
|
|
int JVMP_WaitConfirmShmRequest(JVMP_ShmRequest* req);
|
|
/* Argument is side on which transport is used, if in
|
|
* separate process situation (0 - not separate process case
|
|
* 1 - host side, 2 - JVM side).
|
|
*/
|
|
int JVMP_ShmInit(int side);
|
|
void JVMP_ShmShutdown();
|
|
int JVMP_ShmMessageLoop(int msg_id);
|
|
int JVMP_msgget(key_t key, int msgflg);
|
|
void* JVMP_shmat(int shmid, const void *shmaddr, int shmflg);
|
|
int JVMP_shmget(key_t key, int size, int shmflg);
|
|
int JVMP_shmdt(const void *shmaddr, int shmid);
|
|
|
|
struct JVMP_ShmMessage
|
|
{
|
|
long mtype;
|
|
int message; /* also used to save returned by function value */
|
|
int shm_id; /* also used to indicate that memory size changed */
|
|
int shm_len; /* also used to show updated len */
|
|
};
|
|
|
|
typedef struct JVMP_ShmMessage JVMP_ShmMessage;
|
|
|
|
|
|
#define IS_NULL_VAL(req, argn) (req->nullmask & (0x1 << (argn - 1)))
|
|
/* this one defines base for user function numbers - i.e. use
|
|
to numerate your functions use
|
|
JVMP_USER_BASE + MY_VENDOR_ID*10000 + funcno */
|
|
#define JVMP_USER_BASE 1000
|
|
#define JVMP_NEW_EXT_FUNCNO(_vendorID, _funcno) \
|
|
(JVMP_USER_BASE+_vendorID*10000+_funcno)
|
|
#define JVMP_GET_VENDOR(_extfuncno) \
|
|
((_extfuncno - JVMP_USER_BASE) / 10000)
|
|
#define JVMP_GET_EXT_FUNCNO(_funcno) \
|
|
(_funcno-JVMP_USER_BASE -JVMP_GET_VENDOR(_funcno)*10000)
|
|
#endif /* JVMP_USE_SHM */
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
#endif
|