Load a local font DLL
#include <font_api.h> fontdll_t PfAttachLocalDll( char const * options, char const * schema );
Use the DLL_FONT_SERVER schema for processes that need to allocate sufficient resources to act as a default font server. This schema loads a local server instance that can be used as an external server by other applications (that is, it appears in /def/phfont). Use NULL to load a local server instance that cannot be used by other applications.
The string referenced by schema may not exceed DLL_MAX_OPTION_NAME bytes, including the terminating NULL.
font
This function loads a local font DLL, which eliminates message passing to an external font server. Options are processed and applied before the server instance is activated. The options are the same as those supported by the font server, though some options may not be relevant to a DLL instance of the font server.
/* An example of how to run a root level font server device. */ #include <signal.h> #include <font_api.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <sys/siginfo.h> #include <atomic.h> #include <sys/procmgr.h> #include <unistd.h> static volatile unsigned restart = 0; void restart_fontserver(int sig) { atomic_add(&restart, 1); } static volatile unsigned stop = 0; void stop_fontserver(int sig) { atomic_add(&stop, 1); } /* * Install useful signal handlers. */ static int TrapSignals(void) { int sig; #if defined(__linux__) || defined(__CYGWIN__) signal(SIGTERM, SIG_DFL); signal(SIGQUIT, SIG_DFL); //signal(SIGINT, SIG_DFL); signal(SIGHUP, SIG_DFL); #else for(sig = _SIGMIN; sig <= _SIGMAX; ++sig) { if(sig == SIGTERM) signal(sig, stop_fontserver); else if(sig == SIGINT || sig == SIGHUP) signal(sig, SIG_IGN); else if(sig == SIGUSR2) signal(sig, restart_fontserver); else signal(sig, SIG_DFL); } #endif return(0); } int main(int argc, char * argv[]) { fontdll_t dll; /* Make oneself a daemon. */ procmgr_daemon(EXIT_SUCCESS, PROCMGR_DAEMON_NOCHDIR | PROCMGR_DAEMON_NODEVNULL | PROCMGR_DAEMON_KEEPUMASK | PROCMGR_DAEMON_NOCLOSE); /* Process any command line arguments here, if you so desire. */ /* Retrieve font dll context. */ if((dll = PfAttachLocalDll(NULL, DLL_FONT_SERVER)) == NULL) { perror("Unable to open font DLL"); return(EXIT_FAILURE); } else { /* Set up signals as per documentation from PfAttachServerDll. */ TrapSignals(); /* Initialize root level font server device instance. */ if(PfAttachServerDll(dll, 12, NULL) == -1) { perror("Unable to start server thread"); PfDetachLocalDll(dll); return(EXIT_FAILURE); } else { int exit = 0; /* Wait for font server device to exit. */ do { if(PfWaitOnServerDll(dll) == -1) { if((errno = EINTR) && restart) { if(PfRestartServerDll(dll) == -1) { perror("Unable to restart server thread"); exit = 1; } else atomic_sub(&restart, 1); } else if((errno = EINTR) && stop) exit = 1; } else exit = 1; } while(!exit); } /* Clean everything up tidy like. */ PfDetachLocalDll(dll); } return(EXIT_SUCCESS); }
Photon
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | No |
Thread | Yes |
Fonts chapter of the Photon Programmer's Guide