[BACK]Return to ox.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2018 / io

Annotation of OpenXM_contrib2/asir2018/io/ox.c, Revision 1.1

1.1     ! noro        1: /*
        !             2:  * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
        !             6:  * non-exclusive and royalty-free license to use, copy, modify and
        !             7:  * redistribute, solely for non-commercial and non-profit purposes, the
        !             8:  * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
        !             9:  * conditions of this Agreement. For the avoidance of doubt, you acquire
        !            10:  * only a limited right to use the SOFTWARE hereunder, and FLL or any
        !            11:  * third party developer retains all rights, including but not limited to
        !            12:  * copyrights, in and to the SOFTWARE.
        !            13:  *
        !            14:  * (1) FLL does not grant you a license in any way for commercial
        !            15:  * purposes. You may use the SOFTWARE only for non-commercial and
        !            16:  * non-profit purposes only, such as academic, research and internal
        !            17:  * business use.
        !            18:  * (2) The SOFTWARE is protected by the Copyright Law of Japan and
        !            19:  * international copyright treaties. If you make copies of the SOFTWARE,
        !            20:  * with or without modification, as permitted hereunder, you shall affix
        !            21:  * to all such copies of the SOFTWARE the above copyright notice.
        !            22:  * (3) An explicit reference to this SOFTWARE and its copyright owner
        !            23:  * shall be made on your publication or presentation in any form of the
        !            24:  * results obtained by use of the SOFTWARE.
        !            25:  * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
        !            26:  * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
        !            27:  * for such modification or the source code of the modified part of the
        !            28:  * SOFTWARE.
        !            29:  *
        !            30:  * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
        !            31:  * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
        !            32:  * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
        !            33:  * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
        !            34:  * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
        !            35:  * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
        !            36:  * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
        !            37:  * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
        !            38:  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
        !            39:  * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
        !            40:  * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
        !            41:  * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
        !            42:  * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
        !            43:  * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
        !            44:  * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
        !            45:  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
        !            46:  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
        !            47:  * $OpenXM$
        !            48: */
        !            49: #include "ca.h"
        !            50: #include "parse.h"
        !            51: #include "signal.h"
        !            52: #include "wsio.h"
        !            53: #include "ox.h"
        !            54:
        !            55: #define ISIZ sizeof(int)
        !            56:
        !            57: extern Obj VOIDobj;
        !            58:
        !            59: extern int nserver_102, myrank_102;
        !            60: extern int ox_need_conv;
        !            61: int ox_usr1_sent, ox_int_received, critical_when_signal;
        !            62: unsigned int ox_serial;
        !            63: int ox_flushing;
        !            64: int ox_batch;
        !            65: int ox_check=1;
        !            66: int ox_exchange_mathcap=1;
        !            67: JMP_BUF ox_env;
        !            68:
        !            69: MATHCAP my_mathcap;
        !            70:
        !            71: struct oxcap {
        !            72:   unsigned int ox;
        !            73:   int ncap;
        !            74:   int *cap;
        !            75: };
        !            76:
        !            77: struct mathcap {
        !            78:   LIST mc;
        !            79:   unsigned int version;
        !            80:   char *servername;
        !            81:   int nsmcap;
        !            82:   unsigned int *smcap;
        !            83:   int noxcap;
        !            84:   struct oxcap *oxcap;
        !            85:   int no_ox_reset;
        !            86: };
        !            87:
        !            88: struct oxcap *my_oxcap;
        !            89:
        !            90: static struct mathcap my_mc;
        !            91: static struct mathcap *remote_mc;
        !            92: static int remote_mc_len;
        !            93:
        !            94: void mclist_to_mc(LIST mclist,struct mathcap *mc);
        !            95: Obj asir_pop_one();
        !            96: void asir_push_one(Obj);
        !            97:
        !            98: #if defined(VISUAL) || defined(__MINGW32__)
        !            99: /* XXX : mainly used in engine2000/io.c, but declared here */
        !           100: typedef void *HANDLE;
        !           101: HANDLE hStreamNotify,hStreamNotify_Ack;
        !           102:
        !           103: void cleanup_events()
        !           104: {
        !           105:   /* ox_watch_stream may be waiting for hStreamNotify_Ack to be set */
        !           106:
        !           107:   ResetEvent(hStreamNotify);
        !           108:   SetEvent(hStreamNotify_Ack);
        !           109: }
        !           110: #endif
        !           111:
        !           112: /* 1 if no_ox_reset, 0 if ox_reset OK, -1 if invalid */
        !           113: int no_ox_reset(int s)
        !           114: {
        !           115:   if ( remote_mc && s >= 0 && s < remote_mc_len )
        !           116:     return remote_mc[s].no_ox_reset;
        !           117:   else
        !           118:     return -1;
        !           119: }
        !           120:
        !           121: void ox_resetenv(char *s)
        !           122: {
        !           123: #if defined(VISUAL) || defined(__MINGW32__)
        !           124:   cleanup_events();
        !           125: #endif
        !           126:   fprintf(stderr,"%s\n",s);
        !           127:   LONGJMP(ox_env,1);
        !           128: }
        !           129:
        !           130: static int available_cmo[] = {
        !           131:   CMO_NULL, CMO_INT32, CMO_DATUM, CMO_STRING, CMO_MATHCAP,
        !           132:   CMO_ERROR, CMO_ERROR2, CMO_LIST, CMO_MONOMIAL32,
        !           133:   CMO_ZZ, CMO_QQ, CMO_ZERO,
        !           134:   CMO_DMS_GENERIC, CMO_DMS_OF_N_VARIABLES,
        !           135:   CMO_RING_BY_NAME, CMO_DISTRIBUTED_POLYNOMIAL,
        !           136:     CMO_RATIONAL,
        !           137:   CMO_RECURSIVE_POLYNOMIAL, CMO_UNIVARIATE_POLYNOMIAL,
        !           138:   CMO_INDETERMINATE,
        !           139:   CMO_TREE, CMO_BIGFLOAT32, CMO_COMPLEX,
        !           140:   0
        !           141: };
        !           142:
        !           143: static int asir_available_sm[] = {
        !           144:   SM_dupErrors, SM_getsp, SM_popSerializedLocalObject,
        !           145:   SM_popCMO, SM_popString, SM_pushCMOtag, SM_setName,
        !           146:   SM_evalName, SM_executeStringByLocalParser,
        !           147:   SM_executeStringByLocalParserInBatchMode,
        !           148:   SM_executeFunction, SM_shutdown, SM_pops,
        !           149:   SM_mathcap, SM_setMathcap, SM_nop,
        !           150:   SM_beginBlock, SM_endBlock,
        !           151:   0
        !           152: };
        !           153:
        !           154: static int ox_asir_available_sm[] = {
        !           155:   SM_dupErrors, SM_getsp, SM_popSerializedLocalObject,
        !           156:   SM_popCMO, SM_popString, SM_pushCMOtag, SM_setName,
        !           157:   SM_evalName, SM_executeStringByLocalParser,
        !           158:   SM_executeStringByLocalParserInBatchMode,
        !           159:   SM_executeFunction, SM_shutdown, SM_pops,
        !           160:   SM_mathcap, SM_setMathcap, SM_nop,
        !           161:   SM_beginBlock, SM_endBlock,  SM_executeFunctionSync,
        !           162:   SM_set_rank_102, SM_tcp_accept_102, SM_tcp_connect_102, SM_reset_102,
        !           163:   SM_bcast_102, SM_reduce_102,
        !           164:   0
        !           165: };
        !           166:
        !           167: static int ox_plot_available_sm[] = {
        !           168:   SM_dupErrors, SM_getsp, SM_popSerializedLocalObject,
        !           169:   SM_popCMO, SM_popString, SM_setName,
        !           170:   SM_evalName, SM_executeStringByLocalParser,
        !           171:   SM_executeFunction, SM_shutdown, SM_pops,
        !           172:   SM_mathcap, SM_setMathcap, SM_nop,
        !           173:   0
        !           174: };
        !           175:
        !           176: /*
        !           177:   mathcap =
        !           178:     [
        !           179:       version list,
        !           180:       SMlist,
        !           181:       [
        !           182:         [OX tag,CMO tag list],
        !           183:         [OX tag,CMO tag list],
        !           184:         ...
        !           185:       ]
        !           186:     ]
        !           187: */
        !           188:
        !           189: void create_my_mathcap(char *system)
        !           190: {
        !           191:   NODE n,n0;
        !           192:   int i,k;
        !           193:   STRING str;
        !           194:   LIST sname,smlist,oxlist,cmolist,asirlist,oxasir,r;
        !           195:   USINT tag,t,t1;
        !           196:
        !           197:   if ( my_mathcap )
        !           198:     return;
        !           199:   /* version */
        !           200:   MKSTR(str,system);
        !           201:   MKUSINT(t,OX_VERSION);
        !           202:   n0 = mknode(2,t,str); MKLIST(sname,n0);
        !           203:
        !           204:   /* sm tag */
        !           205:   n0 = 0;
        !           206:   if ( !strcmp(system,"asir") ) {
        !           207:     for ( i = 0; k = asir_available_sm[i]; i++ ) {
        !           208:       NEXTNODE(n0,n); MKUSINT(t,k); BDY(n) = (pointer)t;
        !           209:     }
        !           210:   } else if ( !strcmp(system,"ox_asir") ) {
        !           211:     for ( i = 0; k = ox_asir_available_sm[i]; i++ ) {
        !           212:       NEXTNODE(n0,n); MKUSINT(t,k); BDY(n) = (pointer)t;
        !           213:     }
        !           214:     NEXT(n) = 0;
        !           215:   } else if ( !strcmp(system,"ox_plot") ) {
        !           216:     for ( i = 0; k = ox_plot_available_sm[i]; i++ ) {
        !           217:       NEXTNODE(n0,n); MKUSINT(t,k); BDY(n) = (pointer)t;
        !           218:     }
        !           219:     NEXT(n) = 0;
        !           220:   }
        !           221:   MKLIST(smlist,n0);
        !           222:
        !           223:   /* creation of [OX_DATA,CMO list] */
        !           224:   /* ox tag */
        !           225:   MKUSINT(tag,OX_DATA);
        !           226:   /* cmo tag */
        !           227:   for ( n0 = 0, i = 0; k = available_cmo[i]; i++ ) {
        !           228:     NEXTNODE(n0,n); MKUSINT(t,k); BDY(n) = (pointer)t;
        !           229:   }
        !           230:   NEXT(n) = 0; MKLIST(cmolist,n0);
        !           231:   /* [ox tag, cmo list] */
        !           232:   n0 = mknode(2,tag,cmolist);
        !           233:   MKLIST(oxlist,n0);
        !           234:
        !           235:   /* creation of [OX_LOCAL_OBJECT_ASIR,ASIR tag] */
        !           236:   /* ox tag */
        !           237:   MKUSINT(tag,OX_LOCAL_OBJECT_ASIR);
        !           238:   /* local tag */
        !           239:   MKUSINT(t,ASIR_VL);
        !           240:   MKUSINT(t1,ASIR_OBJ);
        !           241:   n0 = mknode(2,t,t1); MKLIST(cmolist,n0);
        !           242:   /* [ox tag, local list] */
        !           243:   n0 = mknode(2,tag,cmolist);
        !           244:    MKLIST(asirlist,n0);
        !           245:
        !           246:   /* [oxlist,asirlist] */
        !           247:   n0 = mknode(2,oxlist,asirlist); MKLIST(oxasir,n0);
        !           248:
        !           249:   /* [version,sm,oxasir] */
        !           250:   n0 = mknode(3,sname,smlist,oxasir); MKLIST(r,n0);
        !           251:
        !           252:   MKMATHCAP(my_mathcap,r);
        !           253:   mclist_to_mc(r,&my_mc);
        !           254:   my_oxcap = my_mc.oxcap;
        !           255: }
        !           256:
        !           257: void store_remote_mathcap(int s,MATHCAP mc)
        !           258: {
        !           259:   if ( !remote_mc ) {
        !           260:      remote_mc_len = 16;
        !           261:      remote_mc = (struct mathcap *)
        !           262:        CALLOC(remote_mc_len,sizeof(struct mathcap));
        !           263:   }
        !           264:   if ( s >= remote_mc_len ) {
        !           265:     remote_mc_len *= 2;
        !           266:     remote_mc = (struct mathcap *)REALLOC(remote_mc,
        !           267:       remote_mc_len*sizeof(struct mathcap));
        !           268:   }
        !           269:   mclist_to_mc(BDY(mc),&remote_mc[s]);
        !           270: }
        !           271:
        !           272: /*
        !           273:   mathcap =
        !           274:     [
        !           275:       version list,
        !           276:       SMlist,
        !           277:       [
        !           278:         [OX tag,CMO tag list],
        !           279:         [OX tag,CMO tag list],
        !           280:         ...
        !           281:       ]
        !           282:     ]
        !           283:
        !           284:     ===>
        !           285:
        !           286:   mathcap
        !           287:     | version | &servername | nsmcap |   &smcap | noxcap | &oxcap |
        !           288:   smcap
        !           289:     | SM_xxx | SM_yyy | ... |
        !           290:   oxcap
        !           291:     | oxcap[0] | oxcap[1] | ... |
        !           292:   oxcap[i]
        !           293:     | ox | ncap | &cap |
        !           294:   cap
        !           295:     | CMO_xxx | CMO_yyy | ... |
        !           296: */
        !           297:
        !           298: void mclist_to_mc(LIST mclist,struct mathcap *mc)
        !           299: {
        !           300:   int l,i,j;
        !           301:   NODE n,t,oxcmo,cap;
        !           302:   int *ptr;
        !           303:
        !           304:   /*
        !           305:     [
        !           306:       [ version,servername ]
        !           307:       [sm1,sm2,...],
        !           308:       [
        !           309:         [o1,[n11,n12,...]],
        !           310:         [o2,[n21,n22,...]],
        !           311:         ...
        !           312:       ]
        !           313:       (optional)[s1,s2,...] (no_ox_reset)
        !           314:        ]
        !           315:   */
        !           316:   n = BDY(mclist);
        !           317:   mc->mc = mclist;
        !           318:   mc->version = BDY((USINT)BDY(BDY((LIST)BDY(n))));
        !           319:   mc->servername = BDY((STRING)BDY(NEXT(BDY((LIST)BDY(n)))));
        !           320:
        !           321:   /* smcap */
        !           322:   n = NEXT(n);
        !           323:   t = BDY((LIST)BDY(n));
        !           324:   mc->nsmcap = length(t);
        !           325:   mc->smcap = (int *)MALLOC_ATOMIC(mc->nsmcap*sizeof(int));
        !           326:   for ( j = 0, ptr = mc->smcap; j < mc->nsmcap; j++, t = NEXT(t) )
        !           327:     ptr[j] = BDY((USINT)BDY(t));
        !           328:
        !           329:   n = NEXT(n);
        !           330:   n = BDY((LIST)BDY(n));
        !           331:   /* n -> BDY([[OX1,CMOlist1], [OX2,CMOlist2], ...]) */
        !           332:   mc->noxcap = length(n);
        !           333:   mc->oxcap = (struct oxcap *)MALLOC(mc->noxcap*sizeof(struct oxcap));
        !           334:   for ( j = 0; j < mc->noxcap; j++, n = NEXT(n) ) {
        !           335:     oxcmo = BDY((LIST)BDY(n));
        !           336:     /* oxcmo = BDY([OXj,CMOlistj]) */
        !           337:     mc->oxcap[j].ox = BDY((USINT)BDY(oxcmo));
        !           338:     cap = BDY((LIST)BDY(NEXT(oxcmo)));
        !           339:     /* cap ->BDY(CMOlistj) */
        !           340:     l = length(cap);
        !           341:     mc->oxcap[j].ncap = l;
        !           342:     mc->oxcap[j].cap = (unsigned int *)CALLOC(l+1,sizeof(unsigned int));
        !           343:     for ( t = cap, ptr = mc->oxcap[j].cap, i = 0; i < l; t = NEXT(t), i++ )
        !           344:       ptr[i] = BDY((USINT)BDY(t));
        !           345:   }
        !           346:   /* check of no_ox_reset */
        !           347:   mc->no_ox_reset = 0;
        !           348:   n = BDY(mclist);
        !           349:   if ( length(n) >= 4 ) {
        !           350:     t = BDY((LIST)ARG3(n));
        !           351:     for ( ; t; t = NEXT(t) )
        !           352:       if ( !strcmp(BDY((STRING)BDY(t)),"no_ox_reset") )
        !           353:         mc->no_ox_reset = 1;
        !           354:   }
        !           355: }
        !           356:
        !           357: int check_sm_by_mc(int s,unsigned int smtag)
        !           358: {
        !           359:   struct mathcap *rmc;
        !           360:   int nsmcap,i;
        !           361:   unsigned int *smcap;
        !           362:
        !           363:   /* XXX : return 1 if remote_mc is not available. */
        !           364:   if ( !remote_mc )
        !           365:     return 1;
        !           366:   rmc = &remote_mc[s];
        !           367:   nsmcap = rmc->nsmcap;
        !           368:   smcap = rmc->smcap;
        !           369:   if ( !smcap )
        !           370:     return 1;
        !           371:   for ( i = 0; i < nsmcap; i++ )
        !           372:     if ( smcap[i] == smtag )
        !           373:       break;
        !           374:   if ( i == nsmcap )
        !           375:     return 0;
        !           376:   else
        !           377:     return 1;
        !           378: }
        !           379:
        !           380: int check_by_mc(int s,unsigned int oxtag,unsigned int cmotag)
        !           381: {
        !           382:   struct mathcap *rmc;
        !           383:   int noxcap,ncap,i,j;
        !           384:   struct oxcap *oxcap;
        !           385:   unsigned int *cap;
        !           386:
        !           387:   /* XXX : return 1 if remote_mc is not available. */
        !           388:   if ( !remote_mc )
        !           389:     return 1;
        !           390:   rmc = &remote_mc[s];
        !           391:   noxcap = rmc->noxcap;
        !           392:   oxcap = rmc->oxcap;
        !           393:   if ( !oxcap )
        !           394:     return 1;
        !           395:   for ( i = 0; i < noxcap; i++ )
        !           396:     if ( oxcap[i].ox == oxtag )
        !           397:       break;
        !           398:   if ( i == noxcap )
        !           399:     return 0;
        !           400:   ncap = oxcap[i].ncap;
        !           401:   cap = oxcap[i].cap;
        !           402:   for ( j = 0; j < ncap; j++ )
        !           403:     if ( cap[j] == cmotag )
        !           404:       break;
        !           405:   if ( j == ncap )
        !           406:     return 0;
        !           407:   else
        !           408:     return 1;
        !           409: }
        !           410:
        !           411: void begin_critical() {
        !           412:   critical_when_signal = 1;
        !           413: }
        !           414:
        !           415: void end_critical() {
        !           416:   critical_when_signal = 0;
        !           417:   if ( ox_usr1_sent ) {
        !           418:     ox_usr1_sent = 0;
        !           419: #if !defined(VISUAL) && !defined(__MINGW32__)
        !           420:   ox_usr1_handler(SIGUSR1);
        !           421: #else
        !           422:   ox_usr1_handler(0);
        !           423: #endif
        !           424:   }
        !           425:   if ( ox_int_received ) {
        !           426:     ox_int_received = 0; int_handler(SIGINT);
        !           427:   }
        !           428: }
        !           429:
        !           430: extern NODE user_int_handler;
        !           431: extern int caught_intr,in_gc;
        !           432:
        !           433: void ox_usr1_handler(int sig)
        !           434: {
        !           435:   NODE t;
        !           436:
        !           437: #if !defined(VISUAL) && !defined(__MINGW32__)
        !           438:   set_signal_for_restart(SIGUSR1,ox_usr1_handler);
        !           439: #endif
        !           440:   if ( critical_when_signal ) {
        !           441:     fprintf(stderr,"usr1 : critical\n");
        !           442:     ox_usr1_sent = 1;
        !           443:     } else if ( in_gc ) {
        !           444:     fprintf(stderr,"usr1 : in_gc\n");
        !           445:     caught_intr = 2;
        !           446:   } else {
        !           447:     ox_flushing = 1;
        !           448:     if ( user_int_handler ) {
        !           449:       fprintf(stderr,
        !           450:         "usr1 : calling the registered exception handlers...");
        !           451:       for ( t = user_int_handler; t; t = NEXT(t) )
        !           452:         bevalf((FUNC)BDY(t),0);
        !           453:       fprintf(stderr, "done.\n");
        !           454:     }
        !           455:     LEAVE_SIGNAL_CS_ALL;
        !           456:     ox_resetenv("usr1 : return to toplevel by SIGUSR1");
        !           457:   }
        !           458: }
        !           459:
        !           460: void clear_readbuffer()
        !           461: {
        !           462: #if defined(linux)
        !           463:   iofp[0].in->_IO_read_ptr = iofp[0].in->_IO_read_end;
        !           464: #elif defined(__FreeBSD__)
        !           465:   fpurge(iofp[0].in);
        !           466: #endif
        !           467: /*
        !           468:   sock = fileno(iofp[0].in);
        !           469:   interval.tv_sec = (int)0;
        !           470:   interval.tv_usec = (int)0;
        !           471:
        !           472:   FD_ZERO(&r); FD_ZERO(&w); FD_ZERO(&e);
        !           473:   FD_SET(sock,&r);
        !           474:   while ( 1 ) {
        !           475:     n = select(FD_SETSIZE,&r,&w,&e,&interval);
        !           476:     if ( !n )
        !           477:       break;
        !           478:     read(sock,&c,1);
        !           479:   }
        !           480: */
        !           481: }
        !           482:
        !           483: #if MPI
        !           484: int ox_data_is_available(int s)
        !           485: {
        !           486:   return 1;
        !           487: }
        !           488:
        !           489: void wait_for_data(int s)
        !           490: {
        !           491:   return;
        !           492: }
        !           493:
        !           494: void wait_for_data_102(int rank)
        !           495: {
        !           496:   return;
        !           497: }
        !           498: #else
        !           499: int ox_data_is_available(int s)
        !           500: {
        !           501:   return FP_DATA_IS_AVAILABLE(iofp[s].in);
        !           502: }
        !           503:
        !           504: void wait_for_data(int s)
        !           505: {
        !           506:   fd_set r;
        !           507:   int sock;
        !           508:
        !           509:   if ( !FP_DATA_IS_AVAILABLE(iofp[s].in) ) {
        !           510: #if defined(VISUAL) || defined(__MINGW32__)
        !           511:     sock = iofp[s].in->fildes;
        !           512:     FD_ZERO(&r);
        !           513:     FD_SET((unsigned int)sock,&r);
        !           514:     select(0,&r,NULL,NULL,NULL);
        !           515: #else
        !           516:     sock = fileno(iofp[s].in);
        !           517:     FD_ZERO(&r);
        !           518:     FD_SET(sock,&r);
        !           519:     select(FD_SETSIZE,&r,NULL,NULL,NULL);
        !           520: #endif
        !           521:   }
        !           522: }
        !           523:
        !           524: void wait_for_data_102(int rank)
        !           525: {
        !           526:   fd_set r;
        !           527:   int sock;
        !           528:
        !           529:   if ( !FP_DATA_IS_AVAILABLE(iofp_102[rank].in) ) {
        !           530: #if defined(VISUAL) || defined(__MINGW32__)
        !           531:     sock = iofp_102[rank].in->fildes;
        !           532:     FD_ZERO(&r);
        !           533:     FD_SET((unsigned int)sock,&r);
        !           534:     select(0,&r,NULL,NULL,NULL);
        !           535: #else
        !           536:     sock = fileno(iofp_102[rank].in);
        !           537:     FD_ZERO(&r);
        !           538:     FD_SET(sock,&r);
        !           539:     select(FD_SETSIZE,&r,NULL,NULL,NULL);
        !           540: #endif
        !           541:   }
        !           542: }
        !           543: #endif
        !           544:
        !           545: void ox_send_data(int s,pointer p)
        !           546: {
        !           547:   ERR err;
        !           548:     Obj p0;
        !           549:
        !           550:     p0 = (Obj)p;
        !           551:   if ( ox_check && !ox_check_cmo(s,(Obj)p) ) {
        !           552:     create_error(&err,ox_serial,"ox_send_data : Mathcap violation",0);
        !           553:     p = (pointer)err;
        !           554:   }
        !           555:   begin_critical();
        !           556:   ox_write_int(s,OX_DATA);
        !           557:   ox_write_int(s,ox_serial++);
        !           558:   ox_write_cmo(s,p);
        !           559:   ox_flush_stream(s);
        !           560:   end_critical();
        !           561: }
        !           562:
        !           563: void ox_send_data_102(int rank,pointer p)
        !           564: {
        !           565:   ERR err;
        !           566:
        !           567:   begin_critical();
        !           568:   ox_write_int_102(rank,OX_DATA);
        !           569:   ox_write_int_102(rank,ox_serial++);
        !           570:   ox_write_cmo_102(rank,p);
        !           571:   ox_flush_stream_102(rank);
        !           572:   end_critical();
        !           573: }
        !           574:
        !           575: void ox_bcast_102(int root)
        !           576: {
        !           577:   Obj data;
        !           578:   int r,mask,id,src,dst;
        !           579:
        !           580:   r = myrank_102-root;
        !           581:   if ( r == 0 )
        !           582:     data = (Obj)asir_pop_one();
        !           583:
        !           584:   if ( r < 0 ) r += nserver_102;
        !           585:   for ( mask = 1; mask < nserver_102; mask <<= 1 )
        !           586:     if ( r&mask ) {
        !           587:       src = myrank_102-mask;
        !           588:       if ( src < 0 ) src += nserver_102;
        !           589:       ox_recv_102(src,&id,&data);
        !           590:       break;
        !           591:     }
        !           592:   for ( mask >>= 1; mask > 0; mask >>= 1 )
        !           593:     if ( (r+mask) < nserver_102 ) {
        !           594:       dst = myrank_102+mask;
        !           595:       if ( dst >= nserver_102 ) dst -= nserver_102;
        !           596:       ox_send_data_102(dst,data);
        !           597:     }
        !           598:   asir_push_one(data);
        !           599: }
        !           600:
        !           601: /* func : an arithmetic funcion func(vl,a,b,*c) */
        !           602:
        !           603: void ox_reduce_102(int root,void (*func)())
        !           604: {
        !           605:   Obj data,data0,t;
        !           606:   int r,mask,id,src,dst;
        !           607:
        !           608:   r = myrank_102-root;
        !           609:   if ( r < 0 ) r += nserver_102;
        !           610:   data = (Obj)asir_pop_one();
        !           611:   for ( mask = 1; mask < nserver_102; mask <<= 1 )
        !           612:     if ( r&mask ) {
        !           613:       dst = (r-mask)+root;
        !           614:       if ( dst >= nserver_102 ) dst -= nserver_102;
        !           615:       ox_send_data_102(dst,data);
        !           616:       break;
        !           617:     } else {
        !           618:       src = r+mask;
        !           619:       if ( src < nserver_102 ) {
        !           620:         src += root;
        !           621:         if ( src >= nserver_102 ) src -= nserver_102;
        !           622:         ox_recv_102(src,&id,&data0);
        !           623:         (*func)(CO,data,data0,&t); data = t;
        !           624:       }
        !           625:     }
        !           626:   asir_push_one(r?0:data);
        !           627: }
        !           628:
        !           629: void ox_send_cmd(int s,int id)
        !           630: {
        !           631:   if ( ox_check && !check_sm_by_mc(s,id) )
        !           632:     error("ox_send_cmd : Mathcap violation");
        !           633:   begin_critical();
        !           634:   ox_write_int(s,OX_COMMAND);
        !           635:   ox_write_int(s,ox_serial++);
        !           636:   ox_write_int(s,id);
        !           637:   ox_flush_stream(s);
        !           638:   end_critical();
        !           639: }
        !           640:
        !           641: void ox_send_sync(int s)
        !           642: {
        !           643:   begin_critical();
        !           644:   ox_write_int(s,OX_SYNC_BALL);
        !           645:   ox_write_int(s,ox_serial++);
        !           646:   ox_flush_stream(s);
        !           647:   end_critical();
        !           648: }
        !           649:
        !           650: void ox_send_sync_102(int rank)
        !           651: {
        !           652:   begin_critical();
        !           653:   ox_write_int_102(rank,OX_SYNC_BALL);
        !           654:   ox_write_int_102(rank,ox_serial++);
        !           655:   ox_flush_stream_102(rank);
        !           656:   end_critical();
        !           657: }
        !           658:
        !           659: void ox_send_local_data(int s,Obj p)
        !           660: {
        !           661:   begin_critical();
        !           662:   ox_write_int(s,OX_LOCAL_OBJECT_ASIR);
        !           663:   ox_write_int(s,ox_serial++);
        !           664:   ox_write_int(s,ASIR_OBJ);
        !           665:   saveobj((FILE *)iofp[s].out,p);
        !           666:   ox_flush_stream(s);
        !           667:   end_critical();
        !           668: }
        !           669:
        !           670: void ox_send_local_data_102(int rank,Obj p)
        !           671: {
        !           672:   begin_critical();
        !           673:   ox_write_int_102(rank,OX_LOCAL_OBJECT_ASIR);
        !           674:   ox_write_int_102(rank,ox_serial++);
        !           675:   ox_write_int_102(rank,ASIR_OBJ);
        !           676:   saveobj((FILE *)iofp_102[rank].out,p);
        !           677:   ox_flush_stream_102(rank);
        !           678:   end_critical();
        !           679: }
        !           680:
        !           681: void ox_send_local_ring(int s,VL vl)
        !           682: {
        !           683:   begin_critical();
        !           684:   ox_write_int(s,OX_LOCAL_OBJECT_ASIR);
        !           685:   ox_write_int(s,ox_serial++);
        !           686:   ox_write_int(s,ASIR_VL);
        !           687:   savevl((FILE *)iofp[s].out,vl);
        !           688:   ox_flush_stream(s);
        !           689:   end_critical();
        !           690: }
        !           691:
        !           692: void ox_send_local_ring_102(int rank,VL vl)
        !           693: {
        !           694:   begin_critical();
        !           695:   ox_write_int_102(rank,OX_LOCAL_OBJECT_ASIR);
        !           696:   ox_write_int_102(rank,ox_serial++);
        !           697:   ox_write_int_102(rank,ASIR_VL);
        !           698:   savevl((FILE *)iofp_102[rank].out,vl);
        !           699:   ox_flush_stream_102(rank);
        !           700:   end_critical();
        !           701: }
        !           702:
        !           703: unsigned int ox_recv(int s, int *id, Obj *p)
        !           704: {
        !           705:   unsigned int cmd,serial;
        !           706:   USINT ui;
        !           707:
        !           708:   wait_for_data(s);
        !           709:   begin_critical();
        !           710:   ox_read_int(s,id);
        !           711:   ox_read_int(s,&serial);
        !           712:   switch ( *id ) {
        !           713:     case OX_COMMAND:
        !           714:       ox_read_int(s,&cmd);
        !           715:       MKUSINT(ui,cmd);
        !           716:       *p = (Obj)ui;
        !           717:       break;
        !           718:     case OX_DATA:
        !           719:       ox_read_cmo(s,p);
        !           720:       break;
        !           721:     case OX_LOCAL_OBJECT_ASIR:
        !           722:       ox_read_local(s,p);
        !           723:       break;
        !           724:     default:
        !           725:       *p = 0;
        !           726:       break;
        !           727:   }
        !           728:   end_critical();
        !           729:   return serial;
        !           730: }
        !           731:
        !           732: unsigned int ox_recv_102(int rank, int *id, Obj *p)
        !           733: {
        !           734:   unsigned int cmd,serial;
        !           735:   USINT ui;
        !           736:
        !           737:   wait_for_data_102(rank);
        !           738:   begin_critical();
        !           739:   ox_read_int_102(rank,id);
        !           740:   ox_read_int_102(rank,&serial);
        !           741:   switch ( *id ) {
        !           742:     case OX_COMMAND:
        !           743:       ox_read_int_102(rank,&cmd);
        !           744:       MKUSINT(ui,cmd);
        !           745:       *p = (Obj)ui;
        !           746:       break;
        !           747:     case OX_DATA:
        !           748:       ox_read_cmo_102(rank,p);
        !           749:       break;
        !           750:     case OX_LOCAL_OBJECT_ASIR:
        !           751:       ox_read_local_102(rank,p);
        !           752:       break;
        !           753:     default:
        !           754:       *p = 0;
        !           755:       break;
        !           756:   }
        !           757:   end_critical();
        !           758:   return serial;
        !           759: }
        !           760:
        !           761: void ox_get_result(int s,Obj *rp)
        !           762: {
        !           763:   int id;
        !           764:   Obj obj,r;
        !           765:   int level;
        !           766:
        !           767:   level = 0;
        !           768:   r = 0;
        !           769:   do {
        !           770:     ox_recv(s,&id,&obj);
        !           771:     if ( id == OX_COMMAND ) {
        !           772:       switch ( ((USINT)obj)->body ) {
        !           773:         case SM_beginBlock:
        !           774:           level++;
        !           775:           break;
        !           776:         case SM_endBlock:
        !           777:           level--;
        !           778:       }
        !           779:     } else
        !           780:       r = obj;
        !           781:   } while ( level );
        !           782:   *rp = r;
        !           783: }
        !           784:
        !           785: void ox_read_int(int s, int *n)
        !           786: {
        !           787:   ox_need_conv = iofp[s].conv;
        !           788:   read_int((FILE *)iofp[s].in,n);
        !           789: }
        !           790:
        !           791: void ox_read_int_102(int rank, int *n)
        !           792: {
        !           793:   ox_need_conv = iofp_102[rank].conv;
        !           794:   read_int((FILE *)iofp_102[rank].in,n);
        !           795: }
        !           796:
        !           797: void ox_read_cmo(int s, Obj *rp)
        !           798: {
        !           799:   ox_need_conv = iofp[s].conv;
        !           800:   read_cmo((FILE *)iofp[s].in,rp);
        !           801: }
        !           802:
        !           803: void ox_read_cmo_102(int rank, Obj *rp)
        !           804: {
        !           805:   ox_need_conv = iofp_102[rank].conv;
        !           806:   read_cmo((FILE *)iofp_102[rank].in,rp);
        !           807: }
        !           808:
        !           809:
        !           810: void ox_read_local(int s, Obj *rp)
        !           811: {
        !           812:   int id;
        !           813:
        !           814:   ox_need_conv = iofp[s].conv;
        !           815:   read_int((FILE *)iofp[s].in,&id);
        !           816:   switch ( id ) {
        !           817:     case ASIR_VL:
        !           818:       loadvl((FILE *)iofp[s].in);
        !           819:       *rp = VOIDobj;
        !           820:       break;
        !           821:     case ASIR_OBJ:
        !           822:       loadobj((FILE *)iofp[s].in,rp);
        !           823:       break;
        !           824:     default:
        !           825:       error("ox_read_local : unsupported id");
        !           826:       break;
        !           827:   }
        !           828: }
        !           829:
        !           830: void ox_read_local_102(int rank, Obj *rp)
        !           831: {
        !           832:   int id;
        !           833:
        !           834:   ox_need_conv = iofp_102[rank].conv;
        !           835:   read_int((FILE *)iofp_102[rank].in,&id);
        !           836:   switch ( id ) {
        !           837:     case ASIR_VL:
        !           838:       loadvl((FILE *)iofp_102[rank].in);
        !           839:       *rp = VOIDobj;
        !           840:       break;
        !           841:     case ASIR_OBJ:
        !           842:       loadobj((FILE *)iofp_102[rank].in,rp);
        !           843:       break;
        !           844:     default:
        !           845:       error("ox_read_local_102 : unsupported id");
        !           846:       break;
        !           847:   }
        !           848: }
        !           849:
        !           850: void ox_write_int(int s, int n)
        !           851: {
        !           852:   ox_need_conv = iofp[s].conv;
        !           853:   write_int((FILE *)iofp[s].out,&n);
        !           854: }
        !           855:
        !           856: void ox_write_int_102(int rank, int n)
        !           857: {
        !           858:   ox_need_conv = iofp_102[rank].conv;
        !           859:   write_int((FILE *)iofp_102[rank].out,&n);
        !           860: }
        !           861:
        !           862: void ox_write_cmo(int s, Obj obj)
        !           863: {
        !           864:   ox_need_conv = iofp[s].conv;
        !           865:   write_cmo((FILE *)iofp[s].out,obj);
        !           866: }
        !           867:
        !           868: void ox_write_cmo_102(int rank, Obj obj)
        !           869: {
        !           870:   ox_need_conv = iofp_102[rank].conv;
        !           871:   write_cmo((FILE *)iofp_102[rank].out,obj);
        !           872: }
        !           873:
        !           874: int ox_check_cmo(int s, Obj obj)
        !           875: {
        !           876:   NODE m;
        !           877:
        !           878:   if ( !obj )
        !           879:     return 1;
        !           880:   switch ( OID(obj) ) {
        !           881:     case O_MATHCAP: case O_STR: case O_ERR: case O_USINT: case O_VOID:
        !           882:     case O_BYTEARRAY:
        !           883:       return 1;
        !           884:     case O_P:
        !           885:       if ( !check_by_mc(s,OX_DATA,CMO_RECURSIVE_POLYNOMIAL) )
        !           886:         return 0;
        !           887:       else
        !           888:         return ox_check_cmo_p(s,(P)obj);
        !           889:     case O_R:
        !           890:       if ( !check_by_mc(s,OX_DATA,CMO_RATIONAL) )
        !           891:         return 0;
        !           892:       else if ( !check_by_mc(s,OX_DATA,CMO_RECURSIVE_POLYNOMIAL) )
        !           893:         return 0;
        !           894:       else
        !           895:         return ox_check_cmo_p(s,NM((R)obj)) && ox_check_cmo_p(s,DN((R)obj));
        !           896:     case O_DP:
        !           897:       return ox_check_cmo_dp(s,(DP)obj);
        !           898:     case O_N:
        !           899:       switch ( NID((Num)obj) ) {
        !           900:         case N_Q:
        !           901:           if ( INT((Q)obj) )
        !           902:             return check_by_mc(s,OX_DATA,CMO_ZZ);
        !           903:           else
        !           904:             return check_by_mc(s,OX_DATA,CMO_QQ);
        !           905:         case N_R: case N_B: case N_C:
        !           906:           return 1;
        !           907:         default:
        !           908:           return 0;
        !           909:       }
        !           910:       break;
        !           911:     case O_LIST:
        !           912:       for ( m = BDY((LIST)obj); m; m = NEXT(m) )
        !           913:         if ( !ox_check_cmo(s,(BDY(m))) )
        !           914:           return 0;
        !           915:       return 1;
        !           916:     case O_QUOTE: /* XXX */
        !           917:       return 1;
        !           918:     case O_MAT: /* MAT is sent as a list */
        !           919:       return 1;
        !           920:     default:
        !           921:       return 0;
        !           922:   }
        !           923: }
        !           924:
        !           925: void ox_get_serverinfo(int s, LIST *rp)
        !           926: {
        !           927:   if ( remote_mc )
        !           928:     *rp = remote_mc[s].mc;
        !           929:   else {
        !           930:     MKLIST(*rp,0);
        !           931:   }
        !           932: }
        !           933:
        !           934: char *ox_get_servername(int s)
        !           935: {
        !           936:   return (remote_mc && remote_mc[s].servername)?remote_mc[s].servername:0;
        !           937: }
        !           938:
        !           939:
        !           940: int ox_check_cmo_p(int s, P p)
        !           941: {
        !           942:   DCP dc;
        !           943:
        !           944:   if ( NUM(p) )
        !           945:     return ox_check_cmo(s,(Obj)p);
        !           946:   else {
        !           947:     for ( dc = DC(p); dc; dc = NEXT(dc) )
        !           948:       if ( !ox_check_cmo_p(s,COEF(dc)) )
        !           949:         return 0;
        !           950:     return 1;
        !           951:   }
        !           952: }
        !           953:
        !           954: int ox_check_cmo_dp(int s, DP p)
        !           955: {
        !           956:   MP m;
        !           957:
        !           958:   for ( m = BDY(p); m; m = NEXT(m) )
        !           959:     if ( !ox_check_cmo(s,(Obj)m->c) )
        !           960:       return 0;
        !           961:   return 1;
        !           962: }
        !           963:
        !           964: void ox_flush_stream(int s)
        !           965: {
        !           966:   if ( ox_batch )
        !           967:     return;
        !           968: #if defined(VISUAL) || defined(__MINGW32__) || defined(MPI)
        !           969:   if ( WSIO_fileno(iofp[s].out) < 0 )
        !           970:     cflush(iofp[s].out);
        !           971:   else
        !           972: #endif
        !           973:   fflush((FILE *)iofp[s].out);
        !           974: }
        !           975:
        !           976: void ox_flush_stream_force(int s)
        !           977: {
        !           978: #if defined(VISUAL) || defined(__MINGW32__) || defined(MPI)
        !           979:   if ( WSIO_fileno(iofp[s].out) < 0 )
        !           980:     cflush(iofp[s].out);
        !           981:   else
        !           982: #endif
        !           983:   fflush((FILE *)iofp[s].out);
        !           984: }
        !           985:
        !           986: void ox_flush_stream_102(int rank)
        !           987: {
        !           988:   if ( !ox_batch )
        !           989:     ox_flush_stream_force_102(rank);
        !           990: }
        !           991:
        !           992: void ox_flush_stream_force_102(int rank)
        !           993: {
        !           994:   if ( iofp_102[rank].out )
        !           995: #if defined(VISUAL) || defined(__MINGW32__)
        !           996:     cflush(iofp_102[rank].out);
        !           997: #elif MPI
        !           998:     cflush(iofp_102[rank].out);
        !           999: #else
        !          1000:     fflush(iofp_102[rank].out);
        !          1001: #endif
        !          1002: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>