|
|
1.1 ! root 1: /* $Id: js_rtpool.c,v 1.18 2010/04/03 00:16:53 deuce Exp $ */ ! 2: ! 3: #include "js_rtpool.h" ! 4: #include <threadwrap.h> /* Must be included after jsapi.h */ ! 5: ! 6: #ifdef DLLCALL ! 7: #undef DLLCALL ! 8: #endif ! 9: #ifdef _WIN32 ! 10: #ifdef __BORLANDC__ ! 11: #define DLLCALL __stdcall ! 12: #else ! 13: #define DLLCALL ! 14: #endif ! 15: #else /* !_WIN32 */ ! 16: #define DLLCALL ! 17: #endif ! 18: ! 19: #define SHARED_RUNTIMES ! 20: ! 21: struct jsrt_queue { ! 22: JSRuntime *rt; ! 23: int created; ! 24: #ifdef SHARED_RUNTIMES ! 25: const char* file; ! 26: long line; ! 27: #else ! 28: int maxbytes; ! 29: int used; ! 30: #endif ! 31: }; ! 32: ! 33: #define JSRT_QUEUE_SIZE 128 ! 34: struct jsrt_queue jsrt_queue[JSRT_QUEUE_SIZE]; ! 35: static pthread_mutex_t jsrt_mutex; ! 36: static int initialized=0; ! 37: #ifndef SHARED_RUNTIMES ! 38: static sem_t jsrt_sem; ! 39: #endif ! 40: ! 41: JSRuntime * DLLCALL jsrt_GetNew(int maxbytes, unsigned long timeout, const char *filename, long line) ! 42: { ! 43: #ifdef SHARED_RUNTIMES ! 44: int i; ! 45: ! 46: if(!initialized) { ! 47: pthread_mutex_init(&jsrt_mutex, NULL); ! 48: initialized=TRUE; ! 49: } ! 50: ! 51: pthread_mutex_lock(&jsrt_mutex); ! 52: for(i=0; i<JSRT_QUEUE_SIZE; i++) { ! 53: if(!jsrt_queue[i].created) { ! 54: jsrt_queue[i].rt=JS_NewRuntime(maxbytes); ! 55: if(jsrt_queue[i].rt != NULL) { ! 56: jsrt_queue[i].file=filename; ! 57: jsrt_queue[i].line=line; ! 58: jsrt_queue[i].created=1; ! 59: } ! 60: } ! 61: if(jsrt_queue[i].created && jsrt_queue[i].file == filename && jsrt_queue[i].line == line) { ! 62: pthread_mutex_unlock(&jsrt_mutex); ! 63: return(jsrt_queue[i].rt); ! 64: } ! 65: } ! 66: pthread_mutex_unlock(&jsrt_mutex); ! 67: ! 68: return(NULL); ! 69: #else ! 70: int i; ! 71: int last_unused=-1; ! 72: ! 73: if(!initialized) { ! 74: pthread_mutex_init(&jsrt_mutex, NULL); ! 75: sem_init(&jsrt_sem, 0, JSRT_QUEUE_SIZE); ! 76: initialized=TRUE; ! 77: } ! 78: ! 79: if(sem_trywait_block(&jsrt_sem, timeout)==0) { ! 80: pthread_mutex_lock(&jsrt_mutex); ! 81: for(i=0; i<JSRT_QUEUE_SIZE; i++) { ! 82: if(!jsrt_queue[i].created) { ! 83: jsrt_queue[i].rt=JS_NewRuntime(maxbytes); ! 84: if(jsrt_queue[i].rt != NULL) { ! 85: jsrt_queue[i].maxbytes=maxbytes; ! 86: jsrt_queue[i].created=1; ! 87: jsrt_queue[i].used=0; ! 88: } ! 89: } ! 90: if(!jsrt_queue[i].used) { ! 91: last_unused=i; ! 92: if(jsrt_queue[i].created && jsrt_queue[i].maxbytes == maxbytes) { ! 93: jsrt_queue[i].used=1; ! 94: pthread_mutex_unlock(&jsrt_mutex); ! 95: return(jsrt_queue[i].rt); ! 96: } ! 97: } ! 98: } ! 99: ! 100: if(last_unused != -1) { ! 101: jsrt_queue[last_unused].used=1; ! 102: pthread_mutex_unlock(&jsrt_mutex); ! 103: return(jsrt_queue[last_unused].rt); ! 104: } ! 105: pthread_mutex_unlock(&jsrt_mutex); ! 106: } ! 107: ! 108: return(NULL); ! 109: #endif ! 110: } ! 111: ! 112: void DLLCALL jsrt_Release(JSRuntime *rt) ! 113: { ! 114: #ifdef SHARED_RUNTIMES ! 115: #else ! 116: int i; ! 117: ! 118: for(i=0; i<JSRT_QUEUE_SIZE; i++) { ! 119: if(rt==jsrt_queue[i].rt) { ! 120: pthread_mutex_lock(&jsrt_mutex); ! 121: jsrt_queue[i].used=0; ! 122: /* TODO: Clear "stuff"? */ ! 123: pthread_mutex_unlock(&jsrt_mutex); ! 124: sem_post(&jsrt_sem); ! 125: } ! 126: } ! 127: #endif ! 128: } ! 129: ! 130: void DLLCALL jsrt_TriggerAll(void) ! 131: { ! 132: #ifdef USE_JS_OPERATION_CALLBACK ! 133: int i; ! 134: int j; ! 135: JSContext *iterp,*cx; ! 136: ! 137: if(!initialized) ! 138: return; ! 139: for(i=0; i<JSRT_QUEUE_SIZE; i++) { ! 140: pthread_mutex_lock(&jsrt_mutex); ! 141: #ifdef SHARED_RUNTIMES ! 142: if(jsrt_queue[i].created) { ! 143: #else ! 144: if(jsrt_queue[i].used) { ! 145: #endif ! 146: iterp=NULL; ! 147: while((cx = JS_ContextIterator(jsrt_queue[i].rt, &iterp)) != NULL) ! 148: JS_TriggerOperationCallback(cx); ! 149: } ! 150: pthread_mutex_unlock(&jsrt_mutex); ! 151: } ! 152: #endif ! 153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.