Files
Mozilla/mozilla/java/pluggable-jvm/wf/src/plugin/jpthreads.c
edburns%acm.org ebef5f4da8 bug=80906
ra=edburns
author=Nikolay Igotti

Major cleanup and new component architecture for Waterfall.


git-svn-id: svn://10.0.0.236/trunk@99134 18797224-902f-48f8-a5cc-f745e15eee43
2001-07-12 19:58:29 +00:00

175 lines
3.8 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: jpthreads.c,v 1.2 2001-07-12 19:58:16 edburns%acm.org Exp $
*
* Contributor(s):
*
* Nikolay N. Igotti <nikolay.igotti@Sun.Com>
*/
#include "jpthreads.h"
#include <stdlib.h>
#ifdef _JVMP_PTHREADS
static pthread_key_t tid_key = (pthread_key_t) -1;
static int inited = 0;
static void cleanup(JVMP_Thread* thr)
{
pthread_t tid;
tid = pthread_self();
if (!thr || (pthread_t)(thr->handle) != tid)
{
fprintf(stderr, "ERROR: tid mismatch!!!!\n");
return;
}
free(thr);
}
JVMP_Thread* ThreadInfoFromPthread()
{
JVMP_Thread* thr = NULL;
if (!inited)
{
pthread_key_create(&tid_key, NULL);
inited = 1;
}
thr = pthread_getspecific(tid_key);
if (thr) return thr;
thr = (JVMP_Thread*)malloc(sizeof(JVMP_Thread));
thr->handle = (long)pthread_self();
thr->id = 0; /* not yet attached */
thr->state = 0; /* XXX: find out state using pthread calls */
thr->cleanup = &cleanup;
thr->data = NULL;
thr->ctx = NULL;
pthread_setspecific(tid_key, thr);
return thr;
}
#endif
#ifdef _JVMP_WIN32THREADS
static int inited = 0;
/* some ideas from JVM Win32 code - I have not so much experience
with low level Windows programming :( */
#define TLS_INVALID_INDEX 0xffffffffUL
static unsigned long tls_index = TLS_INVALID_INDEX;
static void cleanup(JVMP_Thread* thr)
{
unsigned long tid;
tid = (unsigned long)GetCurrentThread();
if (!thr || (unsigned long)(thr->handle) != tid)
{
fprintf(stderr, "ERROR: tid mismatch!!!!\n");
return;
}
free(thr);
}
JVMP_Thread* ThreadInfoFromWthread()
{
JVMP_Thread* thr = NULL;
if (!inited)
{
tls_index = TlsAlloc();
if (tls_index == TLS_INVALID_INDEX) {
fprintf(stderr, "ERROR: cannot create TLS\n");
return NULL;
}
inited = 1;
}
thr = TlsGetValue(tls_index);
if (thr) return thr;
thr = (JVMP_Thread*)malloc(sizeof(JVMP_Thread));
thr->handle = (long)GetCurrentThread();
thr->id = 0; /* not yet attached */
thr->state = 0; /* XXX: find out state using Win32 calls */
thr->cleanup = &cleanup;
thr->data = NULL;
thr->ctx = NULL;
TlsSetValue(tls_index, thr);
return thr;
}
#endif
#ifdef XP_UNIX
dll_t JVMP_LoadDLL(const char* filename, int mode)
{
return dlopen(filename, mode);
}
void* JVMP_FindSymbol(dll_t dll, const char* sym)
{
return dlsym(dll, sym);
}
int JVMP_UnloadDLL(dll_t dll)
{
return dlclose(dll);
}
const char* JVMP_LastDLLErrorString()
{
return dlerror();
}
#endif
#ifdef XP_WIN32
dll_t JVMP_LoadDLL(const char* filename, int mode)
{
return LoadLibrary(filename);
}
void* JVMP_FindSymbol(dll_t dll, const char* sym)
{
return GetProcAddress(dll, sym);
}
int JVMP_UnloadDLL(dll_t dll)
{
/* XXX: fix me */
return 0;
}
const char* JVMP_LastDLLErrorString()
{
static LPVOID lpMsgBuf = NULL;
free(lpMsgBuf);
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL );
return lpMsgBuf;
}
#endif