[BACK]Return to serv1.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_math

Annotation of OpenXM/src/ox_math/serv1.c, Revision 1.1

1.1     ! ohara       1: /* -*- mode: C; coding: euc-japan -*- */
        !             2: /* $OpenXM$ */
        !             3: /* $Id: serv1.c,v 1.2 1999/10/14 06:38:16 ohara Exp ohara $ */
        !             4:
        !             5: #include <stdio.h>
        !             6: #include <stdlib.h>
        !             7: #include <unistd.h>
        !             8: #include <signal.h>
        !             9: #include <gmp.h>
        !            10: #include <mathlink.h>
        !            11: #include "ox.h"
        !            12: #include "serv2.h"
        !            13:
        !            14: extern MLINK lp;
        !            15: static int sv_read  = 3;
        !            16: static int sv_write = 4;
        !            17:
        !            18: static int flag_sigusr1 = 0;
        !            19: static int flag_sigusr2 = 0;
        !            20:
        !            21: /* 1 のとき割り込み禁止 */
        !            22: static int in_critical = 0;
        !            23:
        !            24: static int set_critical()
        !            25: {
        !            26:     in_critical = 1;
        !            27: }
        !            28:
        !            29: static int unset_critical()
        !            30: {
        !            31:     in_critical = 0;
        !            32: }
        !            33:
        !            34: static int critical_p() {
        !            35:     return in_critical;
        !            36: }
        !            37:
        !            38: static int already_send_ox_sync_ball = 0;
        !            39:
        !            40: /* SM_control_reset_connection */
        !            41: static int handler_reset1()
        !            42: {
        !            43:     fprintf(stderr, "signal received.\n");
        !            44:     signal(SIGUSR1, handler_reset1);
        !            45:     if (!flag_sigusr1) {
        !            46:         flag_sigusr1 = 1;
        !            47:         if(critical_p()) {
        !            48:             send_ox_sync_ball(sv_write);
        !            49:             already_send_ox_sync_ball = 1;
        !            50:         }
        !            51:     }
        !            52: }
        !            53:
        !            54: static int handler_kill()
        !            55: {
        !            56:     close(3);
        !            57:     close(4);
        !            58:     exit(1);
        !            59: }
        !            60:
        !            61: static int send_ox_sync_ball(int fd)
        !            62: {
        !            63:     fprintf(stderr, "sending a sync_ball.\n");
        !            64:     send_ox_tag(fd, OX_SYNC_BALL);
        !            65: }
        !            66:
        !            67: static int exchange_ox_syncball(int fd)
        !            68: {
        !            69:     int tag;
        !            70:
        !            71:     while((tag = receive_ox_tag(fd)) != OX_SYNC_BALL) {
        !            72:         /* skipping a message. */
        !            73:         if (tag == OX_DATA) {
        !            74:             receive_cmo(fd);
        !            75:         }else {
        !            76:             receive_int32(fd);
        !            77:         }
        !            78:     }
        !            79:     fprintf(stderr, "received a sync_ball.\n");
        !            80: }
        !            81:
        !            82: /* スタックマシン部分 */
        !            83: int receive_ox(int fd_read, int fd_write)
        !            84: {
        !            85:     int tag;
        !            86:     int code;
        !            87:
        !            88:     tag = receive_ox_tag(fd_read);
        !            89:     switch(tag) {
        !            90:     case OX_DATA:
        !            91:         push(receive_cmo(fd_read));
        !            92:         break;
        !            93:     case OX_COMMAND:
        !            94:         code = receive_sm_command(fd_read);
        !            95:         set_critical();
        !            96:         execute_sm_command(fd_write, code);
        !            97:         unset_critical();
        !            98:         break;
        !            99:     default:
        !           100:         fprintf(stderr, "illeagal message? ox_tag = (%d)\n", tag);
        !           101:         return -1;
        !           102:         break;
        !           103:     }
        !           104:     return 0;
        !           105: }
        !           106:
        !           107: int main()
        !           108: {
        !           109:     MATH_init();
        !           110:     initialize_stack();
        !           111:
        !           112:     signal(SIGUSR1, handler_reset1);
        !           113:     signal(SIGKILL, handler_kill);
        !           114:
        !           115:     /* バイトオーダの決定 */
        !           116:     decideByteOrder2(sv_read, sv_write, 0);
        !           117:
        !           118:     while(1) {
        !           119:         receive_ox(sv_read, sv_write);
        !           120:         if(flag_sigusr1) {
        !           121:             if (!already_send_ox_sync_ball) {
        !           122:               send_ox_sync_ball(sv_write);
        !           123:                 already_send_ox_sync_ball = 1;
        !           124:             }
        !           125:             exchange_ox_syncball(sv_read);
        !           126:             flag_sigusr1 = 0;
        !           127:             already_send_ox_sync_ball = 0;
        !           128:         }
        !           129:     }
        !           130:     MATH_exit();
        !           131: }

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