diff options
Diffstat (limited to 'src/fc/fserve.c')
-rw-r--r-- | src/fc/fserve.c | 138 |
1 files changed, 75 insertions, 63 deletions
diff --git a/src/fc/fserve.c b/src/fc/fserve.c index 92b0d53..42c4028 100644 --- a/src/fc/fserve.c +++ b/src/fc/fserve.c @@ -53,6 +53,7 @@ in this Software without prior written authorization from The Open Group. #ifdef HAVE_CONFIG_H #include <config.h> #endif +#include "libxfontint.h" #ifdef WIN32 #define _WILLWINSOCK_ @@ -101,18 +102,14 @@ in this Software without prior written authorization from The Open Group. /* Somewhat arbitrary limit on maximum reply size we'll try to read. */ #define MAX_REPLY_LENGTH ((64 * 1024 * 1024) >> 2) -extern void ErrorF(const char *f, ...); - static int fs_read_glyphs ( FontPathElementPtr fpe, FSBlockDataPtr blockrec ); static int fs_read_list ( FontPathElementPtr fpe, FSBlockDataPtr blockrec ); static int fs_read_list_info ( FontPathElementPtr fpe, FSBlockDataPtr blockrec ); -extern fd_set _fs_fd_mask; +static void fs_block_handler ( void *wt ); -static void fs_block_handler ( pointer data, OSTimePtr wt, - pointer LastSelectMask ); -static int fs_wakeup ( FontPathElementPtr fpe, unsigned long *mask ); +static int fs_wakeup ( FontPathElementPtr fpe ); /* * List of all FPEs @@ -147,7 +144,7 @@ static void _fs_close_server (FSFpePtr conn); static FSFpePtr -_fs_init_conn (const char *servername); +_fs_init_conn (const char *servername, FontPathElementPtr fpe); static int _fs_wait_connect (FSFpePtr conn); @@ -167,6 +164,9 @@ _fs_free_conn (FSFpePtr conn); static int fs_free_fpe(FontPathElementPtr fpe); +static void +fs_fd_handler(int fd, void *data); + /* * Font server access * @@ -305,12 +305,12 @@ fs_init_fpe(FontPathElementPtr fpe) if (*name == ':') name++; /* skip ':' */ - conn = _fs_init_conn (name); + conn = _fs_init_conn (name, fpe); if (!conn) err = AllocError; else { - err = init_fs_handlers (fpe, fs_block_handler); + err = init_fs_handlers2 (fpe, fs_block_handler); if (err != Successful) { _fs_free_conn (conn); @@ -383,7 +383,7 @@ fs_free_fpe(FontPathElementPtr fpe) } _fs_unmark_block (conn, conn->blockState); fs_close_conn(conn); - remove_fs_handlers(fpe, fs_block_handler, fs_fpes == 0); + remove_fs_handlers2(fpe, fs_block_handler, fs_fpes == 0); _fs_free_conn (conn); fpe->private = (pointer) 0; @@ -515,6 +515,24 @@ _fs_add_clients_depending(FSClientsDependingPtr *clients_depending, pointer clie return Suspended; } +static void +conn_start_listening(FSFpePtr conn) +{ + if (!conn->fs_listening) { + add_fs_fd(conn->fs_fd, fs_fd_handler, conn->fpe); + conn->fs_listening = TRUE; + } +} + +static void +conn_stop_listening(FSFpePtr conn) +{ + if (conn->fs_listening) { + remove_fs_fd(conn->fs_fd); + conn->fs_listening = FALSE; + } +} + /* * When a request is aborted due to a font server failure, * signal any depending clients to restart their dependant @@ -546,7 +564,7 @@ _fs_clean_aborted_blockrec(FSFpePtr conn, FSBlockDataPtr blockrec) FSBlockedListInfoPtr binfo; binfo = (FSBlockedListInfoPtr) blockrec->data; if (binfo->status == FS_LFWI_REPLY) - FD_SET(conn->fs_fd, &_fs_fd_mask); + conn_start_listening(conn); _fs_free_props (&binfo->info); } default: @@ -608,7 +626,7 @@ fs_get_reply (FSFpePtr conn, int *error) int ret; /* block if the connection is down or paused in lfwi */ - if (conn->fs_fd == -1 || !FD_ISSET (conn->fs_fd, &_fs_fd_mask)) + if (conn->fs_fd == -1 || !conn->fs_listening) { *error = FSIO_BLOCK; return 0; @@ -655,7 +673,7 @@ fs_reply_ready (FSFpePtr conn) { fsGenericReply *rep; - if (conn->fs_fd == -1 || !FD_ISSET (conn->fs_fd, &_fs_fd_mask)) + if (conn->fs_fd == -1 || !conn->fs_listening) return FALSE; if (fs_data_read (conn) < sizeof (fsGenericReply)) return FALSE; @@ -1300,15 +1318,12 @@ _fs_unmark_block (FSFpePtr conn, CARD32 mask) /* ARGSUSED */ static void -fs_block_handler(pointer data, OSTimePtr wt, pointer LastSelectMask) +fs_block_handler(void *wt) { - static struct timeval block_timeout; CARD32 now, earliest, wakeup; int soonest; FSFpePtr conn; - XFD_ORSET((fd_set *)LastSelectMask, (fd_set *)LastSelectMask, - &_fs_fd_mask); /* * Flush all pending output */ @@ -1320,14 +1335,7 @@ fs_block_handler(pointer data, OSTimePtr wt, pointer LastSelectMask) * Check for any fpe with a complete reply, set sleep time to zero */ if (fs_blockState & FS_COMPLETE_REPLY) - { - block_timeout.tv_sec = 0; - block_timeout.tv_usec = 0; - if (*wt == NULL) - *wt = &block_timeout; - else - **wt = block_timeout; - } + adjust_fs_wait_for_delay(wt, 0); /* * Walk through fpe list computing sleep time */ @@ -1368,12 +1376,7 @@ fs_block_handler(pointer data, OSTimePtr wt, pointer LastSelectMask) soonest = earliest - now; if (soonest < 0) soonest = 0; - block_timeout.tv_sec = soonest / 1000; - block_timeout.tv_usec = (soonest % 1000) * 1000; - if (*wt == NULL) - *wt = &block_timeout; - else if (soonest < (*wt)->tv_sec * 1000 + (*wt)->tv_usec / 1000) - **wt = block_timeout; + adjust_fs_wait_for_delay(wt, soonest); } } @@ -1460,11 +1463,11 @@ fs_read_reply (FontPathElementPtr fpe, pointer client) } } -static int -fs_wakeup(FontPathElementPtr fpe, unsigned long *mask) +static void +fs_fd_handler(int fd, void *data) { - fd_set *LastSelectMask = (fd_set *) mask; - FSFpePtr conn = (FSFpePtr) fpe->private; + FontPathElementPtr fpe = data; + FSFpePtr conn = (FSFpePtr) fpe->private; /* * Don't continue if the fd is -1 (which will be true when the @@ -1472,11 +1475,19 @@ fs_wakeup(FontPathElementPtr fpe, unsigned long *mask) */ if ((conn->blockState & FS_RECONNECTING)) _fs_check_reconnect (conn); - else if ((conn->blockState & FS_COMPLETE_REPLY) || - (conn->fs_fd != -1 && FD_ISSET(conn->fs_fd, LastSelectMask))) + else if ((conn->fs_fd != -1)) fs_read_reply (fpe, 0); +} + +static int +fs_wakeup(FontPathElementPtr fpe) +{ + FSFpePtr conn = (FSFpePtr) fpe->private; + if (conn->blockState & (FS_PENDING_REPLY|FS_BROKEN_CONNECTION|FS_BROKEN_WRITE)) _fs_do_blocked (conn); + if (conn->blockState & FS_COMPLETE_REPLY) + fs_read_reply (fpe, 0); #ifdef DEBUG { FSBlockDataPtr blockrec; @@ -2160,11 +2171,6 @@ fs_send_load_glyphs(pointer client, FontPtr pfont, return Suspended; } - -extern pointer __GetServerClient(void); /* This could be any number that - doesn't conflict with existing - client values. */ - static int _fs_load_glyphs(pointer client, FontPtr pfont, Bool range_flag, unsigned int nchars, int item_size, unsigned char *data) @@ -2392,7 +2398,7 @@ fs_read_list(FontPathElementPtr fpe, FSBlockDataPtr blockrec) err = BadFontName; break; } - err = AddFontNamesName(blist->names, data, length); + err = xfont2_add_font_names_name(blist->names, data, length); if (err != Successful) break; data += length; @@ -2621,7 +2627,7 @@ fs_read_list_info(FontPathElementPtr fpe, FSBlockDataPtr blockrec) /* disable this font server until we've processed this response */ _fs_unmark_block (conn, FS_COMPLETE_REPLY); - FD_CLR(conn->fs_fd, &_fs_fd_mask); + conn_stop_listening(conn); done: _fs_done_read (conn, rep->length << 2); return err; @@ -2724,7 +2730,7 @@ fs_next_list_with_info(pointer client, FontPathElementPtr fpe, *numFonts = binfo->remaining; /* Restart reply processing from this font server */ - FD_SET(conn->fs_fd, &_fs_fd_mask); + conn_start_listening(conn); if (fs_reply_ready (conn)) _fs_mark_block (conn, FS_COMPLETE_REPLY); @@ -2887,7 +2893,7 @@ _fs_check_connect (FSFpePtr conn) switch (ret) { case FSIO_READY: conn->fs_fd = _FontTransGetConnectionNumber (conn->trans_conn); - FD_SET (conn->fs_fd, &_fs_fd_mask); + conn_start_listening(conn); break; case FSIO_BLOCK: break; @@ -3228,7 +3234,7 @@ _fs_close_server (FSFpePtr conn) } if (conn->fs_fd >= 0) { - FD_CLR (conn->fs_fd, &_fs_fd_mask); + conn_stop_listening(conn); conn->fs_fd = -1; } conn->fs_conn_state = FS_CONN_UNCONNECTED; @@ -3362,7 +3368,7 @@ _fs_start_reconnect (FSFpePtr conn) static FSFpePtr -_fs_init_conn (const char *servername) +_fs_init_conn (const char *servername, FontPathElementPtr fpe) { FSFpePtr conn; @@ -3377,6 +3383,7 @@ _fs_init_conn (const char *servername) conn->servername = (char *) (conn + 1); conn->fs_conn_state = FS_CONN_UNCONNECTED; conn->fs_fd = -1; + conn->fpe = fpe; strcpy (conn->servername, servername); return conn; } @@ -3395,22 +3402,27 @@ _fs_free_conn (FSFpePtr conn) * called at server init time */ +static const xfont2_fpe_funcs_rec fs_fpe_funcs = { + .version = XFONT2_FPE_FUNCS_VERSION, + .name_check = fs_name_check, + .init_fpe = fs_init_fpe, + .free_fpe = fs_free_fpe, + .reset_fpe = fs_reset_fpe, + .open_font = fs_open_font, + .close_font = fs_close_font, + .list_fonts = fs_list_fonts, + .start_list_fonts_with_info = fs_start_list_with_info, + .list_next_font_with_info = fs_next_list_with_info, + .wakeup_fpe = fs_wakeup, + .client_died = fs_client_died, + .load_glyphs = _fs_load_glyphs, + .start_list_fonts_and_aliases = (StartLaFunc) 0, + .list_next_font_or_alias = (NextLaFunc) 0, + .set_path_hook = (SetPathFunc) 0 +}; + void fs_register_fpe_functions(void) { - RegisterFPEFunctions(fs_name_check, - fs_init_fpe, - fs_free_fpe, - fs_reset_fpe, - fs_open_font, - fs_close_font, - fs_list_fonts, - fs_start_list_with_info, - fs_next_list_with_info, - fs_wakeup, - fs_client_died, - _fs_load_glyphs, - NULL, - NULL, - NULL); + register_fpe_funcs(&fs_fpe_funcs); } |