Annotation of sbbs/src/sbbs3/js_request.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <stdlib.h>
                      3: #include <string.h>
                      4: 
                      5: #ifdef __unix__
                      6:        #define XP_UNIX
                      7: #else
                      8:        #define XP_PC
                      9:        #define XP_WIN
                     10: #endif
                     11: 
                     12: #define JS_THREADSAFE
                     13: #include <jsapi.h>
                     14: #include "threadwrap.h"
                     15: #include "js_request.h"
                     16: 
                     17: #ifdef DEBUG_JS_REQUESTS
                     18: 
                     19: #define DEBUG
                     20: #include <jscntxt.h>
                     21: 
                     22: enum last_request_type {
                     23:         LAST_REQUEST_TYPE_NONE
                     24:        ,LAST_REQUEST_TYPE_BEGIN
                     25:        ,LAST_REQUEST_TYPE_END
                     26:        ,LAST_REQUEST_TYPE_SUSPEND
                     27:        ,LAST_REQUEST_TYPE_RESUME
                     28: };
                     29: static const char *type_names[5]={"None", "BeginRequest", "EndRequest", "SuspendRequest", "ResumeRequest"};
                     30: 
                     31: struct request_log {
                     32:        JSContext*                              cx;
                     33:        enum last_request_type  type;
                     34:        const char*                             file;
                     35:        unsigned long                   line;
                     36:        struct request_log*             next;
                     37:        struct request_log*             prev;
                     38: };
                     39: 
                     40: static struct request_log* first_request;
                     41: static int initialized=0;
                     42: static pthread_mutex_t req_mutex;
                     43: static char str[1024];
                     44: 
                     45: static void logstr(void)
                     46: {
                     47:        FILE *f;
                     48: 
                     49:        if((f=fopen("../data/logs/JS_RequestErrors.log", "a"))!=NULL) {
                     50:                fputs(str, f);
                     51:                fclose(f);
                     52:        }
                     53:        else {
                     54:                fputs(str, stderr);
                     55:        }
                     56: }
                     57: 
                     58: static struct request_log *match_request(JSContext *cx)
                     59: {
                     60:        struct request_log *ent;
                     61: 
                     62:        for(ent=first_request; ent != NULL; ent=ent->next) {
                     63:                if(ent->cx==cx)
                     64:                        return(ent);
                     65:        }
                     66: 
                     67:        ent=malloc(sizeof(struct request_log));
                     68:        if(ent != NULL) {
                     69:                memset(ent, 0, sizeof(struct request_log));
                     70:                ent->cx=cx;
                     71:                ent->type=LAST_REQUEST_TYPE_NONE;
                     72:                ent->prev=NULL;
                     73:                ent->next=first_request;
                     74:                if(first_request != NULL) {
                     75:                        first_request->prev=ent;
                     76:                }
                     77:                first_request=ent;
                     78:                return(ent);
                     79:        }
                     80:        return(NULL);
                     81: }
                     82: 
                     83: static void initialize_request(void)
                     84: {
                     85:        pthread_mutex_init(&req_mutex, NULL);
                     86:        initialized=1;
                     87: }
                     88: 
                     89: void js_debug_beginrequest(JSContext *cx, const char *file, unsigned long line)
                     90: {
                     91:        struct request_log *req;
                     92: 
                     93:        if(!initialized)
                     94:                initialize_request();
                     95:        pthread_mutex_lock(&req_mutex);
                     96:        req=match_request(cx);
                     97:        if(req==NULL) {
                     98:                strcpy(str,"Missing req in Begin\n");
                     99:                logstr();
                    100:                return;
                    101:        }
                    102:        switch(req->type) {
                    103:        case LAST_REQUEST_TYPE_NONE:
                    104:        case LAST_REQUEST_TYPE_END:
                    105:                break;
                    106:        case LAST_REQUEST_TYPE_BEGIN:
                    107:        case LAST_REQUEST_TYPE_SUSPEND:
                    108:        case LAST_REQUEST_TYPE_RESUME:
                    109:                sprintf(str,"Begin after %s from %s:%u at %s:%u (%p)\n",type_names[req->type],req->file,req->line,file,line,req->cx);
                    110:                logstr();
                    111:                break;
                    112:        }
                    113:        switch(cx->requestDepth) {
                    114:        case 0:
                    115:                break;
                    116:        case 1:
                    117:        default:
                    118:                sprintf(str,"depth=%u at Begin after %s from %s:%u at %s:%u (%p)\n",cx->requestDepth,type_names[req->type],req->file,req->line,file,line,req->cx);
                    119:                logstr();
                    120:                break;
                    121:        }
                    122: 
                    123:        req->type=LAST_REQUEST_TYPE_BEGIN;
                    124:        req->file=file;
                    125:        req->line=line;
                    126:        JS_BeginRequest(cx);
                    127:        pthread_mutex_unlock(&req_mutex);
                    128: }
                    129: 
                    130: void js_debug_endrequest(JSContext *cx, const char *file, unsigned long line)
                    131: {
                    132:        struct request_log *req;
                    133: 
                    134:        if(!initialized)
                    135:                initialize_request();
                    136:        pthread_mutex_lock(&req_mutex);
                    137:        req=match_request(cx);
                    138:        if(req==NULL) {
                    139:                strcpy(str,"Missing req in End\n");
                    140:                logstr();
                    141:                return;
                    142:        }
                    143:        switch(req->type) {
                    144:        case LAST_REQUEST_TYPE_BEGIN:
                    145:                if(req->file) {
                    146:                        if(strcmp(req->file, file) != 0 || line < req->line) {
                    147:                                sprintf(str,"Suspicious End after %s from %s:%u at %s:%u (%p)\n",type_names[req->type],req->file,req->line,file,line,req->cx);
                    148:                        }
                    149:                        break;
                    150:                }
                    151:        case LAST_REQUEST_TYPE_RESUME:
                    152:                break;
                    153:        case LAST_REQUEST_TYPE_NONE:
                    154:        case LAST_REQUEST_TYPE_END:
                    155:        case LAST_REQUEST_TYPE_SUSPEND:
                    156:                sprintf(str,"End after %s from %s:%u at %s:%u (%p)\n",type_names[req->type],req->file,req->line,file,line,req->cx);
                    157:                logstr();
                    158:                break;
                    159:        }
                    160:        switch(cx->requestDepth) {
                    161:        case 0:
                    162:        default:
                    163:                sprintf(str,"depth=%u at End after %s from %s:%u at %s:%u (%p)\n",cx->requestDepth,type_names[req->type],req->file,req->line,file,line,req->cx);
                    164:                logstr();
                    165:                break;
                    166:        case 1:
                    167:                break;
                    168:        }
                    169: 
                    170:        req->type=LAST_REQUEST_TYPE_END;
                    171:        req->file=file;
                    172:        req->line=line;
                    173:        JS_EndRequest(cx);
                    174:        if(cx->requestDepth==0) {
                    175:                if(req->prev != NULL)
                    176:                        req->prev->next=req->next;
                    177:                if(req->next != NULL)
                    178:                        req->next->prev=req->prev;
                    179:                if(first_request==req) {
                    180:                        if(req->prev != NULL)
                    181:                                first_request=req->prev;
                    182:                        else
                    183:                                first_request=req->next;
                    184:                }
                    185:                free(req);
                    186:        }
                    187:        pthread_mutex_unlock(&req_mutex);
                    188: }
                    189: 
                    190: jsrefcount js_debug_suspendrequest(JSContext *cx, const char *file, unsigned long line)
                    191: {
                    192:        struct request_log *req;
                    193:        jsrefcount ret;
                    194: 
                    195:        if(!initialized)
                    196:                initialize_request();
                    197:        pthread_mutex_lock(&req_mutex);
                    198:        req=match_request(cx);
                    199:        if(req==NULL) {
                    200:                strcpy(str,"Missing req in Suspend\n");
                    201:                logstr();
                    202:                return -1;
                    203:        }
                    204:        switch(req->type) {
                    205:        case LAST_REQUEST_TYPE_BEGIN:
                    206:        case LAST_REQUEST_TYPE_RESUME:
                    207:                break;
                    208:        case LAST_REQUEST_TYPE_NONE:
                    209:                if(req->file==NULL)                     /* Assumed to be a provided request */
                    210:                        break;
                    211:        case LAST_REQUEST_TYPE_END:
                    212:        case LAST_REQUEST_TYPE_SUSPEND:
                    213:                sprintf(str,"Suspend after %s from %s:%u at %s:%u (%p)\n",type_names[req->type],req->file,req->line,file,line,req->cx);
                    214:                logstr();
                    215:                break;
                    216:        }
                    217:        switch(cx->requestDepth) {
                    218:        case 0:
                    219:        default:
                    220:                sprintf(str,"depth=%u at Suspend after %s from %s:%u at %s:%u (%p)\n",cx->requestDepth,type_names[req->type],req->file,req->line,file,line,req->cx);
                    221:                logstr();
                    222:                break;
                    223:        case 1:
                    224:                break;
                    225:        }
                    226: 
                    227:        req->type=LAST_REQUEST_TYPE_SUSPEND;
                    228:        req->file=file;
                    229:        req->line=line;
                    230:        ret=JS_SuspendRequest(cx);
                    231:        pthread_mutex_unlock(&req_mutex);
                    232:        return(ret);
                    233: }
                    234: 
                    235: void js_debug_resumerequest(JSContext *cx, jsrefcount rc, const char *file, unsigned long line)
                    236: {
                    237:        struct request_log *req;
                    238: 
                    239:        if(!initialized)
                    240:                initialize_request();
                    241:        pthread_mutex_lock(&req_mutex);
                    242:        req=match_request(cx);
                    243:        if(req==NULL) {
                    244:                strcpy(str,"Missing req in Resume\n");
                    245:                logstr();
                    246:                return;
                    247:        }
                    248:        switch(req->type) {
                    249:        case LAST_REQUEST_TYPE_SUSPEND:
                    250:                break;
                    251:        case LAST_REQUEST_TYPE_NONE:
                    252:        case LAST_REQUEST_TYPE_END:
                    253:        case LAST_REQUEST_TYPE_BEGIN:
                    254:        case LAST_REQUEST_TYPE_RESUME:
                    255:                sprintf(str,"Resume after %s from %s:%u at %s:%u (%p)\n",type_names[req->type],req->file,req->line,file,line,req->cx);
                    256:                logstr();
                    257:                break;
                    258:        }
                    259:        switch(cx->requestDepth) {
                    260:        case 1:
                    261:        default:
                    262:                sprintf(str,"depth=%u at Suspend after %s from %s:%u at %s:%u (%p)\n",cx->requestDepth,type_names[req->type],req->file,req->line,file,line,req->cx);
                    263:                logstr();
                    264:                break;
                    265:        case 0:
                    266:                break;
                    267:        }
                    268: 
                    269:        req->type=LAST_REQUEST_TYPE_RESUME;
                    270:        req->file=file;
                    271:        req->line=line;
                    272:        JS_ResumeRequest(cx, rc);
                    273:        pthread_mutex_unlock(&req_mutex);
                    274: }
                    275: 
                    276: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.