Changeset bc0d32 in git for Singular/si_signals.h


Ignore:
Timestamp:
Apr 9, 2013, 3:33:02 PM (11 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'b52fc4b2495505785981d640dcf7eb3e456778ef')
Children:
bdda8c2a271e7650c11462d22c70cd15d21d34f1
Parents:
f8565ac2b56eae4e46fb63670efa1bc402ae3628
git-author:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2013-04-09 15:33:02+02:00
git-committer:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2013-04-09 15:33:47+02:00
Message:
add: handling signals in systyem calls
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/si_signals.h

    rf8565a rbc0d32  
    44/*
    55* ABSTRACT: wrappijng signal-interuptable system calls
    6 * AUTHOR: Alexander Dreyer, The PolyBoRi Team
     6* AUTHOR: Alexander Dreyer, The PolyBoRi Team, 2013
    77*/
    88
     
    1818#include <sys/socket.h>
    1919#include <time.h>
     20#include <stdio.h>
     21#include <semaphore.h>
     22#include <stdarg.h>
    2023
    2124#ifndef SINGULAR_SI_SIGNALS_H
    2225#define SINGULAR_SI_SIGNALS_H
    2326
    24 #define SI_EINTR_SAVE_FUNC(return_type, func, decl, args)       \
    25 inline return_type si_##func decl        \
     27#define SI_EINTR_SAVE_FUNC_TEMPLATE(return_type, newfunc, func, decl, args, err_domain) \
     28static inline return_type newfunc decl   \
    2629{                                        \
    2730  int res = -1;                          \
     
    2932  {                                      \
    3033    res = func args;                     \
    31   } while((res < 0) && (errno == EINTR));\
     34  } while((res err_domain) && (errno == EINTR));\
    3235  return res;                            \
    3336}
    3437
     38#define SI_EINTR_SAVE_FUNC(return_type, func, decl, args) \
     39  SI_EINTR_SAVE_FUNC_TEMPLATE(return_type, si_##func, func, decl, args, < 0)
     40
     41#define SI_EINTR_SAVE_SCANF(return_type, func, decl, args) \
     42  SI_EINTR_SAVE_FUNC_TEMPLATE(return_type, si_##func, func, decl, args, == EOF)
    3543
    3644SI_EINTR_SAVE_FUNC(int, select,
     
    4048                   )
    4149
     50#ifdef HAVE_PSELECT
    4251SI_EINTR_SAVE_FUNC(int, pselect,
    4352                   (int nfds, fd_set *readfds, fd_set *writefds,
     
    4655                   (nfds, readfds, writefds, exceptfds, timeout,sigmask)
    4756                   )
     57#endif
    4858
    4959SI_EINTR_SAVE_FUNC(pid_t, wait, (int *status), (status))
     
    5161                   (pid, status, options))
    5262
    53 SI_EINTR_SAVE_FUNC(int, waitid,
    54                    (idtype_t idtype, id_t id, siginfo_t *infop, int options),
    55                    (idtype, id, infop, options))
     63//SI_EINTR_SAVE_FUNC(int, waitid,
     64//                   (idtype_t idtype, id_t id, siginfo_t *infop, int options),
     65//                   (idtype, id, infop, options))
    5666
    5767SI_EINTR_SAVE_FUNC(ssize_t,  read, (int fd, void *buf, size_t count),
     
    6878SI_EINTR_SAVE_FUNC(ssize_t, writev, (int fd, const struct iovec *iov, int iovcnt),
    6979                   (fd, iov, iovcnt) )
    70  
    71 SI_EINTR_SAVE_FUNC(int, open, (const char *pathname, int flags),
    72                    (pathname, flags))
    73 
    74 SI_EINTR_SAVE_FUNC(int, open, (const char *pathname, int flags, mode_t mode),
    75                    (pathname, flags, mode))
     80
     81SI_EINTR_SAVE_FUNC_TEMPLATE(int, si_open1, open, (const char *pathname, int flags),
     82                            (pathname, flags), < 0)
     83SI_EINTR_SAVE_FUNC_TEMPLATE(int, si_open2, open,
     84                            (const char *pathname, int flags, mode_t mode),
     85                            (pathname, flags, mode), < 0)
     86
     87/* Enulate overloading usung preprocessor (we need to be C-compatible) */
     88#define SI_GET_FIFTH(_4,_3, _2, _1, N, ...) N
     89#define si_open(...) SI_GET_FIFTH(X,##__VA_ARGS__, si_open2, si_open1)(__VA_ARGS__)
     90
     91SI_EINTR_SAVE_FUNC(int, creat, (const char *pathname, mode_t mode),
     92                   (pathname, mode))
     93
    7694
    7795SI_EINTR_SAVE_FUNC(int, close, (int fd), (fd))
     
    8098                   (int sockfd, struct sockaddr *addr, socklen_t *addrlen),
    8199                   (sockfd, addr, addrlen))
    82                    
     100
    83101SI_EINTR_SAVE_FUNC(int, connect,
    84102                   (int sockfd, const struct sockaddr *addr, socklen_t addrlen),
    85103                   (sockfd, addr, addrlen))
    86104
    87 SI_EINTR_SAVE_FUNC(int, nanosleep,
    88                    (const struct timespec *req, struct timespec *rem),
    89                    (req, rem))
    90 
    91 inline unsigned int si_sleep(unsigned int seconds)
     105/* @note: We respect that the user may explictely deactivate the
     106 * restart feature by setting the second argumetn to NULL.
     107 */
     108static inline int
     109si_nanosleep(const struct timespec *req, struct timespec *rem) {
     110
     111  int res = -1;
     112  do
     113  {
     114    res = nanosleep(req, rem);
     115  } while((rem != NULL) && (res < 0) && (errno == EINTR));
     116  return res;   
     117}
     118
     119static inline unsigned int
     120si_sleep(unsigned int seconds)
    92121{
    93122  do
     
    98127}
    99128
    100 // still todo: read,write,open   in ./omalloc/Misc/dlmalloc
    101 /// TODO: wrap and replace the following system calls: from man 7 signal
    102 /// ???fread, fwrite, fopen, fdopen, popen, fclose
    103 
    104 
    105 ///
    106 /// regardless of the use of SA_RESTART:
    107 ///
    108 ///   nanosleep(2), and usleep(3).
    109 /// sleep(3)
    110 
    111 
    112 
     129SI_EINTR_SAVE_FUNC(int, dup, (int oldfd), (oldfd))
     130SI_EINTR_SAVE_FUNC(int, dup2, (int oldfd, int newfd), (oldfd, newfd))
     131//SI_EINTR_SAVE_FUNC(int, dup3, (int oldfd, int newfd, int flags),
     132//                 (oldfd, newfd, flags))
     133
     134SI_EINTR_SAVE_FUNC(int, unlink, (const char *pathname), (pathname))
     135
     136SI_EINTR_SAVE_SCANF(int, vscanf,
     137                   (const char *format, va_list ap),
     138                   (format, ap))
     139
     140static inline
     141int si_scanf(const char *format, ...)
     142{
     143  va_list argptr;
     144  va_start(argptr, format);
     145  int res = si_vscanf(format, argptr);
     146  va_end(argptr);
     147  return res;
     148}
     149
     150SI_EINTR_SAVE_SCANF(int, vfscanf,
     151                   (FILE *stream, const char *format, va_list ap),
     152                   (stream, format, ap))
     153
     154static inline int
     155si_fscanf(FILE *stream, const char *format, ...)
     156{
     157  va_list argptr;
     158  va_start(argptr, format);
     159  int res = si_vfscanf(stream, format, argptr);
     160  va_end(argptr);
     161  return res;
     162}
     163
     164SI_EINTR_SAVE_SCANF(int, vsscanf,
     165                   (const char *str, const char *format, va_list ap),
     166                   (str, format, ap))
     167
     168static inline int
     169si_sscanf(const char *str, const char *format, ...)
     170{
     171  va_list argptr;
     172  va_start(argptr, format);
     173  int res = si_vsscanf(str, format, argptr);
     174  va_end(argptr);
     175  return res;
     176}
     177
     178SI_EINTR_SAVE_FUNC(int, stat, (const char *path, struct stat *buf),
     179                   (path, buf))
     180SI_EINTR_SAVE_FUNC(int, fstat, (int fd, struct stat *buf),
     181                   (fd, buf))
     182SI_EINTR_SAVE_FUNC(int, lstat, (const char *path, struct stat *buf),
     183                   (path, buf))
     184
     185
     186SI_EINTR_SAVE_FUNC(int, sigaction,
     187                   (int signum, const struct sigaction *act,
     188                    struct sigaction *oldact),
     189                   (signum, act, oldact))
     190
     191
     192#ifdef HAVE_SIGINTERRUPT
     193SI_EINTR_SAVE_FUNC(int, siginterrupt, (int sig, int flag),
     194                   (sig, flag))
     195#else
     196#define si_siginterrupt(arg1, arg2)
     197#endif
     198
     199
     200SI_EINTR_SAVE_FUNC(int, sem_wait, (sem_t *sem), (sem))
     201SI_EINTR_SAVE_FUNC(int, sem_trywait, (sem_t *sem), (sem))
     202//SI_EINTR_SAVE_FUNC(int, sem_timedwait,
     203//                   (sem_t *sem, const struct timespec *abs_timeout),
     204//                   (sem, abs_timeout))
    113205
    114206
Note: See TracChangeset for help on using the changeset viewer.