ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/State.xs
(Generate patch)

Comparing Coro/Coro/State.xs (file contents):
Revision 1.241 by root, Mon Jul 21 02:39:15 2008 UTC vs.
Revision 1.243 by root, Sat Aug 30 03:07:46 2008 UTC

1623 else 1623 else
1624 coro->slot->runops = RUNOPS_DEFAULT; 1624 coro->slot->runops = RUNOPS_DEFAULT;
1625 } 1625 }
1626} 1626}
1627 1627
1628static int
1629coro_gensub_free (pTHX_ SV *sv, MAGIC *mg)
1630{
1631 AV *padlist;
1632 AV *av = (AV *)mg->mg_obj;
1633
1634 abort ();
1635
1636 return 0;
1637}
1638
1639static MGVTBL coro_gensub_vtbl = {
1640 0, 0, 0, 0,
1641 coro_gensub_free
1642};
1643
1628MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_ 1644MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_
1629 1645
1630PROTOTYPES: DISABLE 1646PROTOTYPES: DISABLE
1631 1647
1632BOOT: 1648BOOT:
1890force_cctx () 1906force_cctx ()
1891 CODE: 1907 CODE:
1892 struct coro *coro = SvSTATE (coro_current); 1908 struct coro *coro = SvSTATE (coro_current);
1893 coro->cctx->idle_sp = 0; 1909 coro->cctx->idle_sp = 0;
1894 1910
1895MODULE = Coro::State PACKAGE = Coro
1896
1897BOOT:
1898{
1899 int i;
1900
1901 av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE);
1902 sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE);
1903 sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE);
1904
1905 coro_current = coro_get_sv (aTHX_ "Coro::current", FALSE);
1906 SvREADONLY_on (coro_current);
1907
1908 coro_stash = gv_stashpv ("Coro", TRUE);
1909
1910 newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (PRIO_MAX));
1911 newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (PRIO_HIGH));
1912 newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (PRIO_NORMAL));
1913 newCONSTSUB (coro_stash, "PRIO_LOW", newSViv (PRIO_LOW));
1914 newCONSTSUB (coro_stash, "PRIO_IDLE", newSViv (PRIO_IDLE));
1915 newCONSTSUB (coro_stash, "PRIO_MIN", newSViv (PRIO_MIN));
1916
1917 for (i = PRIO_MAX - PRIO_MIN + 1; i--; )
1918 coro_ready[i] = newAV ();
1919
1920 {
1921 SV *sv = perl_get_sv ("Coro::API", TRUE);
1922 perl_get_sv ("Coro::API", TRUE); /* silence 5.10 warning */
1923
1924 coroapi.schedule = api_schedule;
1925 coroapi.cede = api_cede;
1926 coroapi.cede_notself = api_cede_notself;
1927 coroapi.ready = api_ready;
1928 coroapi.is_ready = api_is_ready;
1929 coroapi.nready = &coro_nready;
1930 coroapi.current = coro_current;
1931
1932 GCoroAPI = &coroapi;
1933 sv_setiv (sv, (IV)&coroapi);
1934 SvREADONLY_on (sv);
1935 }
1936}
1937
1938void
1939_set_current (SV *current)
1940 PROTOTYPE: $
1941 CODE:
1942 SvREFCNT_dec (SvRV (coro_current));
1943 SvRV_set (coro_current, SvREFCNT_inc (SvRV (current)));
1944
1945void
1946_set_readyhook (SV *hook)
1947 PROTOTYPE: $
1948 CODE:
1949 LOCK;
1950 SvREFCNT_dec (coro_readyhook);
1951 coro_readyhook = SvOK (hook) ? newSVsv (hook) : 0;
1952 UNLOCK;
1953
1954int
1955prio (Coro::State coro, int newprio = 0)
1956 ALIAS:
1957 nice = 1
1958 CODE:
1959{
1960 RETVAL = coro->prio;
1961
1962 if (items > 1)
1963 {
1964 if (ix)
1965 newprio = coro->prio - newprio;
1966
1967 if (newprio < PRIO_MIN) newprio = PRIO_MIN;
1968 if (newprio > PRIO_MAX) newprio = PRIO_MAX;
1969
1970 coro->prio = newprio;
1971 }
1972}
1973 OUTPUT:
1974 RETVAL
1975
1976SV *
1977ready (SV *self)
1978 PROTOTYPE: $
1979 CODE:
1980 RETVAL = boolSV (api_ready (self));
1981 OUTPUT:
1982 RETVAL
1983
1984int
1985nready (...)
1986 PROTOTYPE:
1987 CODE:
1988 RETVAL = coro_nready;
1989 OUTPUT:
1990 RETVAL
1991
1992void 1911void
1993throw (Coro::State self, SV *throw = &PL_sv_undef) 1912throw (Coro::State self, SV *throw = &PL_sv_undef)
1994 PROTOTYPE: $;$ 1913 PROTOTYPE: $;$
1995 CODE: 1914 CODE:
1996 SvREFCNT_dec (self->throw); 1915 SvREFCNT_dec (self->throw);
2010 SV **dst = ix ? (SV **)&self->slot->defav : (SV **)&self->slot->defsv; 1929 SV **dst = ix ? (SV **)&self->slot->defav : (SV **)&self->slot->defsv;
2011 1930
2012 SV *tmp = *src; *src = *dst; *dst = tmp; 1931 SV *tmp = *src; *src = *dst; *dst = tmp;
2013 } 1932 }
2014 1933
1934MODULE = Coro::State PACKAGE = Coro
1935
1936BOOT:
1937{
1938 int i;
1939
1940 av_async_pool = coro_get_av (aTHX_ "Coro::async_pool", TRUE);
1941 sv_pool_rss = coro_get_sv (aTHX_ "Coro::POOL_RSS" , TRUE);
1942 sv_pool_size = coro_get_sv (aTHX_ "Coro::POOL_SIZE" , TRUE);
1943
1944 coro_current = coro_get_sv (aTHX_ "Coro::current", FALSE);
1945 SvREADONLY_on (coro_current);
1946
1947 coro_stash = gv_stashpv ("Coro", TRUE);
1948
1949 newCONSTSUB (coro_stash, "PRIO_MAX", newSViv (PRIO_MAX));
1950 newCONSTSUB (coro_stash, "PRIO_HIGH", newSViv (PRIO_HIGH));
1951 newCONSTSUB (coro_stash, "PRIO_NORMAL", newSViv (PRIO_NORMAL));
1952 newCONSTSUB (coro_stash, "PRIO_LOW", newSViv (PRIO_LOW));
1953 newCONSTSUB (coro_stash, "PRIO_IDLE", newSViv (PRIO_IDLE));
1954 newCONSTSUB (coro_stash, "PRIO_MIN", newSViv (PRIO_MIN));
1955
1956 for (i = PRIO_MAX - PRIO_MIN + 1; i--; )
1957 coro_ready[i] = newAV ();
1958
1959 {
1960 SV *sv = perl_get_sv ("Coro::API", TRUE);
1961 perl_get_sv ("Coro::API", TRUE); /* silence 5.10 warning */
1962
1963 coroapi.schedule = api_schedule;
1964 coroapi.cede = api_cede;
1965 coroapi.cede_notself = api_cede_notself;
1966 coroapi.ready = api_ready;
1967 coroapi.is_ready = api_is_ready;
1968 coroapi.nready = &coro_nready;
1969 coroapi.current = coro_current;
1970
1971 GCoroAPI = &coroapi;
1972 sv_setiv (sv, (IV)&coroapi);
1973 SvREADONLY_on (sv);
1974 }
1975}
1976
1977void
1978_set_current (SV *current)
1979 PROTOTYPE: $
1980 CODE:
1981 SvREFCNT_dec (SvRV (coro_current));
1982 SvRV_set (coro_current, SvREFCNT_inc (SvRV (current)));
1983
1984void
1985_set_readyhook (SV *hook)
1986 PROTOTYPE: $
1987 CODE:
1988 LOCK;
1989 SvREFCNT_dec (coro_readyhook);
1990 coro_readyhook = SvOK (hook) ? newSVsv (hook) : 0;
1991 UNLOCK;
1992
1993int
1994prio (Coro::State coro, int newprio = 0)
1995 ALIAS:
1996 nice = 1
1997 CODE:
1998{
1999 RETVAL = coro->prio;
2000
2001 if (items > 1)
2002 {
2003 if (ix)
2004 newprio = coro->prio - newprio;
2005
2006 if (newprio < PRIO_MIN) newprio = PRIO_MIN;
2007 if (newprio > PRIO_MAX) newprio = PRIO_MAX;
2008
2009 coro->prio = newprio;
2010 }
2011}
2012 OUTPUT:
2013 RETVAL
2014
2015SV *
2016ready (SV *self)
2017 PROTOTYPE: $
2018 CODE:
2019 RETVAL = boolSV (api_ready (self));
2020 OUTPUT:
2021 RETVAL
2022
2023int
2024nready (...)
2025 PROTOTYPE:
2026 CODE:
2027 RETVAL = coro_nready;
2028 OUTPUT:
2029 RETVAL
2030
2015# for async_pool speedup 2031# for async_pool speedup
2016void 2032void
2017_pool_1 (SV *cb) 2033_pool_1 (SV *cb)
2018 CODE: 2034 CODE:
2019{ 2035{
2083 api_trace (coro_current, 0); 2099 api_trace (coro_current, 0);
2084 2100
2085 av_push (av_async_pool, newSVsv (coro_current)); 2101 av_push (av_async_pool, newSVsv (coro_current));
2086} 2102}
2087 2103
2104#if 0
2105
2106void
2107_generator_call (...)
2108 PROTOTYPE: @
2109 PPCODE:
2110 fprintf (stderr, "call %p\n", CvXSUBANY(cv).any_ptr);
2111 xxxx
2112 abort ();
2113
2114SV *
2115gensub (SV *sub, ...)
2116 PROTOTYPE: &;@
2117 CODE:
2118{
2119 struct coro *coro;
2120 MAGIC *mg;
2121 CV *xcv;
2122 CV *ncv = (CV *)newSV_type (SVt_PVCV);
2123 int i;
2124
2125 CvGV (ncv) = CvGV (cv);
2126 CvFILE (ncv) = CvFILE (cv);
2127
2128 Newz (0, coro, 1, struct coro);
2129 coro->args = newAV ();
2130 coro->flags = CF_NEW;
2131
2132 av_extend (coro->args, items - 1);
2133 for (i = 1; i < items; i++)
2134 av_push (coro->args, newSVsv (ST (i)));
2135
2136 CvISXSUB_on (ncv);
2137 CvXSUBANY (ncv).any_ptr = (void *)coro;
2138
2139 xcv = GvCV (gv_fetchpv ("Coro::_generator_call", 0, SVt_PVCV));
2140
2141 CvXSUB (ncv) = CvXSUB (xcv);
2142 CvANON_on (ncv);
2143
2144 mg = sv_magicext ((SV *)ncv, 0, CORO_MAGIC_type_state, &coro_gensub_vtbl, (char *)coro, 0);
2145 RETVAL = newRV_noinc ((SV *)ncv);
2146}
2147 OUTPUT:
2148 RETVAL
2149
2150#endif
2151
2088 2152
2089MODULE = Coro::State PACKAGE = Coro::AIO 2153MODULE = Coro::State PACKAGE = Coro::AIO
2090 2154
2091SV * 2155SV *
2092_get_state () 2156_get_state ()

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines